dsh-mnemon 0.5.27 → 0.5.29

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
@@ -30,6 +30,14 @@ window.__ModuleLoader__.load({
30
30
  const MNEMON_WRITE_CHANNEL = "/dsh-mnemon-write";
31
31
  const MNEMON_PACK_CHANNEL = "/dsh-mnemon-pack";
32
32
  const MNEMON_SYNC_CHANNEL = "/dsh-mnemon-sync";
33
+ /**
34
+ * The credential environment variable the sync channel reads before its stored
35
+ * token. The name travels to the browser so the settings form can tell the user
36
+ * which variable wins; the value never does.
37
+ */
38
+ const MNEMON_SYNC_TOKEN_ENV = "MNEMON_SYNC_GIT_TOKEN";
39
+ const MNEMON_SYNC_DEFAULT_AUTHOR_NAME = "dsh-mnemon sync";
40
+ const MNEMON_SYNC_DEFAULT_AUTHOR_EMAIL = "mnemon@localhost";
33
41
  const MNEMON_SETTINGS_CHANNEL = "/dsh-mnemon-settings";
34
42
  /**
35
43
  * Reconciliation is the only channel that changes memory after a human read it:
@@ -269,7 +277,10 @@ window.__ModuleLoader__.load({
269
277
  }
270
278
  async call(channel, endpoint, payload) {
271
279
  const response = await callMnemonRpc(this.connection, channel, endpoint, payload);
272
- if (!response.ok) throw new Error(response.error.message);
280
+ if (!response.ok) {
281
+ const reason = response.error.details?.reason;
282
+ throw Object.assign(new Error(response.error.message), typeof reason === "string" ? { reason } : {});
283
+ }
273
284
  return response.value;
274
285
  }
275
286
  scoped(payload = {}) {
@@ -662,7 +673,7 @@ window.__ModuleLoader__.load({
662
673
  }
663
674
  //#endregion
664
675
  //#region \0dsh-mnemon-css:/home/runner/work/dsh-mnemon/dsh-mnemon/src/client/MnemonSettingsCard.module.css.mjs
665
- const css$13 = "._v_wrq_page{box-sizing:border-box;width:100%;min-width:0;color:var(--dsw-alias-label-primary);flex-direction:column;gap:32px;font-family:inherit;display:flex}._v_wrq_surface{color:var(--dsw-alias-label-primary)}:where(._v_wrq_page,._v_wrq_surface) *,:where(._v_wrq_page,._v_wrq_surface) :before,:where(._v_wrq_page,._v_wrq_surface) :after{box-sizing:border-box}:where(._v_wrq_page,._v_wrq_surface) :where(button,input,select,textarea){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_section{flex-direction:column;gap:4px;min-width:0;display:flex}._v_wrq_sectionHeading{grid-template-columns:minmax(0,1fr) auto;align-items:start;column-gap:12px;min-width:0;display:grid}._v_wrq_sectionHeading h2{grid-column:1;margin:0;font-size:14px;font-weight:500;line-height:20px}._v_wrq_sectionHeading p{max-width:66ch;color:var(--dsw-alias-label-tertiary);grid-column:1;margin:2px 0 0;font-size:12px;line-height:18px}._v_wrq_sectionHeading ._v_wrq_miniSpinner{grid-area:1/2}._v_wrq_sectionHeading>._v_wrq_boardLinks{grid-column:1;padding-top:6px}._v_wrq_componentListNote{max-width:72ch;color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:18px}._v_wrq_appliesNow{border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-xs);color:var(--dsw-alias-label-secondary);white-space:nowrap;grid-area:1/2;align-self:center;padding:1px 6px;font-size:11px;line-height:16px}._v_wrq_rows{flex-direction:column;min-width:0;display:flex}._v_wrq_settingRow,._v_wrq_toggleRow{border-bottom:.5px solid var(--dsw-alias-border-l2);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 16px;min-width:0;padding:14px 0;display:flex;position:relative}._v_wrq_rows>:last-child,._v_wrq_rows>._v_wrq_packRow:last-child>._v_wrq_settingRow{border-bottom:0}._v_wrq_rows>._v_wrq_packRow:last-child{padding-bottom:0}._v_wrq_settingRow[data-stacked]{flex-direction:column;align-items:stretch}._v_wrq_settingCopy{flex-direction:column;flex:1 1 0;gap:2px;min-width:min(240px,100%);display:flex}._v_wrq_settingCopy strong,._v_wrq_settingCopy label{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}._v_wrq_settingCopy small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_settingCopy code{font-family:var(--ds-font-family-code,ui-monospace, monospace)}._v_wrq_settingControl{flex:none;justify-content:flex-end;align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_settingRow[data-stacked] ._v_wrq_settingControl{flex:auto;justify-content:stretch}._v_wrq_switch{flex:none}._v_wrq_rowNote{min-width:0;color:var(--dsw-alias-label-secondary);flex-wrap:wrap;align-items:center;gap:4px 8px;padding-top:4px;font-size:12px;line-height:18px;display:flex}._v_wrq_groupCallout{margin:8px 0 4px}._v_wrq_boardSection{container-type:inline-size}._v_wrq_board{flex-direction:column;min-width:0;margin-top:10px;display:flex}._v_wrq_boardProblem{margin:0 0 4px}._v_wrq_boardLoading{min-height:40px;color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;margin:0;font-size:13px;line-height:20px;display:flex}._v_wrq_boardGroup{flex-direction:column;min-width:0;padding-top:14px;display:flex}._v_wrq_boardGroupHead{justify-content:space-between;align-items:baseline;gap:8px;min-width:0;display:flex}._v_wrq_boardGroupHead h3{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;font-weight:500;line-height:18px}._v_wrq_boardGroupHead span{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:12px;line-height:18px}._v_wrq_pageLink{appearance:none;border-radius:var(--dsw-radius-sm);max-width:100%;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;padding:0;display:inline-flex}._v_wrq_pageLink>span{overflow-wrap:anywhere;min-width:0}._v_wrq_pageLink:hover>span{text-underline-offset:3px;text-decoration:underline}._v_wrq_settingCopy ._v_wrq_pageLink{width:fit-content;color:var(--dsw-alias-label-primary);font-size:14px;line-height:22px}._v_wrq_boardIconButton{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;flex:none;place-items:center;padding:0;display:inline-grid}._v_wrq_boardIconButton:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._v_wrq_boardLinks{flex-wrap:wrap;align-items:center;gap:4px;min-width:0;padding-top:4px;display:flex}._v_wrq_boardLink{appearance:none;border:.5px solid var(--dsw-alias-border-l3);max-width:100%;color:var(--dsw-alias-label-tertiary);font:inherit;white-space:nowrap;cursor:pointer;background:0 0;border-radius:999px;align-items:center;gap:4px;padding:0 8px;font-size:11px;line-height:18px;transition:color .12s,border-color .12s;display:inline-flex}._v_wrq_boardLink[data-on]{color:var(--dsw-alias-label-secondary)}._v_wrq_boardLink:hover{border-color:var(--dsw-alias-border-l4);color:var(--dsw-alias-label-primary)}._v_wrq_boardLink>svg{flex:none}._v_wrq_boardLinksLabel{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._v_wrq_pageLink:focus-visible,._v_wrq_boardIconButton:focus-visible,._v_wrq_boardLink:focus-visible,._v_wrq_detailsBack:focus-visible,._v_wrq_boardSearch:focus-within{box-shadow:0 0 0 2px var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline:none}._v_wrq_boardSearch{border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);min-width:0;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-base);align-items:center;gap:8px;margin:12px 0 0;padding:0 10px;display:flex}._v_wrq_boardSearch input{min-width:0;height:32px;color:var(--dsw-alias-label-primary);font:inherit;background:0 0;border:0;outline:none;flex:1;font-size:13px}._v_wrq_detailsDialog{width:min(560px,100%);max-height:100%}._v_wrq_detailsScroll{overscroll-behavior:contain;min-height:0;overflow-y:auto}._v_wrq_detailsBody{flex-direction:column;gap:16px;min-width:0;display:flex}._v_wrq_detailsHead{flex-direction:column;gap:6px;min-width:0;display:flex}._v_wrq_detailsHeadLine{flex-wrap:wrap;align-items:center;gap:8px 10px;min-width:0;display:flex}._v_wrq_detailsPackage{min-width:0;color:var(--dsw-alias-label-tertiary);font-family:var(--ds-font-family-code,ui-monospace, monospace);text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:16px;overflow:hidden}._v_wrq_detailsControl{align-items:center;margin-left:auto;display:flex}._v_wrq_detailsSection{border-top:.5px solid var(--dsw-alias-border-l2);flex-direction:column;gap:8px;min-width:0;padding-top:14px;display:flex}._v_wrq_detailsSection>h3{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;font-weight:500;line-height:18px}._v_wrq_detailsRelations{grid-template-columns:max-content minmax(0,1fr);gap:6px 16px;min-width:0;margin:0;font-size:13px;line-height:20px;display:grid}._v_wrq_detailsRelations>div{display:contents}._v_wrq_detailsRelations dt{color:var(--dsw-alias-label-secondary)}._v_wrq_detailsRelations dd{min-width:0;color:var(--dsw-alias-label-primary);flex-wrap:wrap;gap:4px 12px;margin:0;display:flex}._v_wrq_detailsName{appearance:none;color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:0;display:inline-flex}._v_wrq_detailsName:hover>span{text-underline-offset:3px;text-decoration:underline}._v_wrq_detailsBack{appearance:none;border-radius:var(--dsw-radius-sm);width:fit-content;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:2px;margin:-4px 0 -6px -4px;padding:2px 4px;font-size:12px;line-height:18px;display:inline-flex}._v_wrq_detailsBack:hover{color:var(--dsw-alias-label-primary)}._v_wrq_detailsMissing{color:var(--dsw-alias-label-secondary)}._v_wrq_detailsEffect{color:var(--dsw-alias-label-secondary);margin:0;font-size:12px;line-height:18px}._v_wrq_detailsBody ._v_wrq_optionsPanel{background:0 0;border-radius:0;margin:0;padding:0}._v_wrq_componentRowPage{flex-direction:column;gap:16px;min-width:0;display:flex}._v_wrq_detailsContributed{border-top:.5px solid var(--dsw-alias-border-l2);flex-direction:column;gap:16px;min-width:0;padding-top:14px;display:flex}._v_wrq_panelSection{flex-direction:column;gap:8px;min-width:0;display:flex}._v_wrq_panelHeading{grid-template-columns:minmax(0,1fr) auto;column-gap:12px;min-width:0;display:grid}._v_wrq_panelHeading h3{color:var(--dsw-alias-label-primary);margin:0;font-size:13px;font-weight:500;line-height:20px}._v_wrq_panelHeading p{color:var(--dsw-alias-label-tertiary);grid-column:1;margin:2px 0 0;font-size:12px;line-height:18px}._v_wrq_panelHeading ._v_wrq_miniSpinner{grid-area:1/2}._v_wrq_panelNote{color:var(--dsw-alias-label-secondary);margin:0;font-size:12px;line-height:18px}._v_wrq_panelActions{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px;min-width:0;padding-top:8px;display:flex}._v_wrq_panelActions>span{min-width:0;color:var(--dsw-alias-label-secondary);flex:1;font-size:12px;line-height:18px}._v_wrq_panelActions>span._v_wrq_panelError,._v_wrq_panelError{color:var(--dsw-alias-state-error-primary)}._v_wrq_rows>._v_wrq_panelActions{border-bottom:.5px solid var(--dsw-alias-border-l2);padding:10px 0}._v_wrq_rows>._v_wrq_panelNote{padding:8px 0}._v_wrq_panelError{margin:0;font-size:12px;line-height:18px}._v_wrq_boardRow{border-bottom:.5px solid var(--dsw-alias-border-l2);flex-direction:column;min-width:0;padding:14px 0;display:flex}._v_wrq_boardRowLine{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 16px;min-width:0;display:flex}._v_wrq_boardGroup>._v_wrq_boardRow:last-child,._v_wrq_boardOthersList>._v_wrq_boardRow:last-child{border-bottom:0;padding-bottom:4px}._v_wrq_boardMain{padding-top:12px}._v_wrq_boardEmpty{color:var(--dsw-alias-label-tertiary);margin:0;padding:12px 0 4px;font-size:12px;line-height:18px}._v_wrq_boardOthers{flex-direction:column;min-width:0;padding-top:10px;display:flex}._v_wrq_boardOthersToggle{border-radius:var(--dsw-radius-sm);width:fit-content;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;margin-left:-4px;padding:2px 4px;font-size:12px;font-weight:500;line-height:18px;display:inline-flex}._v_wrq_boardOthersToggle:hover{color:var(--dsw-alias-label-primary)}._v_wrq_boardOthersToggle>svg{transition:transform .14s;transform:rotate(-90deg)}._v_wrq_boardOthersToggle[aria-expanded=true]>svg{transform:rotate(0)}._v_wrq_boardOthersList{flex-direction:column;min-width:0;display:flex}._v_wrq_boardFootnote{color:var(--dsw-alias-label-tertiary);margin:12px 0 0;font-size:12px;line-height:18px}._v_wrq_optionsPanel{border-radius:var(--dsw-radius-lg);background:var(--dsw-alias-bg-module-platform);flex-direction:column;gap:14px;min-width:0;margin-top:12px;padding:14px 16px;display:flex}._v_wrq_optionField{flex-direction:column;gap:6px;min-width:0;display:flex}._v_wrq_optionLabel{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_optionLabel label{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:20px}._v_wrq_optionDefault{border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-xs);color:var(--dsw-alias-label-tertiary);padding:0 6px;font-size:11px;line-height:16px}._v_wrq_optionReset{border-radius:var(--dsw-radius-sm);color:var(--dsw-alias-state-business-primary);font:inherit;cursor:pointer;background:0 0;border:0;padding:0 4px;font-size:12px;line-height:18px}._v_wrq_optionReset:disabled{cursor:default;opacity:.5}._v_wrq_optionInput{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);width:100%;min-width:0;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-base);font:inherit;resize:vertical;outline:none;padding:7px 10px;font-size:13px;line-height:20px}._v_wrq_optionInput:focus-visible{border-color:var(--dsw-alias-state-business-primary)}._v_wrq_optionInput[aria-invalid=true]{border-color:var(--dsw-alias-state-error-primary)}._v_wrq_optionInput:disabled{opacity:.5}._v_wrq_optionHint{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_optionHint[data-error]{color:var(--dsw-alias-state-error-primary)}._v_wrq_optionChoices{flex-wrap:wrap;gap:6px 16px;min-width:0;display:flex}._v_wrq_optionEmpty{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:18px}._v_wrq_boardControl{flex-wrap:wrap;flex:0 auto;justify-content:flex-end;align-items:center;gap:6px 12px;min-width:0;margin-left:auto;display:flex}._v_wrq_boardState{min-width:0;color:var(--dsw-alias-label-tertiary);white-space:nowrap;align-items:center;gap:6px;font-size:12px;line-height:18px;display:inline-flex}._v_wrq_boardState[data-tone=warning],._v_wrq_boardState[data-tone=error]{color:var(--dsw-alias-label-secondary)}._v_wrq_boardValue{color:var(--dsw-alias-label-secondary);font-size:13px;line-height:20px}@container (width<=420px){._v_wrq_boardMain ._v_wrq_boardControl{justify-content:stretch;width:100%}._v_wrq_boardMain ._v_wrq_boardControl>:last-child{flex:1}}@container (width<=180px){._v_wrq_boardSection ._v_wrq_sectionHeading p,._v_wrq_boardSection ._v_wrq_settingCopy small{display:none}._v_wrq_boardSection ._v_wrq_boardRow{padding:10px 0}._v_wrq_boardSection ._v_wrq_boardRowLine{grid-template-columns:minmax(0,1fr);gap:6px;display:grid}._v_wrq_boardSection ._v_wrq_settingCopy{min-width:0}._v_wrq_boardSection ._v_wrq_settingCopy strong{overflow-wrap:anywhere}._v_wrq_boardSection ._v_wrq_boardControl{justify-self:end}}._v_wrq_placeholderRow{border-bottom:.5px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:16px;min-height:70px;display:flex}._v_wrq_placeholderRow span{background:var(--dsw-alias-bg-module-platform);border-radius:6px;height:12px;animation:1.4s ease-in-out infinite _v_wrq_placeholder-pulse}._v_wrq_placeholderRow span:first-child{width:38%}._v_wrq_placeholderRow span:last-child{border-radius:10px;width:36px;height:20px}@keyframes _v_wrq_placeholder-pulse{50%{opacity:.45}}@media (prefers-reduced-motion:reduce){._v_wrq_boardRowCopy,._v_wrq_boardOthersToggle>svg{transition:none}._v_wrq_placeholderRow span{animation:none}}._v_wrq_selector{appearance:none;border-radius:var(--dsw-radius-md);max-width:280px;height:36px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-module-platform);white-space:nowrap;cursor:pointer;border:0;align-items:center;gap:12px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}._v_wrq_selector>span{text-overflow:ellipsis;min-width:0;overflow:hidden}._v_wrq_selector>svg{color:var(--dsw-alias-label-tertiary);flex:none}._v_wrq_selector:hover:not(:disabled),._v_wrq_selector[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover)}._v_wrq_selector:disabled{cursor:default;opacity:.4}._v_wrq_selectMenu{min-width:220px}._v_wrq_selectOption{white-space:normal;gap:1px;min-width:0;display:grid}._v_wrq_selectOption>small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_directoryInput{border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);width:100%;min-width:0;height:34px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font-family:var(--ds-font-family-code,ui-monospace, monospace);outline:none;padding:0 12px;font-size:12px;line-height:20px}._v_wrq_directoryInput::placeholder{color:var(--dsw-alias-label-dimmed);font-family:var(--dsw-font-family);font-size:13px}._v_wrq_directoryInput:focus-visible{border-color:var(--dsw-alias-state-business-primary)}._v_wrq_directoryInput[aria-invalid=true]{border-color:var(--dsw-alias-state-error-primary)}._v_wrq_directoryInput:disabled{cursor:default;opacity:.5}._v_wrq_rowDetail{border-bottom:.5px solid var(--dsw-alias-border-l2);flex-direction:column;gap:10px;min-width:0;padding:0 0 14px;display:flex}._v_wrq_settingRow:has(+._v_wrq_rowDetail){border-bottom:0;padding-bottom:10px}._v_wrq_effectiveRoute{min-width:0;color:var(--dsw-alias-label-tertiary);justify-content:space-between;align-items:center;gap:12px;font-size:12px;line-height:18px;display:flex}._v_wrq_effectiveRoute code{border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-xs);min-width:0;color:var(--dsw-alias-label-secondary);font-family:var(--ds-font-family-code,ui-monospace, monospace);text-overflow:ellipsis;white-space:nowrap;padding:1px 6px;font-size:11px;line-height:16px;overflow:hidden}._v_wrq_effectiveRoute small{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12px;overflow:hidden}._v_wrq_warning{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;margin:0;font-size:12px;line-height:18px}._v_wrq_advanced{min-width:0;padding:12px 0 2px}._v_wrq_advanced>summary{border-radius:var(--dsw-radius-sm);width:fit-content;color:var(--dsw-alias-label-secondary);cursor:pointer;align-items:center;gap:6px;margin-left:-4px;padding:2px 4px;font-size:12px;font-weight:500;line-height:18px;list-style:none;display:inline-flex}._v_wrq_advanced>summary::-webkit-details-marker{display:none}._v_wrq_advanced>summary>svg{transition:transform .14s}._v_wrq_advanced[open]>summary>svg{transform:rotate(180deg)}._v_wrq_advanced>summary:hover{color:var(--dsw-alias-label-primary)}._v_wrq_advanced>._v_wrq_fieldGrid{padding-top:12px}._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:14px;height:14px;margin-top:4px;animation:.7s linear infinite _v_wrq_settings-spin}@keyframes _v_wrq_settings-spin{to{transform:rotate(360deg)}}._v_wrq_providerList{flex-direction:column;gap:8px;min-width:0;margin-top:10px;display:flex}._v_wrq_providerRow{border:.5px solid var(--dsw-alias-settings-card-stroke);border-radius:var(--dsw-radius-xl);background:var(--dsw-alias-settings-card-fill);overflow:hidden}._v_wrq_providerRowHeader{align-items:center;gap:12px;min-width:0;padding:12px 14px;display:flex}summary._v_wrq_providerRowHeader{cursor:pointer;list-style:none}summary._v_wrq_providerRowHeader::-webkit-details-marker{display:none}._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,summary._v_wrq_providerRowHeader:focus-visible{border-radius:var(--dsw-radius-md);box-shadow:0 0 0 2px var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary))}._v_wrq_providerIdentity{flex:1;align-items:center;gap:12px;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:22px}._v_wrq_providerIdentity small{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:18px;overflow:hidden}._v_wrq_providerMark{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-1);flex:none;place-items:center;width:36px;height:36px;padding:6px;display:grid;overflow:hidden}._v_wrq_providerMark>img,._v_wrq_providerMark>svg{object-fit:contain;border-radius:4px;width:100%;height:100%;display:block}._v_wrq_providerEnableControl{flex:none;align-items:center;gap:10px;display:flex}._v_wrq_providerScopeTag{border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-xs);color:var(--dsw-alias-label-secondary);flex:none;padding:1px 6px;font-size:11px;line-height:16px}._v_wrq_providerScopeTag[data-scope=workspace]{border-color:color-mix(in srgb, var(--dsw-alias-state-business-primary) 30%, transparent);color:var(--dsw-alias-state-business-primary)}._v_wrq_providerState{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;align-items:center;gap:6px;font-size:12px;line-height:18px;display:inline-flex}._v_wrq_providerState:before{content:\"\";background:var(--dsw-alias-state-idle-primary);border-radius:50%;flex:none;width:6px;height:6px}._v_wrq_providerState[data-enabled]:before{background:var(--dsw-alias-state-success-primary)}._v_wrq_providerChevron{color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .14s}._v_wrq_providerDisclosure[aria-expanded=true] ._v_wrq_providerChevron,details[open]>summary ._v_wrq_providerChevron{transform:rotate(180deg)}._v_wrq_providerToggle{cursor:pointer;display:inline-flex;position:relative}._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:12px;line-height:18px}._v_wrq_providerServiceForm,._v_wrq_editor{border-radius:var(--dsw-radius-lg);background:var(--dsw-alias-bg-module-platform);flex-direction:column;gap:12px;min-width:0;padding:14px 16px;display:flex}._v_wrq_providerServicePrompt,._v_wrq_editorNote{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:18px}._v_wrq_editorHeading h3{margin:0;font-size:14px;font-weight:500;line-height:22px}._v_wrq_editorHeading p{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;margin:2px 0 0;font-size:12px;line-height:18px}._v_wrq_editor ._v_wrq_toggleRow{border-top:.5px solid var(--dsw-alias-border-l3);border-bottom:.5px solid var(--dsw-alias-border-l3);padding:10px 0}._v_wrq_embeddingTest{justify-content:space-between;align-items:center;gap:12px;min-width:0;display:flex}._v_wrq_embeddingTest>span{min-width:0;color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_embeddingTest>span._v_wrq_error{color:var(--dsw-alias-state-error-primary)}._v_wrq_globalLocationSetting{flex-direction:column;min-width:0;display:flex}._v_wrq_providerServiceLocation{border-bottom:.5px solid var(--dsw-alias-border-l3);padding-bottom:12px}._v_wrq_providerServiceLocation>._v_wrq_nativeLocation{padding:0 0 12px}._v_wrq_providerLocationField{padding-top:2px}._v_wrq_nativeLocation{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 16px;min-width:0;display:flex}._v_wrq_inlineChoices{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-interactive-bg-hover);flex:none;align-items:center;gap:2px;padding:3px;display:inline-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-radius:var(--dsw-radius-sm);height:28px;color:var(--dsw-alias-label-secondary);white-space:nowrap;align-items:center;padding:0 12px;font-size:13px;font-weight:500;line-height:20px;display:inline-flex}._v_wrq_inlineChoices input:checked+span{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-1);box-shadow:var(--dsw-elevation-soft)}._v_wrq_inlineChoices input:focus-visible+span{box-shadow:0 0 0 2px var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary))}._v_wrq_inlineChoices input:disabled+span{cursor:default;opacity:.4}._v_wrq_fieldGrid,._v_wrq_providerSettingsGrid{grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:12px;min-width:0;display:grid}._v_wrq_providerSettingsGrid{grid-template-columns:minmax(0,1fr)}._v_wrq_fieldGrid>label,._v_wrq_providerFieldControl>label:not(._v_wrq_providerBoolean){min-width:0;color:var(--dsw-alias-label-primary);flex-direction:column;gap:6px;font-size:13px;font-weight:500;line-height:20px;display:flex}._v_wrq_fieldGrid input,._v_wrq_fieldGrid select,._v_wrq_providerFieldControl input:not([type=checkbox]),._v_wrq_providerFieldControl select{border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);width:100%;min-width:0;height:34px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;outline:none;padding:0 12px;font-size:13px;font-weight:400;line-height:20px}._v_wrq_fieldGrid input::placeholder,._v_wrq_providerFieldControl input::placeholder{color:var(--dsw-alias-label-dimmed)}._v_wrq_fieldGrid 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_fieldGrid select:disabled,._v_wrq_providerFieldControl select:disabled{cursor:default}._v_wrq_fieldGrid input:focus-visible,._v_wrq_fieldGrid select:focus-visible,._v_wrq_providerFieldControl input:focus-visible,._v_wrq_providerFieldControl select:focus-visible{border-color:var(--dsw-alias-state-business-primary)}._v_wrq_fieldGrid input[aria-invalid=true],._v_wrq_providerFieldControl input:invalid{border-color:var(--dsw-alias-state-error-primary)}._v_wrq_fieldGrid input:disabled,._v_wrq_fieldGrid 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:4px;min-width:0;display:flex}._v_wrq_providerBoolean{min-height:34px;color:var(--dsw-alias-label-primary);align-items:center;gap:8px;font-size:13px;display:flex}._v_wrq_providerBoolean input{width:16px;height:16px;accent-color:var(--dsw-alias-brand-primary);margin:0}._v_wrq_providerSecretInput{min-width:0;position:relative}._v_wrq_providerSecretInput>input{padding-right:40px}._v_wrq_providerSecretVisibility{appearance:none;border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;place-items:center;padding:0;display:grid;position:absolute;top:3px;right:3px}._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-focus-ring-color,var(--dsw-alias-state-business-primary));outline:none}._v_wrq_providerSecretVisibility:disabled{cursor:default;opacity:.35}._v_wrq_providerSecretVisibility svg{width:16px;height:16px}._v_wrq_memoryConfigFooter{justify-content:space-between;align-items:center;gap:10px;min-height:36px;display:flex}._v_wrq_memoryConfigFooter>div{align-items:center;gap:6px;display:flex}._v_wrq_providerServiceFooter{align-items:flex-end;min-height:0}._v_wrq_configFeedback{flex:1;min-width:0;font-size:12px;line-height:18px}._v_wrq_scopeChanging,._v_wrq_providerTarget{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:18px}._v_wrq_scopeChanging{border-radius:var(--dsw-radius-md);color:var(--dsw-alias-state-warn-label,var(--dsw-alias-label-secondary));background:var(--dsw-alias-state-warn-tertiary,var(--dsw-alias-bg-module-platform));padding:8px 12px}._v_wrq_providerLoadError{justify-content:space-between;align-items:center;gap:10px;font-size:12px;display:flex}._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_location{align-items:baseline;gap:6px;min-width:0;display:flex}._v_wrq_locationRow{border-bottom:.5px solid var(--dsw-alias-border-l2);gap:10px;padding:14px 0}._v_wrq_rowActions{flex:none;align-items:center;gap:8px;display:flex}._v_wrq_packRow{flex-direction:column;gap:8px;min-width:0;padding-bottom:14px;display:flex}._v_wrq_packRow>._v_wrq_settingRow{border-bottom:0;padding-bottom:6px}._v_wrq_packRow:has(>._v_wrq_packFeedback:empty):not(:has(>._v_wrq_importBar))>._v_wrq_settingRow{padding-bottom:0}._v_wrq_rows>._v_wrq_packRow:not(:last-child){border-bottom:.5px solid var(--dsw-alias-border-l2)}._v_wrq_importBar{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-module-platform);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:13px;font-weight:500;line-height:20px;overflow:hidden}._v_wrq_importBar small{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._v_wrq_packFeedback{gap:4px;display:grid}._v_wrq_packFeedback:empty{display:none}._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_readOnlyNotice{color:var(--dsw-alias-label-tertiary);margin:0 0 -20px;font-size:12px;line-height:18px}._v_wrq_packSuccess{color:var(--dsw-alias-state-success-primary)}._v_wrq_syncRow{flex-direction:column;gap:8px;min-width:0;padding-bottom:14px;display:flex}._v_wrq_syncRow>._v_wrq_settingRow,._v_wrq_syncRow>._v_wrq_toggleRow{border-bottom:0;padding-bottom:6px}._v_wrq_syncRow:has(>._v_wrq_syncFeedback:empty):not(:has(>._v_wrq_syncForm)):not(:has(>._v_wrq_syncBar))>._v_wrq_settingRow{padding-bottom:0}._v_wrq_rows>._v_wrq_syncRow:not(:last-child){border-bottom:.5px solid var(--dsw-alias-border-l2)}._v_wrq_syncState{flex-wrap:wrap;align-items:center;gap:4px 10px;min-width:0;display:flex}._v_wrq_syncState>span{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_syncForm{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-module-platform);grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:12px;min-width:0;padding:12px;display:grid}._v_wrq_syncField{flex-direction:column;gap:6px;min-width:0;display:flex}._v_wrq_syncField>label{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:20px}._v_wrq_syncField>small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_syncField>input{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);width:100%;min-width:0;height:34px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;outline:none;padding:0 12px;font-size:13px;line-height:20px}._v_wrq_syncField>input:focus-visible{border-color:var(--dsw-alias-state-business-primary)}._v_wrq_syncField>input[aria-invalid=true]{border-color:var(--dsw-alias-state-error-primary)}._v_wrq_syncField>input:disabled{cursor:default;opacity:.5}._v_wrq_syncBlock{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-3);flex-direction:column;grid-column:1/-1;gap:8px;min-width:0;padding:12px;display:flex}._v_wrq_syncBlock>header{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_syncBlock>header strong{font-size:13px;font-weight:500;line-height:20px}._v_wrq_syncBlock>small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_syncBlock p{overflow-wrap:anywhere;margin:0;font-size:12px;line-height:18px}._v_wrq_syncBlock ._v_wrq_syncFormActions{grid-column:auto}._v_wrq_syncBlock ._v_wrq_syncField>select{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);width:100%;min-width:0;height:34px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;outline:none;padding:0 10px;font-size:13px;line-height:20px}._v_wrq_syncBlock ._v_wrq_syncField>select:disabled{cursor:default;opacity:.5}._v_wrq_syncAccount{align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_syncAccount>span{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_syncCode{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_syncCode>code{border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font-family:var(--dsw-font-mono,ui-monospace, monospace);letter-spacing:.08em;padding:6px 10px;font-size:14px;font-weight:500}._v_wrq_syncCode>a{color:var(--dsw-alias-state-business-primary);font-size:12px;line-height:18px}._v_wrq_syncCheck{color:var(--dsw-alias-label-primary);align-items:center;gap:8px;font-size:13px;line-height:20px;display:flex}._v_wrq_syncCheck input{width:16px;height:16px;accent-color:var(--dsw-alias-brand-primary);margin:0}._v_wrq_syncFormActions{grid-column:1/-1;align-items:center;gap:8px;display:flex}._v_wrq_syncBar{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-module-platform);grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:10px;min-width:0;padding:10px 12px;display:grid}._v_wrq_syncBar>div{min-width:0;display:grid}._v_wrq_syncBar strong{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;line-height:20px;overflow:hidden}._v_wrq_syncBar small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_syncFeedback{gap:4px;display:grid}._v_wrq_syncFeedback:empty{display:none}._v_wrq_syncFeedback p{overflow-wrap:anywhere;margin:0;font-size:12px;line-height:18px}._v_wrq_syncSuccess{color:var(--dsw-alias-state-success-primary)}._v_wrq_reviewList{gap:8px;display:grid}._v_wrq_reviewEntry{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-module-platform);flex-direction:column;gap:6px;min-width:0;padding:10px 12px;display:flex}._v_wrq_reviewEntry>header{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_reviewEntry>small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_reviewEntry>p{overflow-wrap:anywhere;margin:0;font-size:13px;line-height:20px}._v_wrq_reviewTitle{align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_reviewTitle strong{overflow-wrap:anywhere;font-size:13px;font-weight:500;line-height:20px}._v_wrq_reviewOperations{gap:4px;margin:0;padding-left:18px;display:grid}._v_wrq_reviewOperations li{overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_reviewOperations small{color:var(--dsw-alias-label-tertiary);display:block}._v_wrq_reviewOpinions{gap:4px;display:grid}._v_wrq_reviewOpinions>strong{font-size:12px;font-weight:500;line-height:18px}._v_wrq_reviewOpinions>small{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._v_wrq_reviewOpinions>div{overflow-wrap:anywhere;gap:6px;min-width:0;font-size:12px;line-height:18px;display:flex}._v_wrq_reviewOpinions>div strong{color:var(--dsw-alias-label-secondary);flex:none;font-weight:500}._v_wrq_reviewOpinionForm{align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_reviewOpinionForm>input{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);min-width:0;height:34px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;outline:none;flex:auto;padding:0 12px;font-size:13px;line-height:20px}._v_wrq_reviewOpinionForm>input:focus-visible{border-color:var(--dsw-alias-state-business-primary)}._v_wrq_reviewOpinionForm>input:disabled{cursor:default;opacity:.5}._v_wrq_reviewRules{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-module-platform);gap:4px;padding:10px 12px;display:grid}._v_wrq_reviewRules>strong{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:500;line-height:18px}._v_wrq_reviewRules>ul{gap:2px;margin:0;padding-left:18px;display:grid}._v_wrq_reviewRules li{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_reviewGuidance{gap:4px;display:grid}._v_wrq_reviewGuidance>label{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:500;line-height:18px}._v_wrq_reviewGuidance>input{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);width:100%;height:34px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;outline:none;padding:0 12px;font-size:13px;line-height:20px}._v_wrq_reviewGuidance>input:focus-visible{border-color:var(--dsw-alias-state-business-primary)}._v_wrq_reviewGuidance>input:disabled{cursor:default;opacity:.5}._v_wrq_reviewGuidance>small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_reviewSelection{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px;min-width:0;display:flex}._v_wrq_reviewSelection>small,._v_wrq_reviewSelected{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._v_wrq_reviewOperations>li{gap:2px;display:grid}._v_wrq_reviewOperations>li>label{cursor:pointer;align-items:flex-start;gap:6px;min-width:0;display:flex}._v_wrq_reviewOperations>li>label>input{flex:none;margin:3px 0 0}._v_wrq_reviewOperations>li>label>input:disabled{cursor:default;opacity:.5}._v_wrq_reviewOperations>li[data-applied=true]{opacity:.55}._v_wrq_syncBackups{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-module-platform);gap:8px;padding:10px 12px;display:grid}._v_wrq_syncBackups>header{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_syncBackups>header>strong{overflow-wrap:anywhere;font-size:13px;font-weight:500;line-height:20px}._v_wrq_syncBackups>small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_syncBackupList{gap:6px;display:grid}._v_wrq_syncBackupEntry{border-radius:var(--dsw-radius-sm,var(--dsw-radius-md));background:var(--dsw-alias-bg-layer-3);flex-direction:column;gap:4px;min-width:0;padding:8px 10px;display:flex}._v_wrq_syncBackupEntry>header{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_syncBackupEntry>small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_syncBackupComponents{gap:2px;display:grid}._v_wrq_syncBackupComponents>small{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_syncDiff{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-module-platform);gap:8px;padding:10px 12px;display:grid}._v_wrq_syncDiff>header{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_syncDiff>header>strong{overflow-wrap:anywhere;font-size:13px;font-weight:500;line-height:20px}._v_wrq_syncDiff>small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_syncDiffColumns{grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:10px;min-width:0;display:grid}._v_wrq_syncDiffColumns>div{align-content:start;gap:4px;min-width:0;display:grid}._v_wrq_syncDiffColumns>div>strong{font-size:12px;font-weight:500;line-height:18px}._v_wrq_syncDiffColumns>div>small{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._v_wrq_syncDiffColumns ul{gap:4px;margin:0;padding:0;list-style:none;display:grid}._v_wrq_syncDiffColumns li{overflow-wrap:anywhere;gap:2px;font-size:12px;line-height:18px;display:grid}._v_wrq_syncDiffMeta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}._v_wrq_syncDialogBody{gap:16px;display:grid}._v_wrq_syncDialogBody ._v_wrq_syncBackups,._v_wrq_syncDialogBody ._v_wrq_syncDiff{background:0 0;padding:0}._v_wrq_syncDialogBody ._v_wrq_syncBackups>header>strong,._v_wrq_syncDialogBody ._v_wrq_syncDiff>header>strong{font-size:14px;line-height:22px}._v_wrq_syncConflictList{gap:8px;display:grid}._v_wrq_syncConflict{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-module-platform);gap:6px;min-width:0;padding:10px 12px;display:grid}._v_wrq_syncConflict>header{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_syncConflict>header>strong{font-size:13px;font-weight:500;line-height:20px}._v_wrq_syncConflict>header>small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}._v_wrq_syncConflictSides{grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:8px;min-width:0;display:grid}._v_wrq_syncConflictSides>div{align-content:start;gap:2px;min-width:0;display:grid}._v_wrq_syncConflictSides>div>small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}._v_wrq_syncConflictSides>div>span{overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_syncDialogNote{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;margin:0;font-size:12px;line-height:18px}._v_wrq_syncPlan{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-module-platform);gap:8px;padding:10px 12px;display:grid}._v_wrq_syncPlan>p{overflow-wrap:anywhere;margin:0;font-size:13px;line-height:20px}._v_wrq_syncPlan>._v_wrq_rowActions{justify-content:flex-start}._v_wrq_selector:focus-visible{box-shadow:0 0 0 2px var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline:none}@media (width<=620px){._v_wrq_page{gap:28px}._v_wrq_rowActions{width:100%}._v_wrq_rowActions button{flex:1}._v_wrq_importBar{grid-template-columns:minmax(0,1fr) auto}._v_wrq_importBar>button:last-child{grid-column:1/-1}._v_wrq_syncBar{grid-template-columns:minmax(0,1fr) auto}._v_wrq_syncBar>button:last-child{grid-column:1/-1}._v_wrq_syncFormActions{flex-wrap:wrap}._v_wrq_syncFormActions button{flex:1}._v_wrq_reviewOpinionForm{flex-wrap:wrap}._v_wrq_reviewOpinionForm>input{flex:100%}._v_wrq_inlineChoices{width:100%}._v_wrq_inlineChoices label{flex:1}._v_wrq_inlineChoices span{justify-content:center;width:100%}._v_wrq_providerRowHeader{align-items:flex-start;gap:8px}._v_wrq_providerEnableControl{flex-wrap:wrap;justify-content:flex-end;gap:6px;max-width:132px}._v_wrq_providerState{text-overflow:ellipsis;max-width:120px;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_providerChevron,._v_wrq_advanced>summary>svg{transition:none}._v_wrq_miniSpinner{animation:none}}";
676
+ const css$13 = "._v_wrq_page{box-sizing:border-box;width:100%;min-width:0;color:var(--dsw-alias-label-primary);flex-direction:column;gap:32px;font-family:inherit;display:flex}._v_wrq_surface{color:var(--dsw-alias-label-primary)}:where(._v_wrq_page,._v_wrq_surface) *,:where(._v_wrq_page,._v_wrq_surface) :before,:where(._v_wrq_page,._v_wrq_surface) :after{box-sizing:border-box}:where(._v_wrq_page,._v_wrq_surface) :where(button,input,select,textarea){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_section{flex-direction:column;gap:4px;min-width:0;display:flex}._v_wrq_sectionHeading{grid-template-columns:minmax(0,1fr) auto;align-items:start;column-gap:12px;min-width:0;display:grid}._v_wrq_sectionHeading h2{grid-column:1;margin:0;font-size:14px;font-weight:500;line-height:20px}._v_wrq_sectionHeading p{max-width:66ch;color:var(--dsw-alias-label-tertiary);grid-column:1;margin:2px 0 0;font-size:12px;line-height:18px}._v_wrq_sectionHeading ._v_wrq_miniSpinner{grid-area:1/2}._v_wrq_sectionHeading>._v_wrq_boardLinks{grid-column:1;padding-top:6px}._v_wrq_componentListNote{max-width:72ch;color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:18px}._v_wrq_appliesNow{border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-xs);color:var(--dsw-alias-label-secondary);white-space:nowrap;grid-area:1/2;align-self:center;padding:1px 6px;font-size:11px;line-height:16px}._v_wrq_rows{flex-direction:column;min-width:0;display:flex}._v_wrq_settingRow,._v_wrq_toggleRow{border-bottom:.5px solid var(--dsw-alias-border-l2);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 16px;min-width:0;padding:14px 0;display:flex;position:relative}._v_wrq_rows>:last-child,._v_wrq_rows>._v_wrq_packRow:last-child>._v_wrq_settingRow{border-bottom:0}._v_wrq_rows>._v_wrq_packRow:last-child{padding-bottom:0}._v_wrq_settingRow[data-stacked]{flex-direction:column;align-items:stretch}._v_wrq_settingCopy{flex-direction:column;flex:1 1 0;gap:2px;min-width:min(240px,100%);display:flex}._v_wrq_settingCopy strong,._v_wrq_settingCopy label{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}._v_wrq_settingCopy small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_settingCopy code{font-family:var(--ds-font-family-code,ui-monospace, monospace)}._v_wrq_settingControl{flex:none;justify-content:flex-end;align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_settingRow[data-stacked] ._v_wrq_settingControl{flex:auto;justify-content:stretch}._v_wrq_switch{flex:none}._v_wrq_rowNote{min-width:0;color:var(--dsw-alias-label-secondary);flex-wrap:wrap;align-items:center;gap:4px 8px;padding-top:4px;font-size:12px;line-height:18px;display:flex}._v_wrq_groupCallout{margin:8px 0 4px}._v_wrq_boardSection{container-type:inline-size}._v_wrq_board{flex-direction:column;min-width:0;margin-top:10px;display:flex}._v_wrq_boardProblem{margin:0 0 4px}._v_wrq_boardLoading{min-height:40px;color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;margin:0;font-size:13px;line-height:20px;display:flex}._v_wrq_boardGroup{flex-direction:column;min-width:0;padding-top:14px;display:flex}._v_wrq_boardGroupHead{justify-content:space-between;align-items:baseline;gap:8px;min-width:0;display:flex}._v_wrq_boardGroupHead h3{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;font-weight:500;line-height:18px}._v_wrq_boardGroupHead span{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:12px;line-height:18px}._v_wrq_pageLink{appearance:none;border-radius:var(--dsw-radius-sm);max-width:100%;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;padding:0;display:inline-flex}._v_wrq_pageLink>span{overflow-wrap:anywhere;min-width:0}._v_wrq_pageLink:hover>span{text-underline-offset:3px;text-decoration:underline}._v_wrq_settingCopy ._v_wrq_pageLink{width:fit-content;color:var(--dsw-alias-label-primary);font-size:14px;line-height:22px}._v_wrq_boardIconButton{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;flex:none;place-items:center;padding:0;display:inline-grid}._v_wrq_boardIconButton:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._v_wrq_boardLinks{flex-wrap:wrap;align-items:center;gap:4px;min-width:0;padding-top:4px;display:flex}._v_wrq_boardLink{appearance:none;border:.5px solid var(--dsw-alias-border-l3);max-width:100%;color:var(--dsw-alias-label-tertiary);font:inherit;white-space:nowrap;cursor:pointer;background:0 0;border-radius:999px;align-items:center;gap:4px;padding:0 8px;font-size:11px;line-height:18px;transition:color .12s,border-color .12s;display:inline-flex}._v_wrq_boardLink[data-on]{color:var(--dsw-alias-label-secondary)}._v_wrq_boardLink:hover{border-color:var(--dsw-alias-border-l4);color:var(--dsw-alias-label-primary)}._v_wrq_boardLink>svg{flex:none}._v_wrq_boardLinksLabel{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._v_wrq_pageLink:focus-visible,._v_wrq_boardIconButton:focus-visible,._v_wrq_boardLink:focus-visible,._v_wrq_detailsBack:focus-visible,._v_wrq_boardSearch:focus-within{box-shadow:0 0 0 2px var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline:none}._v_wrq_boardSearch{border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);min-width:0;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-base);align-items:center;gap:8px;margin:12px 0 0;padding:0 10px;display:flex}._v_wrq_boardSearch input{min-width:0;height:32px;color:var(--dsw-alias-label-primary);font:inherit;background:0 0;border:0;outline:none;flex:1;font-size:13px}._v_wrq_detailsDialog{width:min(560px,100%);max-height:100%}._v_wrq_detailsScroll{overscroll-behavior:contain;min-height:0;overflow-y:auto}._v_wrq_detailsBody{flex-direction:column;gap:16px;min-width:0;display:flex}._v_wrq_detailsHead{flex-direction:column;gap:6px;min-width:0;display:flex}._v_wrq_detailsHeadLine{flex-wrap:wrap;align-items:center;gap:8px 10px;min-width:0;display:flex}._v_wrq_detailsPackage{min-width:0;color:var(--dsw-alias-label-tertiary);font-family:var(--ds-font-family-code,ui-monospace, monospace);text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:16px;overflow:hidden}._v_wrq_detailsControl{align-items:center;margin-left:auto;display:flex}._v_wrq_detailsSection{border-top:.5px solid var(--dsw-alias-border-l2);flex-direction:column;gap:8px;min-width:0;padding-top:14px;display:flex}._v_wrq_detailsSection>h3{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;font-weight:500;line-height:18px}._v_wrq_detailsRelations{grid-template-columns:max-content minmax(0,1fr);gap:6px 16px;min-width:0;margin:0;font-size:13px;line-height:20px;display:grid}._v_wrq_detailsRelations>div{display:contents}._v_wrq_detailsRelations dt{color:var(--dsw-alias-label-secondary)}._v_wrq_detailsRelations dd{min-width:0;color:var(--dsw-alias-label-primary);flex-wrap:wrap;gap:4px 12px;margin:0;display:flex}._v_wrq_detailsName{appearance:none;color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:0;display:inline-flex}._v_wrq_detailsName:hover>span{text-underline-offset:3px;text-decoration:underline}._v_wrq_detailsBack{appearance:none;border-radius:var(--dsw-radius-sm);width:fit-content;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:2px;margin:-4px 0 -6px -4px;padding:2px 4px;font-size:12px;line-height:18px;display:inline-flex}._v_wrq_detailsBack:hover{color:var(--dsw-alias-label-primary)}._v_wrq_detailsMissing{color:var(--dsw-alias-label-secondary)}._v_wrq_detailsEffect{color:var(--dsw-alias-label-secondary);margin:0;font-size:12px;line-height:18px}._v_wrq_detailsBody ._v_wrq_optionsPanel{background:0 0;border-radius:0;margin:0;padding:0}._v_wrq_componentRowPage{flex-direction:column;gap:16px;min-width:0;display:flex}._v_wrq_detailsContributed{border-top:.5px solid var(--dsw-alias-border-l2);flex-direction:column;gap:16px;min-width:0;padding-top:14px;display:flex}._v_wrq_panelSection{flex-direction:column;gap:8px;min-width:0;display:flex}._v_wrq_panelHeading{grid-template-columns:minmax(0,1fr) auto;column-gap:12px;min-width:0;display:grid}._v_wrq_panelHeading h3{color:var(--dsw-alias-label-primary);margin:0;font-size:13px;font-weight:500;line-height:20px}._v_wrq_panelHeading p{color:var(--dsw-alias-label-tertiary);grid-column:1;margin:2px 0 0;font-size:12px;line-height:18px}._v_wrq_panelHeading ._v_wrq_miniSpinner{grid-area:1/2}._v_wrq_panelNote{color:var(--dsw-alias-label-secondary);margin:0;font-size:12px;line-height:18px}._v_wrq_panelActions{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px;min-width:0;padding-top:8px;display:flex}._v_wrq_panelActions>span{min-width:0;color:var(--dsw-alias-label-secondary);flex:1;font-size:12px;line-height:18px}._v_wrq_panelActions>span._v_wrq_panelError,._v_wrq_panelError{color:var(--dsw-alias-state-error-primary)}._v_wrq_rows>._v_wrq_panelActions{border-bottom:.5px solid var(--dsw-alias-border-l2);padding:10px 0}._v_wrq_rows>._v_wrq_panelNote{padding:8px 0}._v_wrq_panelError{margin:0;font-size:12px;line-height:18px}._v_wrq_boardRow{border-bottom:.5px solid var(--dsw-alias-border-l2);flex-direction:column;min-width:0;padding:14px 0;display:flex}._v_wrq_boardRowLine{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 16px;min-width:0;display:flex}._v_wrq_boardGroup>._v_wrq_boardRow:last-child,._v_wrq_boardOthersList>._v_wrq_boardRow:last-child{border-bottom:0;padding-bottom:4px}._v_wrq_boardMain{padding-top:12px}._v_wrq_boardEmpty{color:var(--dsw-alias-label-tertiary);margin:0;padding:12px 0 4px;font-size:12px;line-height:18px}._v_wrq_boardOthers{flex-direction:column;min-width:0;padding-top:10px;display:flex}._v_wrq_boardOthersToggle{border-radius:var(--dsw-radius-sm);width:fit-content;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;margin-left:-4px;padding:2px 4px;font-size:12px;font-weight:500;line-height:18px;display:inline-flex}._v_wrq_boardOthersToggle:hover{color:var(--dsw-alias-label-primary)}._v_wrq_boardOthersToggle>svg{transition:transform .14s;transform:rotate(-90deg)}._v_wrq_boardOthersToggle[aria-expanded=true]>svg{transform:rotate(0)}._v_wrq_boardOthersList{flex-direction:column;min-width:0;display:flex}._v_wrq_boardFootnote{color:var(--dsw-alias-label-tertiary);margin:12px 0 0;font-size:12px;line-height:18px}._v_wrq_optionsPanel{border-radius:var(--dsw-radius-lg);background:var(--dsw-alias-bg-module-platform);flex-direction:column;gap:14px;min-width:0;margin-top:12px;padding:14px 16px;display:flex}._v_wrq_optionField{flex-direction:column;gap:6px;min-width:0;display:flex}._v_wrq_optionLabel{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_optionLabel label{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:20px}._v_wrq_optionDefault{border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-xs);color:var(--dsw-alias-label-tertiary);padding:0 6px;font-size:11px;line-height:16px}._v_wrq_optionReset{border-radius:var(--dsw-radius-sm);color:var(--dsw-alias-state-business-primary);font:inherit;cursor:pointer;background:0 0;border:0;padding:0 4px;font-size:12px;line-height:18px}._v_wrq_optionReset:disabled{cursor:default;opacity:.5}._v_wrq_optionInput{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);width:100%;min-width:0;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-base);font:inherit;resize:vertical;outline:none;padding:7px 10px;font-size:13px;line-height:20px}._v_wrq_optionInput:focus-visible{border-color:var(--dsw-alias-state-business-primary)}._v_wrq_optionInput[aria-invalid=true]{border-color:var(--dsw-alias-state-error-primary)}._v_wrq_optionInput:disabled{opacity:.5}._v_wrq_optionHint{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_optionHint[data-error]{color:var(--dsw-alias-state-error-primary)}._v_wrq_optionChoices{flex-wrap:wrap;gap:6px 16px;min-width:0;display:flex}._v_wrq_optionEmpty{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:18px}._v_wrq_boardControl{flex-wrap:wrap;flex:0 auto;justify-content:flex-end;align-items:center;gap:6px 12px;min-width:0;margin-left:auto;display:flex}._v_wrq_boardState{min-width:0;color:var(--dsw-alias-label-tertiary);white-space:nowrap;align-items:center;gap:6px;font-size:12px;line-height:18px;display:inline-flex}._v_wrq_boardState[data-tone=warning],._v_wrq_boardState[data-tone=error]{color:var(--dsw-alias-label-secondary)}._v_wrq_boardValue{color:var(--dsw-alias-label-secondary);font-size:13px;line-height:20px}@container (width<=420px){._v_wrq_boardMain ._v_wrq_boardControl{justify-content:stretch;width:100%}._v_wrq_boardMain ._v_wrq_boardControl>:last-child{flex:1}}@container (width<=180px){._v_wrq_boardSection ._v_wrq_sectionHeading p,._v_wrq_boardSection ._v_wrq_settingCopy small{display:none}._v_wrq_boardSection ._v_wrq_boardRow{padding:10px 0}._v_wrq_boardSection ._v_wrq_boardRowLine{grid-template-columns:minmax(0,1fr);gap:6px;display:grid}._v_wrq_boardSection ._v_wrq_settingCopy{min-width:0}._v_wrq_boardSection ._v_wrq_settingCopy strong{overflow-wrap:anywhere}._v_wrq_boardSection ._v_wrq_boardControl{justify-self:end}}._v_wrq_placeholderRow{border-bottom:.5px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:16px;min-height:70px;display:flex}._v_wrq_placeholderRow span{background:var(--dsw-alias-bg-module-platform);border-radius:6px;height:12px;animation:1.4s ease-in-out infinite _v_wrq_placeholder-pulse}._v_wrq_placeholderRow span:first-child{width:38%}._v_wrq_placeholderRow span:last-child{border-radius:10px;width:36px;height:20px}@keyframes _v_wrq_placeholder-pulse{50%{opacity:.45}}@media (prefers-reduced-motion:reduce){._v_wrq_boardRowCopy,._v_wrq_boardOthersToggle>svg{transition:none}._v_wrq_placeholderRow span{animation:none}}._v_wrq_selector{appearance:none;border-radius:var(--dsw-radius-md);max-width:280px;height:36px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-module-platform);white-space:nowrap;cursor:pointer;border:0;align-items:center;gap:12px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}._v_wrq_selector>span{text-overflow:ellipsis;min-width:0;overflow:hidden}._v_wrq_selector>svg{color:var(--dsw-alias-label-tertiary);flex:none}._v_wrq_selector:hover:not(:disabled),._v_wrq_selector[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover)}._v_wrq_selector:disabled{cursor:default;opacity:.4}._v_wrq_selectMenu{min-width:220px}._v_wrq_selectOption{white-space:normal;gap:1px;min-width:0;display:grid}._v_wrq_selectOption>small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_directoryInput{border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);width:100%;min-width:0;height:34px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font-family:var(--ds-font-family-code,ui-monospace, monospace);outline:none;padding:0 12px;font-size:12px;line-height:20px}._v_wrq_directoryInput::placeholder{color:var(--dsw-alias-label-dimmed);font-family:var(--dsw-font-family);font-size:13px}._v_wrq_directoryInput:focus-visible{border-color:var(--dsw-alias-state-business-primary)}._v_wrq_directoryInput[aria-invalid=true]{border-color:var(--dsw-alias-state-error-primary)}._v_wrq_directoryInput:disabled{cursor:default;opacity:.5}._v_wrq_rowDetail{border-bottom:.5px solid var(--dsw-alias-border-l2);flex-direction:column;gap:10px;min-width:0;padding:0 0 14px;display:flex}._v_wrq_settingRow:has(+._v_wrq_rowDetail){border-bottom:0;padding-bottom:10px}._v_wrq_effectiveRoute{min-width:0;color:var(--dsw-alias-label-tertiary);justify-content:space-between;align-items:center;gap:12px;font-size:12px;line-height:18px;display:flex}._v_wrq_effectiveRoute code{border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-xs);min-width:0;color:var(--dsw-alias-label-secondary);font-family:var(--ds-font-family-code,ui-monospace, monospace);text-overflow:ellipsis;white-space:nowrap;padding:1px 6px;font-size:11px;line-height:16px;overflow:hidden}._v_wrq_effectiveRoute small{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12px;overflow:hidden}._v_wrq_warning{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;margin:0;font-size:12px;line-height:18px}._v_wrq_advanced{min-width:0;padding:12px 0 2px}._v_wrq_advanced>summary{border-radius:var(--dsw-radius-sm);width:fit-content;color:var(--dsw-alias-label-secondary);cursor:pointer;align-items:center;gap:6px;margin-left:-4px;padding:2px 4px;font-size:12px;font-weight:500;line-height:18px;list-style:none;display:inline-flex}._v_wrq_advanced>summary::-webkit-details-marker{display:none}._v_wrq_advanced>summary>svg{transition:transform .14s}._v_wrq_advanced[open]>summary>svg{transform:rotate(180deg)}._v_wrq_advanced>summary:hover{color:var(--dsw-alias-label-primary)}._v_wrq_advanced>._v_wrq_fieldGrid{padding-top:12px}._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:14px;height:14px;margin-top:4px;animation:.7s linear infinite _v_wrq_settings-spin}@keyframes _v_wrq_settings-spin{to{transform:rotate(360deg)}}._v_wrq_providerList{flex-direction:column;gap:8px;min-width:0;margin-top:10px;display:flex}._v_wrq_providerRow{border:.5px solid var(--dsw-alias-settings-card-stroke);border-radius:var(--dsw-radius-xl);background:var(--dsw-alias-settings-card-fill);overflow:hidden}._v_wrq_providerRowHeader{align-items:center;gap:12px;min-width:0;padding:12px 14px;display:flex}summary._v_wrq_providerRowHeader{cursor:pointer;list-style:none}summary._v_wrq_providerRowHeader::-webkit-details-marker{display:none}._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,summary._v_wrq_providerRowHeader:focus-visible{border-radius:var(--dsw-radius-md);box-shadow:0 0 0 2px var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary))}._v_wrq_providerIdentity{flex:1;align-items:center;gap:12px;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:22px}._v_wrq_providerIdentity small{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:18px;overflow:hidden}._v_wrq_providerMark{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-1);flex:none;place-items:center;width:36px;height:36px;padding:6px;display:grid;overflow:hidden}._v_wrq_providerMark>img,._v_wrq_providerMark>svg{object-fit:contain;border-radius:4px;width:100%;height:100%;display:block}._v_wrq_providerEnableControl{flex:none;align-items:center;gap:10px;display:flex}._v_wrq_providerScopeTag{border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-xs);color:var(--dsw-alias-label-secondary);flex:none;padding:1px 6px;font-size:11px;line-height:16px}._v_wrq_providerScopeTag[data-scope=workspace]{border-color:color-mix(in srgb, var(--dsw-alias-state-business-primary) 30%, transparent);color:var(--dsw-alias-state-business-primary)}._v_wrq_providerState{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;align-items:center;gap:6px;font-size:12px;line-height:18px;display:inline-flex}._v_wrq_providerState:before{content:\"\";background:var(--dsw-alias-state-idle-primary);border-radius:50%;flex:none;width:6px;height:6px}._v_wrq_providerState[data-enabled]:before{background:var(--dsw-alias-state-success-primary)}._v_wrq_providerChevron{color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .14s}._v_wrq_providerDisclosure[aria-expanded=true] ._v_wrq_providerChevron,details[open]>summary ._v_wrq_providerChevron{transform:rotate(180deg)}._v_wrq_providerToggle{cursor:pointer;display:inline-flex;position:relative}._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:12px;line-height:18px}._v_wrq_providerServiceForm,._v_wrq_editor{border-radius:var(--dsw-radius-lg);background:var(--dsw-alias-bg-module-platform);flex-direction:column;gap:12px;min-width:0;padding:14px 16px;display:flex}._v_wrq_providerServicePrompt,._v_wrq_editorNote{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:18px}._v_wrq_editorHeading h3{margin:0;font-size:14px;font-weight:500;line-height:22px}._v_wrq_editorHeading p{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;margin:2px 0 0;font-size:12px;line-height:18px}._v_wrq_editor ._v_wrq_toggleRow{border-top:.5px solid var(--dsw-alias-border-l3);border-bottom:.5px solid var(--dsw-alias-border-l3);padding:10px 0}._v_wrq_embeddingTest{justify-content:space-between;align-items:center;gap:12px;min-width:0;display:flex}._v_wrq_embeddingTest>span{min-width:0;color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_embeddingTest>span._v_wrq_error{color:var(--dsw-alias-state-error-primary)}._v_wrq_globalLocationSetting{flex-direction:column;min-width:0;display:flex}._v_wrq_providerServiceLocation{border-bottom:.5px solid var(--dsw-alias-border-l3);padding-bottom:12px}._v_wrq_providerServiceLocation>._v_wrq_nativeLocation{padding:0 0 12px}._v_wrq_providerLocationField{padding-top:2px}._v_wrq_nativeLocation{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 16px;min-width:0;display:flex}._v_wrq_inlineChoices{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-interactive-bg-hover);flex:none;align-items:center;gap:2px;padding:3px;display:inline-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-radius:var(--dsw-radius-sm);height:28px;color:var(--dsw-alias-label-secondary);white-space:nowrap;align-items:center;padding:0 12px;font-size:13px;font-weight:500;line-height:20px;display:inline-flex}._v_wrq_inlineChoices input:checked+span{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-1);box-shadow:var(--dsw-elevation-soft)}._v_wrq_inlineChoices input:focus-visible+span{box-shadow:0 0 0 2px var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary))}._v_wrq_inlineChoices input:disabled+span{cursor:default;opacity:.4}._v_wrq_fieldGrid,._v_wrq_providerSettingsGrid{grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:12px;min-width:0;display:grid}._v_wrq_providerSettingsGrid{grid-template-columns:minmax(0,1fr)}._v_wrq_fieldGrid>label,._v_wrq_providerFieldControl>label:not(._v_wrq_providerBoolean){min-width:0;color:var(--dsw-alias-label-primary);flex-direction:column;gap:6px;font-size:13px;font-weight:500;line-height:20px;display:flex}._v_wrq_fieldGrid input,._v_wrq_fieldGrid select,._v_wrq_providerFieldControl input:not([type=checkbox]),._v_wrq_providerFieldControl select{border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);width:100%;min-width:0;height:34px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;outline:none;padding:0 12px;font-size:13px;font-weight:400;line-height:20px}._v_wrq_fieldGrid input::placeholder,._v_wrq_providerFieldControl input::placeholder{color:var(--dsw-alias-label-dimmed)}._v_wrq_fieldGrid 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_fieldGrid select:disabled,._v_wrq_providerFieldControl select:disabled{cursor:default}._v_wrq_fieldGrid input:focus-visible,._v_wrq_fieldGrid select:focus-visible,._v_wrq_providerFieldControl input:focus-visible,._v_wrq_providerFieldControl select:focus-visible{border-color:var(--dsw-alias-state-business-primary)}._v_wrq_fieldGrid input[aria-invalid=true],._v_wrq_providerFieldControl input:invalid{border-color:var(--dsw-alias-state-error-primary)}._v_wrq_fieldGrid input:disabled,._v_wrq_fieldGrid 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:4px;min-width:0;display:flex}._v_wrq_providerBoolean{min-height:34px;color:var(--dsw-alias-label-primary);align-items:center;gap:8px;font-size:13px;display:flex}._v_wrq_providerBoolean input{width:16px;height:16px;accent-color:var(--dsw-alias-brand-primary);margin:0}._v_wrq_providerSecretInput{min-width:0;position:relative}._v_wrq_providerSecretInput>input{padding-right:40px}._v_wrq_providerSecretVisibility{appearance:none;border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;place-items:center;padding:0;display:grid;position:absolute;top:3px;right:3px}._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-focus-ring-color,var(--dsw-alias-state-business-primary));outline:none}._v_wrq_providerSecretVisibility:disabled{cursor:default;opacity:.35}._v_wrq_providerSecretVisibility svg{width:16px;height:16px}._v_wrq_memoryConfigFooter{justify-content:space-between;align-items:center;gap:10px;min-height:36px;display:flex}._v_wrq_memoryConfigFooter>div{align-items:center;gap:6px;display:flex}._v_wrq_providerServiceFooter{align-items:flex-end;min-height:0}._v_wrq_configFeedback{flex:1;min-width:0;font-size:12px;line-height:18px}._v_wrq_scopeChanging,._v_wrq_providerTarget{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:18px}._v_wrq_scopeChanging{border-radius:var(--dsw-radius-md);color:var(--dsw-alias-state-warn-label,var(--dsw-alias-label-secondary));background:var(--dsw-alias-state-warn-tertiary,var(--dsw-alias-bg-module-platform));padding:8px 12px}._v_wrq_providerLoadError{justify-content:space-between;align-items:center;gap:10px;font-size:12px;display:flex}._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_location{align-items:baseline;gap:6px;min-width:0;display:flex}._v_wrq_locationRow{border-bottom:.5px solid var(--dsw-alias-border-l2);gap:10px;padding:14px 0}._v_wrq_rowActions{flex:none;align-items:center;gap:8px;display:flex}._v_wrq_packRow{flex-direction:column;gap:8px;min-width:0;padding-bottom:14px;display:flex}._v_wrq_packRow>._v_wrq_settingRow{border-bottom:0;padding-bottom:6px}._v_wrq_packRow:has(>._v_wrq_packFeedback:empty):not(:has(>._v_wrq_importBar))>._v_wrq_settingRow{padding-bottom:0}._v_wrq_rows>._v_wrq_packRow:not(:last-child){border-bottom:.5px solid var(--dsw-alias-border-l2)}._v_wrq_importBar{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-module-platform);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:13px;font-weight:500;line-height:20px;overflow:hidden}._v_wrq_importBar small{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._v_wrq_packFeedback{gap:4px;display:grid}._v_wrq_packFeedback:empty{display:none}._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_readOnlyNotice{color:var(--dsw-alias-label-tertiary);margin:0 0 -20px;font-size:12px;line-height:18px}._v_wrq_packSuccess{color:var(--dsw-alias-state-success-primary)}._v_wrq_syncRow{flex-direction:column;gap:8px;min-width:0;padding-bottom:14px;display:flex}._v_wrq_syncRow>._v_wrq_settingRow,._v_wrq_syncRow>._v_wrq_toggleRow{border-bottom:0;padding-bottom:6px}._v_wrq_rows>._v_wrq_syncRow:not(:last-child){border-bottom:.5px solid var(--dsw-alias-border-l2)}._v_wrq_syncState{flex-wrap:wrap;align-items:center;gap:4px 10px;min-width:0;display:flex}._v_wrq_syncState>span{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_syncSuccess{color:var(--dsw-alias-state-success-primary)}._v_wrq_syncPanel{border:.5px solid var(--dsw-alias-settings-card-stroke);border-radius:var(--dsw-radius-xl);flex-direction:column;min-width:0;padding:2px 16px;display:flex}._v_wrq_syncPanel>._v_wrq_settingRow{padding:12px 0}._v_wrq_syncPanel>p{overflow-wrap:anywhere;margin:12px 0;font-size:12px;line-height:18px}._v_wrq_syncPanel>:last-child,._v_wrq_syncPanel>:last-child>._v_wrq_settingRow:last-child{border-bottom:0}._v_wrq_syncFeedbackLine{padding-top:2px;display:block}._v_wrq_syncWarning{border-radius:var(--dsw-radius-md);min-width:0;color:var(--dsw-alias-state-warn-label,var(--dsw-alias-label-secondary));background:var(--dsw-alias-state-warn-tertiary,var(--dsw-alias-bg-module-platform));flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 12px;margin:10px 0 2px;padding:6px 6px 6px 12px;font-size:12px;line-height:18px;display:flex}._v_wrq_syncWarning>span{overflow-wrap:anywhere;min-width:0}._v_wrq_syncConnect{border-bottom:.5px solid var(--dsw-alias-border-l2);flex-direction:column;gap:4px;min-width:0;padding-bottom:14px;display:flex}._v_wrq_syncConnect>._v_wrq_settingRow{border-bottom:0;padding-bottom:4px}._v_wrq_syncRepositoryState{flex-direction:column;gap:2px;min-width:0;display:flex}._v_wrq_syncRepositoryName{min-width:0;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._v_wrq_syncStateLine{flex-wrap:wrap;align-items:center;gap:4px 6px;min-width:0;display:inline-flex}._v_wrq_syncStateLine[data-tone=error]>span{color:var(--dsw-alias-state-error-primary)}._v_wrq_syncInlineAction{appearance:none;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;text-decoration:underline;text-decoration-color:var(--dsw-alias-border-l4);text-underline-offset:2px;background:0 0;border:0;padding:0;font-size:12px;line-height:18px}._v_wrq_syncInlineAction:hover:not(:disabled){color:var(--dsw-alias-label-primary);text-decoration-color:currentColor}._v_wrq_syncInlineAction:disabled{cursor:default;opacity:.5}._v_wrq_syncInlineAction:focus-visible{border-radius:var(--dsw-radius-xs);box-shadow:0 0 0 2px var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline:none}._v_wrq_syncFieldLabel{min-width:0;color:var(--dsw-alias-label-primary);justify-content:space-between;align-items:center;gap:8px;font-size:13px;font-weight:500;line-height:20px;display:flex}._v_wrq_syncFieldLabel>label{font:inherit}._v_wrq_fieldGrid>._v_wrq_syncFieldBox{flex-direction:column;gap:6px;min-width:0;display:flex}._v_wrq_fieldGrid label small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;font-weight:400;line-height:18px}._v_wrq_fieldGrid label small._v_wrq_error{color:var(--dsw-alias-state-error-primary)}._v_wrq_editor ._v_wrq_error,._v_wrq_editor ._v_wrq_syncSuccess{overflow-wrap:anywhere;margin:0;font-size:12px;line-height:18px}._v_wrq_syncAccount{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_syncAccount>span{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;font-size:13px;line-height:20px}._v_wrq_syncDevice{gap:8px;min-width:0;display:grid}._v_wrq_syncCode{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_syncCode>code{border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-1);font-family:var(--ds-font-family-code,ui-monospace, monospace);letter-spacing:.08em;user-select:all;padding:4px 12px;font-size:16px;font-weight:500;line-height:24px}._v_wrq_syncPicker{gap:8px;min-width:0;display:grid}._v_wrq_syncRepositoryList{border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-1);flex-direction:column;min-width:0;max-height:264px;margin:0;padding:0;list-style:none;display:flex;overflow:auto}._v_wrq_syncRepositoryList>li{border-bottom:.5px solid var(--dsw-alias-border-l2);min-width:0}._v_wrq_syncRepositoryList>li:last-child{border-bottom:0}._v_wrq_syncRepositoryList>li._v_wrq_editorNote{padding:10px 12px}._v_wrq_syncRepositoryOption{appearance:none;width:100%;min-width:0;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:8px 12px;font-size:13px;line-height:20px;display:flex}._v_wrq_syncRepositoryOption>span{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}._v_wrq_syncRepositoryOption:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}._v_wrq_syncRepositoryOption:disabled{cursor:default;opacity:.5}._v_wrq_syncRepositoryOption[aria-current=true]>span{font-weight:500}._v_wrq_syncRepositoryOption:focus-visible{box-shadow:inset 0 0 0 2px var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline:none}._v_wrq_syncAdvanced{flex-direction:column;gap:4px;min-width:0;padding-bottom:12px;display:flex}._v_wrq_syncDisclosure{appearance:none;width:100%;min-width:0;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:10px;padding:12px 0 8px;display:flex}._v_wrq_syncDisclosure>span{color:var(--dsw-alias-label-primary);flex:none;font-size:14px;line-height:22px}._v_wrq_syncDisclosure>small{min-width:0;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:12px;line-height:18px;overflow:hidden}._v_wrq_syncDisclosure[aria-expanded=true] ._v_wrq_providerChevron{transform:rotate(180deg)}._v_wrq_syncDisclosure:focus-visible{border-radius:var(--dsw-radius-md);box-shadow:0 0 0 2px var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline:none}._v_wrq_editor>._v_wrq_inlineChoices{align-self:flex-start}._v_wrq_syncChoice{justify-items:start;gap:8px;min-width:0;display:grid}._v_wrq_syncChoice>._v_wrq_fieldGrid{width:100%}._v_wrq_syncDialogBody{gap:12px;min-width:0;display:grid}._v_wrq_syncDialogNote{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;margin:0;font-size:12px;line-height:18px}._v_wrq_syncDialogBody>._v_wrq_error,._v_wrq_syncDialogBody>._v_wrq_syncSuccess{overflow-wrap:anywhere;margin:0;font-size:12px;line-height:18px}._v_wrq_syncHistoryList{margin:0;padding:0;list-style:none;display:grid}._v_wrq_syncHistoryEntry{border-bottom:.5px solid var(--dsw-alias-border-l2);gap:2px;min-width:0;padding:10px 0;display:grid}._v_wrq_syncHistoryEntry:first-child{padding-top:0}._v_wrq_syncHistoryEntry:last-child{border-bottom:0}._v_wrq_syncHistoryHead{flex-wrap:wrap;align-items:center;gap:4px 8px;min-width:0;display:flex}._v_wrq_syncHistoryHead>strong{font-size:13px;font-weight:500;line-height:20px}._v_wrq_syncHistoryHead>span{min-width:0;color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;flex:1;font-size:12px;line-height:18px}._v_wrq_syncHistoryEntry>small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_syncHistoryEntry>._v_wrq_syncHistoryMessage{color:var(--dsw-alias-label-secondary)}._v_wrq_syncCompareList{border:.5px solid var(--dsw-alias-settings-card-stroke);border-radius:var(--dsw-radius-md);margin:0;padding:0;list-style:none;display:grid}._v_wrq_syncCompareList>li{border-bottom:.5px solid var(--dsw-alias-border-l2);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:4px 12px;min-width:0;padding:10px 12px;display:flex}._v_wrq_syncCompareList>li:last-child{border-bottom:0}._v_wrq_syncCompareList>li>span{font-size:13px;line-height:20px}._v_wrq_syncCompareList>li>small{color:var(--dsw-alias-label-tertiary);text-align:right;overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_syncCompareList>li>small[data-differs]{color:var(--dsw-alias-label-primary)}._v_wrq_syncCompareNote{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-module-platform);gap:6px;min-width:0;padding:10px 12px;display:grid}._v_wrq_syncCompareNote>._v_wrq_rowActions{justify-content:flex-start;gap:4px}._v_wrq_syncConflictList{gap:6px;margin:0;padding:0;list-style:none;display:grid}._v_wrq_syncConflict{border-radius:var(--dsw-radius-sm);background:var(--dsw-alias-bg-layer-1);grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:8px;min-width:0;padding:8px 10px;display:grid}._v_wrq_syncConflict>span{overflow-wrap:anywhere;gap:2px;min-width:0;font-size:12px;line-height:18px;display:grid}._v_wrq_syncConflict>span>small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}._v_wrq_reviewList{gap:8px;display:grid}._v_wrq_reviewEntry{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-module-platform);flex-direction:column;gap:6px;min-width:0;padding:10px 12px;display:flex}._v_wrq_reviewEntry>header{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_reviewEntry>small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_reviewEntry>p{overflow-wrap:anywhere;margin:0;font-size:13px;line-height:20px}._v_wrq_reviewTitle{align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_reviewTitle strong{overflow-wrap:anywhere;font-size:13px;font-weight:500;line-height:20px}._v_wrq_reviewOperations{gap:4px;margin:0;padding-left:18px;display:grid}._v_wrq_reviewOperations li{overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_reviewOperations small{color:var(--dsw-alias-label-tertiary);display:block}._v_wrq_reviewOpinions{gap:4px;display:grid}._v_wrq_reviewOpinions>strong{font-size:12px;font-weight:500;line-height:18px}._v_wrq_reviewOpinions>small{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._v_wrq_reviewOpinions>div{overflow-wrap:anywhere;gap:6px;min-width:0;font-size:12px;line-height:18px;display:flex}._v_wrq_reviewOpinions>div strong{color:var(--dsw-alias-label-secondary);flex:none;font-weight:500}._v_wrq_reviewOpinionForm{align-items:center;gap:8px;min-width:0;display:flex}._v_wrq_reviewOpinionForm>input{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);min-width:0;height:34px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;outline:none;flex:auto;padding:0 12px;font-size:13px;line-height:20px}._v_wrq_reviewOpinionForm>input:focus-visible{border-color:var(--dsw-alias-state-business-primary)}._v_wrq_reviewOpinionForm>input:disabled{cursor:default;opacity:.5}._v_wrq_reviewGuidance{gap:4px;display:grid}._v_wrq_reviewGuidance>label{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:500;line-height:18px}._v_wrq_reviewGuidance>input{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);width:100%;height:34px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;outline:none;padding:0 12px;font-size:13px;line-height:20px}._v_wrq_reviewGuidance>input:focus-visible{border-color:var(--dsw-alias-state-business-primary)}._v_wrq_reviewGuidance>input:disabled{cursor:default;opacity:.5}._v_wrq_reviewGuidance>small{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:12px;line-height:18px}._v_wrq_reviewSelection{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px;min-width:0;display:flex}._v_wrq_reviewSelection>small,._v_wrq_reviewSelected{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._v_wrq_reviewOperations>li{gap:2px;display:grid}._v_wrq_reviewOperations>li>label{cursor:pointer;align-items:flex-start;gap:6px;min-width:0;display:flex}._v_wrq_reviewOperations>li>label>input{flex:none;margin:3px 0 0}._v_wrq_reviewOperations>li>label>input:disabled{cursor:default;opacity:.5}._v_wrq_reviewOperations>li[data-applied=true]{opacity:.55}._v_wrq_selector:focus-visible{box-shadow:0 0 0 2px var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline:none}@media (width<=620px){._v_wrq_page{gap:28px}._v_wrq_rowActions{width:100%}._v_wrq_rowActions button{flex:1}._v_wrq_importBar{grid-template-columns:minmax(0,1fr) auto}._v_wrq_importBar>button:last-child{grid-column:1/-1}._v_wrq_reviewOpinionForm{flex-wrap:wrap}._v_wrq_reviewOpinionForm>input{flex:100%}._v_wrq_inlineChoices{width:100%}._v_wrq_inlineChoices label{flex:1}._v_wrq_inlineChoices span{justify-content:center;width:100%}._v_wrq_providerRowHeader{align-items:flex-start;gap:8px}._v_wrq_providerEnableControl{flex-wrap:wrap;justify-content:flex-end;gap:6px;max-width:132px}._v_wrq_providerState{text-overflow:ellipsis;max-width:120px;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_providerChevron,._v_wrq_advanced>summary>svg{transition:none}._v_wrq_miniSpinner{animation:none}}";
666
677
  const tagId$13 = "dsh-mnemon/src/client/MnemonSettingsCard.module.css";
667
678
  if (typeof document !== "undefined") {
668
679
  let tag = document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$13) + "]");
@@ -787,7 +798,6 @@ window.__ModuleLoader__.load({
787
798
  "reviewOperations": "_v_wrq_reviewOperations",
788
799
  "reviewOpinionForm": "_v_wrq_reviewOpinionForm",
789
800
  "reviewOpinions": "_v_wrq_reviewOpinions",
790
- "reviewRules": "_v_wrq_reviewRules",
791
801
  "reviewSelected": "_v_wrq_reviewSelected",
792
802
  "reviewSelection": "_v_wrq_reviewSelection",
793
803
  "reviewTitle": "_v_wrq_reviewTitle",
@@ -808,30 +818,37 @@ window.__ModuleLoader__.load({
808
818
  "surface": "_v_wrq_surface",
809
819
  "switch": "_v_wrq_switch",
810
820
  "syncAccount": "_v_wrq_syncAccount",
811
- "syncBackupComponents": "_v_wrq_syncBackupComponents",
812
- "syncBackupEntry": "_v_wrq_syncBackupEntry",
813
- "syncBackupList": "_v_wrq_syncBackupList",
814
- "syncBackups": "_v_wrq_syncBackups",
815
- "syncBar": "_v_wrq_syncBar",
816
- "syncBlock": "_v_wrq_syncBlock",
817
- "syncCheck": "_v_wrq_syncCheck",
821
+ "syncAdvanced": "_v_wrq_syncAdvanced",
822
+ "syncChoice": "_v_wrq_syncChoice",
818
823
  "syncCode": "_v_wrq_syncCode",
824
+ "syncCompareList": "_v_wrq_syncCompareList",
825
+ "syncCompareNote": "_v_wrq_syncCompareNote",
819
826
  "syncConflict": "_v_wrq_syncConflict",
820
827
  "syncConflictList": "_v_wrq_syncConflictList",
821
- "syncConflictSides": "_v_wrq_syncConflictSides",
828
+ "syncConnect": "_v_wrq_syncConnect",
829
+ "syncDevice": "_v_wrq_syncDevice",
822
830
  "syncDialogBody": "_v_wrq_syncDialogBody",
823
831
  "syncDialogNote": "_v_wrq_syncDialogNote",
824
- "syncDiff": "_v_wrq_syncDiff",
825
- "syncDiffColumns": "_v_wrq_syncDiffColumns",
826
- "syncDiffMeta": "_v_wrq_syncDiffMeta",
827
- "syncFeedback": "_v_wrq_syncFeedback",
828
- "syncField": "_v_wrq_syncField",
829
- "syncForm": "_v_wrq_syncForm",
830
- "syncFormActions": "_v_wrq_syncFormActions",
831
- "syncPlan": "_v_wrq_syncPlan",
832
+ "syncDisclosure": "_v_wrq_syncDisclosure",
833
+ "syncFeedbackLine": "_v_wrq_syncFeedbackLine",
834
+ "syncFieldBox": "_v_wrq_syncFieldBox",
835
+ "syncFieldLabel": "_v_wrq_syncFieldLabel",
836
+ "syncHistoryEntry": "_v_wrq_syncHistoryEntry",
837
+ "syncHistoryHead": "_v_wrq_syncHistoryHead",
838
+ "syncHistoryList": "_v_wrq_syncHistoryList",
839
+ "syncHistoryMessage": "_v_wrq_syncHistoryMessage",
840
+ "syncInlineAction": "_v_wrq_syncInlineAction",
841
+ "syncPanel": "_v_wrq_syncPanel",
842
+ "syncPicker": "_v_wrq_syncPicker",
843
+ "syncRepositoryList": "_v_wrq_syncRepositoryList",
844
+ "syncRepositoryName": "_v_wrq_syncRepositoryName",
845
+ "syncRepositoryOption": "_v_wrq_syncRepositoryOption",
846
+ "syncRepositoryState": "_v_wrq_syncRepositoryState",
832
847
  "syncRow": "_v_wrq_syncRow",
833
848
  "syncState": "_v_wrq_syncState",
849
+ "syncStateLine": "_v_wrq_syncStateLine",
834
850
  "syncSuccess": "_v_wrq_syncSuccess",
851
+ "syncWarning": "_v_wrq_syncWarning",
835
852
  "toggleRow": "_v_wrq_toggleRow",
836
853
  "visuallyHidden": "_v_wrq_visuallyHidden",
837
854
  "warning": "_v_wrq_warning"
@@ -1418,7 +1435,17 @@ window.__ModuleLoader__.load({
1418
1435
  "overview.deletingSpace": "删除中…",
1419
1436
  "common.score": "相关度 {value}",
1420
1437
  "overview.providerEnableHint": "未启用的 Provider 可在“插件 → 可组合记忆”的“记忆空间”页面中启用。",
1421
- "search.citations": "引用"
1438
+ "search.citations": "引用",
1439
+ "overview.rediscoverAction": "重新发现",
1440
+ "overview.rediscovering": "正在发现…",
1441
+ "overview.rediscoverHint": "再次询问已启用的 Provider;新出现的空间会挂载,但不加入召回",
1442
+ "overview.rediscoveryAdded": "发现 {count} 个新空间,尚未加入召回,打开开关即可启用。",
1443
+ "overview.rediscoveryNone": "没有新的空间。",
1444
+ "overview.rediscoveryDisconnected": "{count} 个断开过的空间保持断开;重新保存对应 Provider 的设置可以恢复。",
1445
+ "overview.rediscoveryFailed": "{provider} 无法完成发现:{error}",
1446
+ "overview.rediscoveryTimedOut": "{provider} 没有按时响应,稍后可以再次发现。",
1447
+ "overview.rediscoveryDismiss": "知道了",
1448
+ "overview.newSpace": "新发现"
1422
1449
  };
1423
1450
  var en$1 = {
1424
1451
  "term.space": "Memory Space",
@@ -1776,7 +1803,17 @@ window.__ModuleLoader__.load({
1776
1803
  "overview.deletingSpace": "Deleting…",
1777
1804
  "common.score": "Score {value}",
1778
1805
  "overview.providerEnableHint": "Turn on more Providers on Memory Spaces’ page under Plugins → dsh-mnemon.",
1779
- "search.citations": "Cites"
1806
+ "search.citations": "Cites",
1807
+ "overview.rediscoverAction": "Rediscover",
1808
+ "overview.rediscovering": "Rediscovering…",
1809
+ "overview.rediscoverHint": "Ask the enabled Providers again; new spaces are added without joining recall",
1810
+ "overview.rediscoveryAdded": "New spaces found: {count}. They join recall once you switch them on.",
1811
+ "overview.rediscoveryNone": "No new spaces.",
1812
+ "overview.rediscoveryDisconnected": "Spaces you disconnected stay disconnected: {count}. Save the Provider’s settings again to bring them back.",
1813
+ "overview.rediscoveryFailed": "{provider} could not finish discovery: {error}",
1814
+ "overview.rediscoveryTimedOut": "{provider} did not answer in time; try Rediscover later.",
1815
+ "overview.rediscoveryDismiss": "Dismiss",
1816
+ "overview.newSpace": "New"
1780
1817
  };
1781
1818
  //#endregion
1782
1819
  //#region src/client/locales.ts
@@ -2406,129 +2443,182 @@ window.__ModuleLoader__.load({
2406
2443
  "config.syncSimpleDescription": "把上述组件的数据同步到 Git 仓库;不含第三方 Provider 与密钥",
2407
2444
  "config.syncLoading": "正在读取同步状态…",
2408
2445
  "config.syncUnavailable": "当前 DSH 主机不支持 Mnemon 仓库同步通道。",
2409
- "config.syncNotConfigured": "尚未配置仓库",
2410
- "config.syncGitMissing": "缺少 Git {required} 或更高版本",
2411
- "config.syncRemoteBranchMissing": "远端还没有 {branch} 分支",
2412
- "config.syncRemoteUnreachable": "远端不可达",
2413
- "config.syncRemoteCommit": "远端 {commit}",
2414
- "config.syncTokenSaved": "已保存凭据",
2415
- "config.syncTokenNone": "未保存凭据",
2416
- "config.syncSave": "保存",
2417
- "config.syncSaved": "已保存仓库同步配置。",
2418
- "config.syncFailed": "同步操作失败:{error}",
2419
- "config.syncPush": "推送",
2420
- "config.syncPushing": "推送中…",
2421
- "config.syncPushed": "已推送 {commit}({files} 个文件,{size})。",
2422
- "config.syncPushedLocal": "已提交 {commit},但推送未完成:{reason}",
2423
- "config.syncPushIdle": "远端已是当前内容,没有新的提交。",
2424
- "config.syncPreview": "检查远端",
2425
- "config.syncPreviewing": "检查中…",
2426
- "config.syncPreviewReady": "远端 {commit} · {components} 个组件 · {size}",
2427
- "config.syncPreviewComponents": "{changed}/{total} 个组件与本地不同",
2428
- "config.syncPreviewFiles": "新增 {added} · 缺失 {removed} · 不同 {changed}",
2429
- "config.syncPull": "拉取并合并",
2430
- "config.syncPulling": "拉取中…",
2431
- "config.syncPulled": "已把远端 {commit} 合并到 {root}。",
2432
- "config.syncBackups": "备份历史",
2433
- "config.syncBackupsLoading": "读取中…",
2434
- "config.syncBackupsTitle": "{branch} 上的备份",
2435
- "config.syncBackupsHint": "每次推送在 {subdir} 留下一个提交;这里显示每次备份来自哪台设备、包含什么,一次读一页",
2436
- "config.syncBackupsEmpty": "远端分支上还没有备份。",
2437
- "config.syncBackupsMore": "读取更早的备份",
2438
- "config.syncBackupMeta": "来自 {machine} · {time}",
2439
- "config.syncBackupPushedAt": "推送于 {time}",
2440
- "config.syncBackupComponent": "{component}:{items} 条记忆 · {files} 个文件 · {size}",
2441
- "config.syncBackupNoComponents": "这次提交没有可读的清单。",
2442
- "config.syncBackupUnknownMachine": "未标注设备",
2443
- "config.syncDiffTitle": "与远端 {commit} 的记忆差异(共有 {shared} 条)",
2444
- "config.syncDiffSides": "本地 {local} 条 · 远端 {remote} 条 · 远端来自 {machine}",
2445
- "config.syncDiffTruncated": "差异超过上限,只列出了前一部分。",
2446
- "config.syncDiffTombstones": "远端记录了 {count} 条删除,本机尚未应用。",
2447
- "config.syncDiffLocalOnly": "只在本机({count})",
2448
- "config.syncDiffRemoteOnly": "只在远端({count})",
2449
- "config.syncDiffNone": "没有",
2450
- "config.syncDiffFrom": "来自 {machine}",
2451
- "config.syncDiffClear": "没有冲突:两边没有同一主题的两种写法。",
2452
- "config.syncDiffNothing": "本机与远端没有需要合并的记忆。",
2453
- "config.syncDiffConflicts": "有 {count} 个主题两边写法不同,需要整理。",
2454
- "config.syncDiffHere": "本机",
2455
- "config.syncDiffThere": "远端",
2456
- "config.syncDiffAdditions": "远端还有 {count} 条本机没有的记忆,可以直接新增。",
2457
- "config.syncDiffLocalOnlyNote": "本机还有 {count} 条远端没有的记忆,推送后即可共享。",
2458
- "config.syncDiffHeldBack": "远端还有 {count} 条记忆是本机以前删掉的;直接新增会按删除处理,把它们留在原处。",
2459
- "config.syncDiffAdd": "直接新增",
2460
- "config.syncDiffAdding": "新增中…",
2461
- "config.syncDiffRevive": "恢复这些记忆",
2462
- "config.syncDiffReviving": "恢复中…",
2463
- "config.syncDiffAdded": "已新增远端 {commit} 的记忆到 {root}。",
2464
- "config.syncDiffAddHeld": "其中 {count} 条本机以前删过,仍留在原处;要加回请点“恢复这些记忆”。",
2465
- "config.syncPlanWhere": "这份方案由下方“记忆整理”统一整理、审查与执行。",
2466
- "config.syncPlanGo": "到“记忆整理”处理",
2446
+ "config.syncUnavailableReason": "无法读取同步状态:{error}",
2447
+ "config.syncGitMissing": "同步需要 Git {required} 或更高版本",
2448
+ "config.syncRecheck": "重新检查",
2449
+ "config.syncFixCredentials": "设置凭据",
2450
+ "config.syncRepository": "仓库",
2451
+ "config.syncRepositoryHint": "选择保存记忆的 Git 仓库",
2452
+ "config.syncChange": "更改",
2453
+ "config.syncDisconnect": "断开",
2454
+ "config.syncDisconnectTitle": "断开这个仓库?",
2455
+ "config.syncDisconnectBody": "之后不再同步到 {repository},自动同步也会关闭。本机记忆和仓库里的内容都不会删除;保存的访问令牌会一并移除。",
2456
+ "config.syncDisconnected": "已断开仓库。",
2457
+ "config.syncStateChecking": "正在检查仓库…",
2458
+ "config.syncStateConnected": "已连接",
2459
+ "config.syncStateNewBranch": "已连接 · 首次同步会创建 {branch} 分支",
2460
+ "config.syncNoCredential": "推送需要 GitHub 登录或访问令牌",
2461
+ "config.syncNoCredentialToken": "推送需要访问令牌",
2462
+ "config.syncIssueAuthHttps": "需要凭据,请用 GitHub 登录或填写访问令牌",
2463
+ "config.syncIssueAuthToken": "需要凭据,请填写访问令牌",
2464
+ "config.syncIssueAuthSsh": "SSH 认证失败,请检查这台电脑的 SSH 密钥",
2465
+ "config.syncIssueAuth": "没有访问这个仓库的权限",
2466
+ "config.syncIssueNotFound": "找不到这个仓库,请检查地址和访问权限",
2467
+ "config.syncIssueNotFoundGitHub": "找不到这个仓库,请检查地址;私有仓库需要先登录或填写令牌",
2468
+ "config.syncIssueNetwork": "无法连接到仓库,请检查网络或代理",
2469
+ "config.syncIssueTimeout": "仓库没有及时响应",
2470
+ "config.syncIssueUnknown": "无法读取仓库:{error}",
2471
+ "config.syncViaGitHub": "通过 GitHub @{login}",
2472
+ "config.syncViaGitHubAnonymous": "通过 GitHub 登录",
2473
+ "config.syncViaToken": "使用访问令牌",
2474
+ "config.syncViaEnvironment": "使用环境变量 {env}",
2475
+ "config.syncViaSsh": "使用 SSH 密钥",
2476
+ "config.syncConnectWith": "连接方式",
2477
+ "config.syncModeGitHub": "GitHub 账号",
2478
+ "config.syncModeAddress": "仓库地址",
2467
2479
  "config.syncRepoUrl": "仓库地址",
2468
- "config.syncRepoUrlHint": "HTTPS、SSH 或本机绝对路径;不要把令牌写进地址",
2469
- "config.syncBranch": "分支",
2470
- "config.syncBranchHint": "默认 {branch}",
2471
- "config.syncSubdir": "远端目录",
2472
- "config.syncSubdirHint": "仓库内存放 payload 的目录,默认 {subdir}",
2480
+ "config.syncRepoUrlPlaceholder": "https://…、git@主机:路径 或本机绝对路径",
2481
+ "config.syncRepoUrlInvalid": "地址需要是 https://、ssh://、git@主机:路径 或本机绝对路径",
2482
+ "config.syncRepoUrlCredentials": "不要把令牌写进地址,请填在“访问令牌”里",
2473
2483
  "config.syncToken": "访问令牌",
2474
- "config.syncTokenHint": "只存在本机 {path}(0600);环境变量 {env} 优先",
2475
- "config.syncTokenKeep": "留空表示保持已保存的凭据",
2476
- "config.syncTokenClear": "清除凭据",
2477
- "config.syncTokenClearHint": "保存时删除本机保存的凭据",
2478
- "config.syncAuthorName": "提交者姓名",
2479
- "config.syncAuthorEmail": "提交者邮箱",
2480
- "config.syncAuthorOptional": "可选",
2481
- "config.syncAuthorHint": "留空则使用本机 Git 身份",
2482
- "config.syncAutoBackup": "自动备份",
2483
- "config.syncAutoBackupHint": "按下面的间隔自动推送一次;关闭后只在你点「推送」时推送",
2484
- "config.syncAutoBackupOff": "关闭(只手动)",
2485
- "config.syncAutoBackupHours": "{hours} 小时",
2486
- "config.syncAutoBackupDays": "{days} 天",
2487
- "config.syncAutoBackupSaved": "自动备份已设为 {interval}",
2488
- "config.syncAutoBackupNext": "下次自动备份:{at}",
2489
- "config.syncAutoBackupNever": "自动备份已关闭,只有你点「推送」时才会推送",
2490
- "config.syncAutoBackupLast": "最近一次自动备份:{at}",
2491
- "config.syncAutoBackupFailed": "最近一次自动备份失败:{error}",
2492
- "config.syncCompacted": "已把 {count} 个零散对象收进包,{before} → {after},之后克隆只需下载 {after}",
2493
- "config.syncGitHub": "GitHub 账号",
2494
- "config.syncGitHubHint": "登录后可直接选择或新建仓库,凭据只留在本机",
2495
- "config.syncGitHubUnavailable": "当前 DSH 主机没有可用的凭据存储,请改用访问令牌",
2484
+ "config.syncTokenOptional": "可选",
2485
+ "config.syncTokenSaved": "已保存;输入新令牌可替换",
2486
+ "config.syncTokenEnvironment": "正在使用环境变量 {env}",
2487
+ "config.syncTokenHint": "只有 HTTPS 地址需要令牌,令牌只保存在这台电脑",
2488
+ "config.syncTokenRemove": "移除",
2489
+ "config.syncTokenRemoved": "已移除访问令牌。",
2490
+ "config.syncConnect": "连接",
2491
+ "config.syncConnecting": "连接中…",
2492
+ "config.syncSave": "保存",
2493
+ "config.syncSaving": "保存中…",
2494
+ "config.syncGitHubHint": "登录后可直接选择或新建仓库;授权只保存在这台电脑",
2496
2495
  "config.syncGitHubReadOnly": "当前凭据存储只读,登录无法保存",
2497
2496
  "config.syncGitHubSignIn": "使用 GitHub 登录",
2498
2497
  "config.syncGitHubStarting": "获取设备码…",
2499
- "config.syncGitHubCode": "在 GitHub 输入此设备码:",
2500
- "config.syncGitHubCopy": "复制",
2501
- "config.syncGitHubCopied": "已复制",
2502
- "config.syncGitHubOpen": "打开 GitHub 授权页",
2498
+ "config.syncGitHubCode": "在 GitHub 页面输入这个设备码:",
2499
+ "config.syncGitHubCopyOpen": "复制并打开 GitHub",
2500
+ "config.syncGitHubCopied": "已复制,在打开的页面中粘贴即可;完成后会自动继续",
2501
+ "config.syncGitHubOpenBlocked": "浏览器没有打开新页面,请手动访问 {url}",
2503
2502
  "config.syncGitHubWaiting": "等待授权…完成后会自动继续",
2504
2503
  "config.syncGitHubSignedIn": "已登录 @{login}",
2505
2504
  "config.syncGitHubSignOut": "退出登录",
2506
2505
  "config.syncGitHubFailed": "GitHub 登录失败:{error}",
2507
2506
  "config.syncGitHubExpired": "设备码已过期,请重新登录",
2508
2507
  "config.syncGitHubDenied": "授权已被拒绝",
2509
- "config.syncTokenGitHub": "GitHub 登录",
2510
- "config.syncTokenEnvironment": "使用环境变量凭据",
2511
- "config.syncTokenOptional": "可选:也可以直接填访问令牌",
2512
- "config.syncRepositories": "选择仓库",
2513
- "config.syncRepositoriesHint": "从账号下的仓库中选择",
2514
- "config.syncRepositoriesSignIn": "登录后这里会列出你的仓库,可直接选用或新建;不登录也可以在手填表单里填写地址",
2515
- "config.syncRepositoriesLoading": "读取仓库…",
2516
- "config.syncRepositoriesLoad": "刷新列表",
2517
- "config.syncRepositoriesEmpty": "账号下还没有仓库,可以在下面新建",
2518
- "config.syncRepositoriesChoose": "选择已有仓库…",
2519
- "config.syncRepositoriesPrivate": "私有",
2520
- "config.syncRepositoriesNoPush": "无推送权限",
2521
- "config.syncRepositoryName": "新建仓库",
2522
- "config.syncRepositoryPrivate": "创建为私有仓库",
2523
- "config.syncRepositoryCreate": "新建并选用",
2508
+ "config.syncGitHubExpiredGrant": "GitHub 授权已失效,请重新登录",
2509
+ "config.syncGitHubSignInAgain": "重新登录",
2510
+ "config.syncRepositoryLabel": "仓库",
2511
+ "config.syncRepositorySearch": "搜索仓库,或输入新仓库名",
2512
+ "config.syncRepositoriesLoading": "正在读取仓库…",
2513
+ "config.syncRepositoriesFailed": "读取仓库失败:{error}",
2514
+ "config.syncRepositoriesRetry": "重试",
2515
+ "config.syncRepositoriesNone": "账号下还没有仓库,输入名称即可新建",
2516
+ "config.syncRepositoriesEmpty": "没有匹配的仓库",
2517
+ "config.syncRepositoriesMore": "还有 {count} 个仓库,输入名称缩小范围",
2518
+ "config.syncRepositoryPrivate": "私有",
2519
+ "config.syncRepositoryPublic": "公开",
2520
+ "config.syncRepositoryNoPush": "无推送权限",
2521
+ "config.syncRepositoryCurrent": "当前",
2522
+ "config.syncRepositoryCreate": "新建私有仓库 {name}",
2524
2523
  "config.syncRepositoryCreating": "创建中…",
2525
- "config.syncRepositoryCreated": "已新建 {name}。",
2524
+ "config.syncRepositoryNameInvalid": "仓库名只能包含字母、数字、点、短横线和下划线",
2525
+ "config.syncPublicTitle": "使用公开仓库?",
2526
+ "config.syncPublicBody": "{name} 是公开仓库:同步后任何人都能看到这些记忆。",
2527
+ "config.syncPublicConfirm": "仍然使用",
2528
+ "config.syncRowTitle": "同步",
2529
+ "config.syncNever": "同步时先合并仓库里的记忆,再推送本机的",
2530
+ "config.syncLast": "上次同步:{time}",
2531
+ "config.syncLastMerge": "上次合并:{time}",
2532
+ "config.syncCheck": "检查远端",
2533
+ "config.syncNow": "立即同步",
2534
+ "config.syncNowRunning": "同步中…",
2535
+ "config.syncDone": "已同步,推送了 {commit}。",
2536
+ "config.syncDoneMerged": "已同步:合并了 {count} 条远端记忆,推送了 {commit}。",
2537
+ "config.syncUpToDate": "已是最新,仓库与本机一致。",
2538
+ "config.syncUpToDateMerged": "合并了 {count} 条远端记忆,仓库已是最新。",
2539
+ "config.syncPushFailed": "已在本机提交,但推送没有完成:{reason}",
2540
+ "config.syncFailed": "同步失败:{error}",
2541
+ "config.syncReasonBusy": "另一个同步操作还在进行,请稍后再试",
2542
+ "config.syncReasonNoRepository": "还没有连接仓库",
2543
+ "config.syncReasonGitMissing": "这台电脑的 Git 不可用",
2544
+ "config.syncReasonRemoteEmpty": "仓库里还没有备份,先同步一次",
2545
+ "config.syncReasonRejected": "同步时仓库又被其他设备更新了,请再同步一次",
2546
+ "config.syncAuto": "自动同步",
2547
+ "config.syncAutoOff": "关闭",
2548
+ "config.syncAutoHour": "每小时",
2549
+ "config.syncAutoHours": "每 {hours} 小时",
2550
+ "config.syncAutoDay": "每天",
2551
+ "config.syncAutoDays": "每 {days} 天",
2552
+ "config.syncAutoHintOff": "只在你点“立即同步”时同步",
2553
+ "config.syncAutoHintOn": "按间隔在后台同步,和“立即同步”做的事一样",
2554
+ "config.syncAutoNext": "下次 {time}",
2555
+ "config.syncAutoLast": "上次 {time}",
2556
+ "config.syncAutoFailed": "上次自动同步失败:{error}",
2557
+ "config.syncHistory": "备份历史",
2558
+ "config.syncHistoryHint": "每次同步都在仓库里留下一个版本",
2559
+ "config.syncHistoryView": "查看",
2560
+ "config.syncHistoryLoading": "正在读取…",
2561
+ "config.syncHistoryEmpty": "仓库里还没有备份。",
2562
+ "config.syncHistoryMore": "读取更早的版本",
2563
+ "config.syncHistoryCapped": "这里只列出最近的 {count} 个版本",
2564
+ "config.syncHistoryFrom": "来自 {machine}",
2565
+ "config.syncHistoryUnknownMachine": "未标注设备",
2566
+ "config.syncComponentRuntime": "运行时记忆",
2567
+ "config.syncComponentDocuments": "项目档案",
2568
+ "config.syncComponentSpaces": "记忆空间",
2569
+ "config.syncCountRuntime": "运行时记忆 {count} 条",
2570
+ "config.syncCountDocuments": "项目档案 {count} 份",
2571
+ "config.syncCountSpaces": "记忆空间 {count} 个",
2572
+ "config.syncCompareTitle": "与远端比较",
2573
+ "config.syncCompareLoading": "正在读取远端…",
2574
+ "config.syncCompareRemote": "远端版本来自 {machine} · {time}",
2575
+ "config.syncCompareSame": "一致",
2576
+ "config.syncCompareDiffers": "有差异",
2577
+ "config.syncCompareRuntime": "远端独有 {remote} 条 · 本机独有 {local} 条",
2578
+ "config.syncCompareConflicts": "{count} 处写法不同",
2579
+ "config.syncCompareAllSame": "本机与远端一致,不需要同步。",
2580
+ "config.syncCompareTruncated": "差异较多,只统计了一部分。",
2581
+ "config.syncCompareRemovals": "远端记录了 {count} 条删除,同步时会在本机应用。",
2582
+ "config.syncCompareConflictNote": "{count} 个主题两边写法不同:同步会保留两种写法,之后可以用“记忆整理”合并。",
2583
+ "config.syncCompareShowConflicts": "查看",
2584
+ "config.syncCompareGoReview": "去记忆整理",
2585
+ "config.syncCompareHeldBack": "远端有 {count} 条记忆是本机以前删掉的,同步不会把它们加回。",
2586
+ "config.syncCompareRevive": "恢复这些记忆",
2587
+ "config.syncCompareReviving": "恢复中…",
2588
+ "config.syncCompareRevived": "已恢复 {count} 条记忆。",
2589
+ "config.syncDiffHere": "本机",
2590
+ "config.syncDiffThere": "远端",
2591
+ "config.syncMergeOnly": "只合并到本机",
2592
+ "config.syncMerging": "合并中…",
2593
+ "config.syncMerged": "已合并远端 {commit}。",
2594
+ "config.syncMergedCount": "已合并 {count} 条远端记忆。",
2595
+ "config.syncAdvanced": "高级设置",
2596
+ "config.syncBranch": "分支",
2597
+ "config.syncSubdir": "仓库内目录",
2598
+ "config.syncDefaultValue": "默认 {value}",
2599
+ "config.syncBranchInvalid": "分支名无效",
2600
+ "config.syncSubdirInvalid": "需要是仓库内的相对目录",
2601
+ "config.syncAuthor": "提交者",
2602
+ "config.syncAuthorDefault": "默认",
2603
+ "config.syncAuthorMachine": "本机 Git",
2604
+ "config.syncAuthorCustom": "自定义",
2605
+ "config.syncAuthorDefaultNote": "以 {identity} 提交",
2606
+ "config.syncAuthorMachineNote": "使用这台电脑的 Git 身份;没有配置时用默认身份",
2607
+ "config.syncAuthorName": "姓名",
2608
+ "config.syncAuthorEmail": "邮箱",
2609
+ "config.syncAuthorEmailInvalid": "邮箱格式不正确",
2610
+ "config.syncAdvancedNote": "保存后,下次同步写到新的分支或目录",
2611
+ "config.syncMachineName": "这台电脑的名称",
2612
+ "config.syncMachineHostname": "主机名",
2613
+ "config.syncMachineCustom": "自定义",
2614
+ "config.syncMachineNameLabel": "名称",
2615
+ "config.syncMachineHostnameNote": "使用主机名,备份历史里显示为“来自 {name}”",
2616
+ "config.syncMachineCustomNote": "备份历史里显示为“来自 {name}”",
2617
+ "config.syncMachineNameInvalid": "名称最多 120 个字符,且只能占一行",
2618
+ "config.syncMachineRenameNote": "保存后,之后的同步使用新名称;已有的版本保留原来的名称",
2619
+ "config.syncAdvancedSaved": "已保存高级设置。",
2526
2620
  "config.reconcileTitle": "记忆整理",
2527
2621
  "config.reconcileDescription": "模型读合并后的记忆,只提出建议,等你审查后才写入",
2528
- "review.rulesTitle": "运行规则",
2529
- "review.rulesPull": "后台拉取:后台只按「Git 同步」里「自动备份」的间隔推送一次,推送前先读取远端分支并与本机合并;这一步不产生任何建议。自动备份关闭时,只有你点「推送」才会读取远端。",
2530
- "review.rulesDiff": "差异:只有点「检查远端」或推送前的合并才会读出远端与本机的差别;差别只显示出来,不会自动写入。",
2531
- "review.rulesPlan": "方案:只有点「整理记忆」才会生成待办方案,每条方案都要你接受并应用之后才会真正写入记忆。",
2532
2622
  "review.reconcile": "整理记忆",
2533
2623
  "review.reconciling": "整理中…",
2534
2624
  "review.refresh": "刷新",
@@ -3208,129 +3298,182 @@ window.__ModuleLoader__.load({
3208
3298
  "config.syncSimpleDescription": "Syncs the components above to a Git repository, without third-party providers or credentials",
3209
3299
  "config.syncLoading": "Reading the sync status…",
3210
3300
  "config.syncUnavailable": "This DSH host does not provide the Mnemon repository sync channel.",
3211
- "config.syncNotConfigured": "No repository yet",
3212
- "config.syncGitMissing": "Git {required} or newer is unavailable",
3213
- "config.syncRemoteBranchMissing": "The remote has no {branch} branch yet",
3214
- "config.syncRemoteUnreachable": "The remote is unreachable",
3215
- "config.syncRemoteCommit": "Remote {commit}",
3216
- "config.syncTokenSaved": "Token saved",
3217
- "config.syncTokenNone": "No token saved",
3218
- "config.syncSave": "Save",
3219
- "config.syncSaved": "Saved the repository sync configuration.",
3220
- "config.syncFailed": "Sync operation failed: {error}",
3221
- "config.syncPush": "Push",
3222
- "config.syncPushing": "Pushing…",
3223
- "config.syncPushed": "Pushed {commit} ({files} files, {size}).",
3224
- "config.syncPushedLocal": "Committed {commit}, but the push did not finish: {reason}",
3225
- "config.syncPushIdle": "The remote already holds this payload; nothing to commit.",
3226
- "config.syncPreview": "Check remote",
3227
- "config.syncPreviewing": "Checking…",
3228
- "config.syncPreviewReady": "Remote {commit} · {components} components · {size}",
3229
- "config.syncPreviewComponents": "{changed} of {total} components differ from local",
3230
- "config.syncPreviewFiles": "{added} added · {removed} missing · {changed} changed",
3231
- "config.syncPull": "Pull and merge",
3232
- "config.syncPulling": "Pulling…",
3233
- "config.syncPulled": "Merged remote {commit} into {root}.",
3234
- "config.syncBackups": "Backups",
3235
- "config.syncBackupsLoading": "Reading…",
3236
- "config.syncBackupsTitle": "Backups on {branch}",
3237
- "config.syncBackupsHint": "Each push leaves one commit in {subdir}; this lists which installation published what, one page at a time",
3238
- "config.syncBackupsEmpty": "The branch holds no backup yet.",
3239
- "config.syncBackupsMore": "Load older backups",
3240
- "config.syncBackupMeta": "From {machine} · {time}",
3241
- "config.syncBackupPushedAt": "Pushed at {time}",
3242
- "config.syncBackupComponent": "{component}: {items} memories · {files} files · {size}",
3243
- "config.syncBackupNoComponents": "This commit holds no readable manifest.",
3244
- "config.syncBackupUnknownMachine": "Unattributed installation",
3245
- "config.syncDiffTitle": "Memory differences against remote {commit} ({shared} shared)",
3246
- "config.syncDiffSides": "{local} locally · {remote} remotely · remote from {machine}",
3247
- "config.syncDiffTruncated": "More differences exist than this list states.",
3248
- "config.syncDiffTombstones": "The branch recorded {count} removals this installation has not applied.",
3249
- "config.syncDiffLocalOnly": "Only here ({count})",
3250
- "config.syncDiffRemoteOnly": "Only remotely ({count})",
3251
- "config.syncDiffNone": "None",
3252
- "config.syncDiffFrom": "from {machine}",
3253
- "config.syncDiffClear": "No conflict: the two sides state no subject twice.",
3254
- "config.syncDiffNothing": "Nothing here and on the branch needs merging.",
3255
- "config.syncDiffConflicts": "{count} subjects are written differently on the two sides and need reconciling.",
3256
- "config.syncDiffHere": "Here",
3257
- "config.syncDiffThere": "Branch",
3258
- "config.syncDiffAdditions": "The branch also holds {count} memories this installation does not have; they can simply be added.",
3259
- "config.syncDiffLocalOnlyNote": "This installation also holds {count} memories the branch does not have; a push shares them.",
3260
- "config.syncDiffHeldBack": "The branch also holds {count} memories this installation deleted earlier; adding them honors that deletion and leaves them where they are.",
3261
- "config.syncDiffAdd": "Add them",
3262
- "config.syncDiffAdding": "Adding…",
3263
- "config.syncDiffRevive": "Bring them back",
3264
- "config.syncDiffReviving": "Bringing back…",
3265
- "config.syncDiffAdded": "Added the memories from remote {commit} into {root}.",
3266
- "config.syncDiffAddHeld": "{count} of them were deleted here earlier and stayed out; bring them back with “Bring them back”.",
3267
- "config.syncPlanWhere": "Memory reconciliation below is where this plan is made, reviewed and applied.",
3268
- "config.syncPlanGo": "Go to Memory reconciliation",
3269
- "config.syncRepoUrl": "Repository URL",
3270
- "config.syncRepoUrlHint": "HTTPS, SSH, or an absolute local path; never put the token in the URL",
3271
- "config.syncBranch": "Branch",
3272
- "config.syncBranchHint": "Defaults to {branch}",
3273
- "config.syncSubdir": "Remote directory",
3274
- "config.syncSubdirHint": "Where the payload lives inside the repository; defaults to {subdir}",
3301
+ "config.syncUnavailableReason": "Could not read the sync status: {error}",
3302
+ "config.syncGitMissing": "Syncing needs Git {required} or newer",
3303
+ "config.syncRecheck": "Check again",
3304
+ "config.syncFixCredentials": "Set credentials",
3305
+ "config.syncRepository": "Repository",
3306
+ "config.syncRepositoryHint": "Choose the Git repository that keeps your memory",
3307
+ "config.syncChange": "Change",
3308
+ "config.syncDisconnect": "Disconnect",
3309
+ "config.syncDisconnectTitle": "Disconnect this repository?",
3310
+ "config.syncDisconnectBody": "Memory stops syncing to {repository}, and automatic sync turns off. Nothing is deleted here or in the repository; a saved access token is removed.",
3311
+ "config.syncDisconnected": "Disconnected the repository.",
3312
+ "config.syncStateChecking": "Checking the repository…",
3313
+ "config.syncStateConnected": "Connected",
3314
+ "config.syncStateNewBranch": "Connected · the first sync creates the {branch} branch",
3315
+ "config.syncNoCredential": "pushing needs a GitHub sign-in or an access token",
3316
+ "config.syncNoCredentialToken": "pushing needs an access token",
3317
+ "config.syncIssueAuthHttps": "Needs credentials; sign in with GitHub or add an access token",
3318
+ "config.syncIssueAuthToken": "Needs credentials; add an access token",
3319
+ "config.syncIssueAuthSsh": "SSH authentication failed; check this computer's SSH key",
3320
+ "config.syncIssueAuth": "Access to this repository was refused",
3321
+ "config.syncIssueNotFound": "Repository not found; check the address and your access",
3322
+ "config.syncIssueNotFoundGitHub": "Repository not found; check the address, as a private repository needs a sign-in or a token",
3323
+ "config.syncIssueNetwork": "Cannot reach the repository; check the network or proxy",
3324
+ "config.syncIssueTimeout": "The repository did not answer in time",
3325
+ "config.syncIssueUnknown": "Cannot read the repository: {error}",
3326
+ "config.syncViaGitHub": "via GitHub @{login}",
3327
+ "config.syncViaGitHubAnonymous": "via a GitHub sign-in",
3328
+ "config.syncViaToken": "with an access token",
3329
+ "config.syncViaEnvironment": "with the {env} environment variable",
3330
+ "config.syncViaSsh": "with an SSH key",
3331
+ "config.syncConnectWith": "Connect with",
3332
+ "config.syncModeGitHub": "GitHub account",
3333
+ "config.syncModeAddress": "Repository address",
3334
+ "config.syncRepoUrl": "Repository address",
3335
+ "config.syncRepoUrlPlaceholder": "https://…, git@host:path, or an absolute local path",
3336
+ "config.syncRepoUrlInvalid": "Use an https:// or ssh:// URL, git@host:path, or an absolute local path",
3337
+ "config.syncRepoUrlCredentials": "Keep the token out of the address; enter it under Access token",
3275
3338
  "config.syncToken": "Access token",
3276
- "config.syncTokenHint": "Stored only on this machine at {path} (0600); the {env} environment variable wins",
3277
- "config.syncTokenKeep": "Leave empty to keep the saved token",
3278
- "config.syncTokenClear": "Clear token",
3279
- "config.syncTokenClearHint": "Deletes the token stored on this machine when you save",
3280
- "config.syncAuthorName": "Commit author name",
3281
- "config.syncAuthorEmail": "Commit author email",
3282
- "config.syncAuthorOptional": "Optional",
3283
- "config.syncAuthorHint": "Leave empty to use the Git identity of this machine",
3284
- "config.syncAutoBackup": "Automatic backup",
3285
- "config.syncAutoBackupHint": "Pushes once per interval below; switched off, the branch only moves when you press Push",
3286
- "config.syncAutoBackupOff": "Off (manual only)",
3287
- "config.syncAutoBackupHours": "{hours} hours",
3288
- "config.syncAutoBackupDays": "{days} days",
3289
- "config.syncAutoBackupSaved": "Automatic backup set to {interval}",
3290
- "config.syncAutoBackupNext": "Next automatic backup: {at}",
3291
- "config.syncAutoBackupNever": "Automatic backup is off; the branch moves only when you press Push",
3292
- "config.syncAutoBackupLast": "Last automatic backup: {at}",
3293
- "config.syncAutoBackupFailed": "The last automatic backup failed: {error}",
3294
- "config.syncCompacted": "Folded {count} loose objects into a pack, {before} → {after}; a clone now downloads {after}",
3295
- "config.syncGitHub": "GitHub account",
3296
- "config.syncGitHubHint": "Sign in to pick or create a repository; the grant stays on this machine",
3297
- "config.syncGitHubUnavailable": "This DSH host has no credentials store; use an access token instead",
3339
+ "config.syncTokenOptional": "Optional",
3340
+ "config.syncTokenSaved": "Saved; type a new one to replace it",
3341
+ "config.syncTokenEnvironment": "Using the {env} environment variable",
3342
+ "config.syncTokenHint": "Only an HTTPS address needs a token; it stays on this computer",
3343
+ "config.syncTokenRemove": "Remove",
3344
+ "config.syncTokenRemoved": "Removed the access token.",
3345
+ "config.syncConnect": "Connect",
3346
+ "config.syncConnecting": "Connecting…",
3347
+ "config.syncSave": "Save",
3348
+ "config.syncSaving": "Saving…",
3349
+ "config.syncGitHubHint": "Sign in to pick or create a repository; the grant stays on this computer",
3298
3350
  "config.syncGitHubReadOnly": "The credentials store is read-only, so a sign-in cannot be saved",
3299
3351
  "config.syncGitHubSignIn": "Sign in with GitHub",
3300
3352
  "config.syncGitHubStarting": "Requesting a device code…",
3301
3353
  "config.syncGitHubCode": "Enter this device code on GitHub:",
3302
- "config.syncGitHubCopy": "Copy",
3303
- "config.syncGitHubCopied": "Copied",
3304
- "config.syncGitHubOpen": "Open the GitHub authorization page",
3354
+ "config.syncGitHubCopyOpen": "Copy and open GitHub",
3355
+ "config.syncGitHubCopied": "Copied; paste it on the page that opened, and this continues on its own",
3356
+ "config.syncGitHubOpenBlocked": "The browser did not open a new page; visit {url} yourself",
3305
3357
  "config.syncGitHubWaiting": "Waiting for authorization… this continues on its own",
3306
3358
  "config.syncGitHubSignedIn": "Signed in as @{login}",
3307
3359
  "config.syncGitHubSignOut": "Sign out",
3308
3360
  "config.syncGitHubFailed": "GitHub sign-in failed: {error}",
3309
3361
  "config.syncGitHubExpired": "The device code expired; start the sign-in again",
3310
3362
  "config.syncGitHubDenied": "The authorization was denied",
3311
- "config.syncTokenGitHub": "GitHub sign-in",
3312
- "config.syncTokenEnvironment": "Credential from the environment",
3313
- "config.syncTokenOptional": "Optional: an access token also works",
3314
- "config.syncRepositories": "Choose a repository",
3315
- "config.syncRepositoriesHint": "Pick one of the repositories this account can reach",
3316
- "config.syncRepositoriesSignIn": "Sign in and this lists the repositories you can use, or create one; an address typed below works without a sign-in",
3363
+ "config.syncGitHubExpiredGrant": "The GitHub grant is no longer valid; sign in again",
3364
+ "config.syncGitHubSignInAgain": "Sign in again",
3365
+ "config.syncRepositoryLabel": "Repository",
3366
+ "config.syncRepositorySearch": "Search repositories, or type a new name",
3317
3367
  "config.syncRepositoriesLoading": "Reading repositories…",
3318
- "config.syncRepositoriesLoad": "Refresh list",
3319
- "config.syncRepositoriesEmpty": "This account has no repository yet; create one below",
3320
- "config.syncRepositoriesChoose": "Choose a repository…",
3321
- "config.syncRepositoriesPrivate": "private",
3322
- "config.syncRepositoriesNoPush": "no push access",
3323
- "config.syncRepositoryName": "New repository",
3324
- "config.syncRepositoryPrivate": "Create it private",
3325
- "config.syncRepositoryCreate": "Create and use it",
3368
+ "config.syncRepositoriesFailed": "Could not read repositories: {error}",
3369
+ "config.syncRepositoriesRetry": "Retry",
3370
+ "config.syncRepositoriesNone": "This account has no repository yet; type a name to create one",
3371
+ "config.syncRepositoriesEmpty": "No matching repository",
3372
+ "config.syncRepositoriesMore": "{count} more repositories; type to narrow the list",
3373
+ "config.syncRepositoryPrivate": "Private",
3374
+ "config.syncRepositoryPublic": "Public",
3375
+ "config.syncRepositoryNoPush": "No push access",
3376
+ "config.syncRepositoryCurrent": "Current",
3377
+ "config.syncRepositoryCreate": "Create the private repository {name}",
3326
3378
  "config.syncRepositoryCreating": "Creating…",
3327
- "config.syncRepositoryCreated": "Created {name}.",
3379
+ "config.syncRepositoryNameInvalid": "A repository name holds letters, digits, dots, dashes and underscores",
3380
+ "config.syncPublicTitle": "Use a public repository?",
3381
+ "config.syncPublicBody": "{name} is public: anyone can read the memory synced to it.",
3382
+ "config.syncPublicConfirm": "Use it anyway",
3383
+ "config.syncRowTitle": "Sync",
3384
+ "config.syncNever": "A sync merges the repository's memory here, then pushes this computer's",
3385
+ "config.syncLast": "Last synced {time}",
3386
+ "config.syncLastMerge": "Last merged {time}",
3387
+ "config.syncCheck": "Check remote",
3388
+ "config.syncNow": "Sync now",
3389
+ "config.syncNowRunning": "Syncing…",
3390
+ "config.syncDone": "Synced; pushed {commit}.",
3391
+ "config.syncDoneMerged": "Synced: merged {count} remote memories and pushed {commit}.",
3392
+ "config.syncUpToDate": "Up to date; the repository matches this computer.",
3393
+ "config.syncUpToDateMerged": "Merged {count} remote memories; the repository is up to date.",
3394
+ "config.syncPushFailed": "Committed here, but the push did not finish: {reason}",
3395
+ "config.syncFailed": "Sync failed: {error}",
3396
+ "config.syncReasonBusy": "Another sync is still running; try again shortly",
3397
+ "config.syncReasonNoRepository": "No repository is connected",
3398
+ "config.syncReasonGitMissing": "This computer's Git is unavailable",
3399
+ "config.syncReasonRemoteEmpty": "The repository holds no backup yet; sync once first",
3400
+ "config.syncReasonRejected": "Another device updated the repository during the sync; sync again",
3401
+ "config.syncAuto": "Automatic sync",
3402
+ "config.syncAutoOff": "Off",
3403
+ "config.syncAutoHour": "Every hour",
3404
+ "config.syncAutoHours": "Every {hours} hours",
3405
+ "config.syncAutoDay": "Every day",
3406
+ "config.syncAutoDays": "Every {days} days",
3407
+ "config.syncAutoHintOff": "Syncs only when you press Sync now",
3408
+ "config.syncAutoHintOn": "Syncs in the background at this interval, exactly as Sync now does",
3409
+ "config.syncAutoNext": "Next at {time}",
3410
+ "config.syncAutoLast": "Last at {time}",
3411
+ "config.syncAutoFailed": "The last automatic sync failed: {error}",
3412
+ "config.syncHistory": "Backup history",
3413
+ "config.syncHistoryHint": "Every sync leaves a version in the repository",
3414
+ "config.syncHistoryView": "View",
3415
+ "config.syncHistoryLoading": "Reading…",
3416
+ "config.syncHistoryEmpty": "The repository holds no backup yet.",
3417
+ "config.syncHistoryMore": "Load earlier versions",
3418
+ "config.syncHistoryCapped": "Only the latest {count} versions are listed here",
3419
+ "config.syncHistoryFrom": "from {machine}",
3420
+ "config.syncHistoryUnknownMachine": "an unnamed computer",
3421
+ "config.syncComponentRuntime": "Runtime Memory",
3422
+ "config.syncComponentDocuments": "Project Documents",
3423
+ "config.syncComponentSpaces": "Memory Spaces",
3424
+ "config.syncCountRuntime": "{count} runtime memories",
3425
+ "config.syncCountDocuments": "{count} documents",
3426
+ "config.syncCountSpaces": "{count} memory spaces",
3427
+ "config.syncCompareTitle": "Compare with the remote",
3428
+ "config.syncCompareLoading": "Reading the remote…",
3429
+ "config.syncCompareRemote": "The remote version is from {machine} · {time}",
3430
+ "config.syncCompareSame": "Same",
3431
+ "config.syncCompareDiffers": "Differs",
3432
+ "config.syncCompareRuntime": "{remote} only on the remote · {local} only here",
3433
+ "config.syncCompareConflicts": "{count} written differently",
3434
+ "config.syncCompareAllSame": "This computer and the remote match; there is nothing to sync.",
3435
+ "config.syncCompareTruncated": "More differences exist than these counts show.",
3436
+ "config.syncCompareRemovals": "The remote recorded {count} deletions; a sync applies them here.",
3437
+ "config.syncCompareConflictNote": "{count} subjects are written differently: a sync keeps both, and Memory reconciliation can merge them later.",
3438
+ "config.syncCompareShowConflicts": "Show",
3439
+ "config.syncCompareGoReview": "Go to Memory reconciliation",
3440
+ "config.syncCompareHeldBack": "{count} remote memories were deleted here earlier; a sync keeps them out.",
3441
+ "config.syncCompareRevive": "Bring them back",
3442
+ "config.syncCompareReviving": "Bringing back…",
3443
+ "config.syncCompareRevived": "Brought back {count} memories.",
3444
+ "config.syncDiffHere": "Here",
3445
+ "config.syncDiffThere": "Remote",
3446
+ "config.syncMergeOnly": "Merge here only",
3447
+ "config.syncMerging": "Merging…",
3448
+ "config.syncMerged": "Merged remote {commit}.",
3449
+ "config.syncMergedCount": "Merged {count} remote memories.",
3450
+ "config.syncAdvanced": "Advanced",
3451
+ "config.syncBranch": "Branch",
3452
+ "config.syncSubdir": "Directory in the repository",
3453
+ "config.syncDefaultValue": "Default {value}",
3454
+ "config.syncBranchInvalid": "Not a valid branch name",
3455
+ "config.syncSubdirInvalid": "Use a relative directory inside the repository",
3456
+ "config.syncAuthor": "Commit author",
3457
+ "config.syncAuthorDefault": "Default",
3458
+ "config.syncAuthorMachine": "This computer's Git",
3459
+ "config.syncAuthorCustom": "Custom",
3460
+ "config.syncAuthorDefaultNote": "Commits as {identity}",
3461
+ "config.syncAuthorMachineNote": "Uses this computer's Git identity, else the default one",
3462
+ "config.syncAuthorName": "Name",
3463
+ "config.syncAuthorEmail": "Email",
3464
+ "config.syncAuthorEmailInvalid": "Not an email address",
3465
+ "config.syncAdvancedNote": "After saving, the next sync writes to the new branch or directory",
3466
+ "config.syncMachineName": "This computer's name",
3467
+ "config.syncMachineHostname": "Host name",
3468
+ "config.syncMachineCustom": "Custom",
3469
+ "config.syncMachineNameLabel": "Name",
3470
+ "config.syncMachineHostnameNote": "Uses the host name; backup history shows “from {name}”",
3471
+ "config.syncMachineCustomNote": "Backup history shows “from {name}”",
3472
+ "config.syncMachineNameInvalid": "Up to 120 characters on one line",
3473
+ "config.syncMachineRenameNote": "After saving, later syncs use the new name; earlier versions keep theirs",
3474
+ "config.syncAdvancedSaved": "Saved the advanced settings.",
3328
3475
  "config.reconcileTitle": "Memory reconciliation",
3329
3476
  "config.reconcileDescription": "A model reads the merged memory and proposes changes; nothing is written until you review it",
3330
- "review.rulesTitle": "How this runs",
3331
- "review.rulesPull": "Background pull: the background only repeats the push at the interval set under Automatic backup in Git sync, and before pushing it reads the remote branch and merges it here; this step produces no proposal. With the automatic backup off, the remote branch is read only when you press Push.",
3332
- "review.rulesDiff": "Differences: only Check remote, or the merge before a push, reads what differs between the branch and this machine; a difference is shown, never written.",
3333
- "review.rulesPlan": "Proposals: only Reconcile writes a plan to answer, and every entry in it is applied one operation at a time, after you accept it.",
3334
3477
  "review.reconcile": "Reconcile",
3335
3478
  "review.reconciling": "Reconciling…",
3336
3479
  "review.refresh": "Refresh",
@@ -4017,7 +4160,7 @@ window.__ModuleLoader__.load({
4017
4160
  };
4018
4161
  //#endregion
4019
4162
  //#region \0dsh-mnemon-css:/home/runner/work/dsh-mnemon/dsh-mnemon/plugins/dsh-mnemon-source-memory-spaces/presentation/page.module.css.mjs
4020
- const css$6 = ".IIa07q_entityHeading>span,.IIa07q_inspectorHeading>span{color:var(--mn-faint);font-size:12px;font-weight:500;line-height:18px}.IIa07q_memoryHeaderActions{align-items:center;gap:8px;display:flex}.IIa07q_memoryHeaderActions>button{white-space:nowrap}.IIa07q_asyncRegion{min-width:0;position:relative}.IIa07q_asyncResults{min-width:0;min-height:120px;position:relative}.IIa07q_asyncPlaceholder{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);min-height:220px;color:var(--mn-faint);place-items:center;display:grid;position:relative}.IIa07q_muted{color:var(--mn-faint);padding:16px 0;font-size:13px}.IIa07q_readSources{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);gap:8px;margin:0 0 16px;padding:12px 14px;display:grid}.IIa07q_readSources>header{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.IIa07q_readSources>header>div{gap:2px;display:grid}.IIa07q_readSources>header strong{font-size:13px;font-weight:500;line-height:20px}.IIa07q_readSources>header p{max-width:92ch;color:var(--mn-faint);margin:0;font-size:12px;line-height:18px}.IIa07q_readSources>header>button{border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-sm);min-height:28px;color:var(--mn-text);cursor:pointer;background:0 0;flex:none;padding:0 10px;font-size:12px;line-height:18px}.IIa07q_readSources>header>button:hover{background:var(--mn-hover)}.IIa07q_readSources>header>button[data-selected]{background:var(--mn-fill);border-color:#0000}.IIa07q_readSources>div{grid-template-columns:repeat(auto-fit,minmax(min(260px,100%),1fr));gap:8px;display:grid}.IIa07q_readSourceCard,.IIa07q_bodyCard,.IIa07q_metadataList>label{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-md);color:var(--mn-text);background:0 0}.IIa07q_readSourceCard{text-align:left;grid-template-columns:6px minmax(0,1fr) auto;align-items:center;gap:10px;min-width:0;min-height:56px;padding:8px 10px 8px 12px;display:grid}button.IIa07q_readSourceCard{cursor:pointer}button.IIa07q_readSourceCard:hover{background:var(--mn-hover)}.IIa07q_readSourceCard[data-selected]{border-color:var(--mn-field-line);background:var(--mn-fill)}.IIa07q_readSourceSignal{background:var(--mn-success);border-radius:50%;width:6px;height:6px}.IIa07q_readSourceCard[data-mode=projection] .IIa07q_readSourceSignal,.IIa07q_readSourceCard[data-mode=enumerable] .IIa07q_readSourceSignal{background:var(--mn-success)}.IIa07q_readSourceCard[data-mode=query-only] .IIa07q_readSourceSignal{background:var(--mn-warn)}.IIa07q_readSourceCard[data-status=unavailable] .IIa07q_readSourceSignal{background:var(--mn-danger)}.IIa07q_readSourceCard[data-status=unsupported] .IIa07q_readSourceSignal,.IIa07q_readSourceCard[data-status=empty] .IIa07q_readSourceSignal{background:var(--mn-idle)}.IIa07q_readSourceCard[data-status=unsupported]{color:var(--mn-faint)}.IIa07q_readSourceIdentity,.IIa07q_readSourceState{gap:2px;min-width:0;display:grid}.IIa07q_readSourceIdentity strong{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;line-height:20px;overflow:hidden}.IIa07q_readSourceMeta{align-items:center;gap:6px;min-width:0;display:flex}.IIa07q_readSourceMeta>small{color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:18px;overflow:hidden}.IIa07q_readSourceState{text-align:right;justify-items:end}.IIa07q_readSourceState em{width:fit-content;color:var(--mn-muted);background:var(--mn-fill);white-space:nowrap;border-radius:999px;padding:1px 8px;font-size:11px;font-style:normal;font-weight:500;line-height:17px}.IIa07q_readSourceCard[data-status=unsupported] .IIa07q_readSourceState em{border:.5px solid var(--mn-field-line);color:var(--mn-faint);background:0 0}.IIa07q_readSourceState small{color:var(--mn-faint);white-space:nowrap;font-size:11px;line-height:14px}.IIa07q_bodyDirectory{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-bottom:12px;padding:16px;position:relative}.IIa07q_bodyDirectoryHeader{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:16px;margin-bottom:12px;display:flex}.IIa07q_bodyDirectoryHeader>div:first-child{flex:260px;min-width:0}.IIa07q_bodyDirectoryHeader h3{margin:0;font-size:13px;font-weight:500;line-height:20px}.IIa07q_bodyDirectoryHeader p{color:var(--mn-faint);margin:2px 0 0;font-size:12px;line-height:18px}.IIa07q_bodyDirectoryPath{max-width:100%;color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;margin-top:4px;font-size:11px;line-height:16px;display:block;overflow:hidden}.IIa07q_bodyDirectoryControls{flex:none;justify-content:flex-end;align-items:center;gap:8px;padding-right:28px;display:flex}.IIa07q_bodyDirectoryControls>strong{color:var(--mn-muted);background:var(--mn-fill);font-variant-numeric:tabular-nums;border-radius:999px;flex:none;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_bodyGrid{grid-template-columns:repeat(auto-fit,minmax(245px,1fr));gap:8px;display:grid}.IIa07q_bodyDirectoryEmpty{border-radius:var(--dsw-radius-md);min-height:96px;color:var(--mn-muted);background:var(--mn-fill);grid-column:1/-1;justify-content:center;align-items:center;gap:12px;display:flex}.IIa07q_bodyDirectoryEmpty>span{color:var(--mn-faint);font-size:24px}.IIa07q_bodyDirectoryEmpty strong{color:var(--mn-text);font-weight:500;display:block}.IIa07q_bodyDirectoryEmpty p{color:var(--mn-faint);margin:2px 0 0;font-size:12px}.IIa07q_bodyCard{--mn-body-accent:var(--mn-success);min-width:0;padding:12px 14px;transition:border-color .16s,background-color .16s}.IIa07q_bodyCard:not([data-active]){background:var(--mn-fill);border-color:#0000}.IIa07q_bodyCard[data-reconnectable]{cursor:pointer}.IIa07q_bodyCard[data-reconnectable]:hover{border-color:var(--mn-field-line)}.IIa07q_bodyCard[data-reconnectable]:focus-visible{outline:var(--dsw-focus-ring-width,2px) solid var(--mn-focus);outline-offset:2px}.IIa07q_bodySignal{background:var(--mn-idle);border-radius:50%;width:6px;height:6px}.IIa07q_bodyCard[data-active] .IIa07q_bodySignal{background:var(--mn-body-accent)}.IIa07q_bodyCard:not([data-healthy]) .IIa07q_bodySignal{background:var(--mn-danger)}.IIa07q_bodyCard[data-status-loading] .IIa07q_bodySignal{background:var(--mn-idle)}.IIa07q_bodyCard[data-reconnecting] .IIa07q_bodySignal{box-sizing:border-box;border:1.5px solid color-mix(in srgb, var(--mn-faint) 25%, transparent);border-top-color:var(--mn-faint);background:0 0;width:8px;height:8px;animation:.9s linear infinite IIa07q_mnemon-spin}.IIa07q_bodyHealth{color:var(--mn-success);font-size:12px;line-height:18px}.IIa07q_bodyCard:not([data-healthy]) .IIa07q_bodyHealth{color:var(--mn-danger)}.IIa07q_bodyCard[data-status-loading] .IIa07q_bodyHealth{color:var(--mn-faint)}.IIa07q_mnemonDefaultBadge{width:fit-content;color:var(--mn-accent);background:color-mix(in srgb, var(--mn-accent) 10%, transparent);white-space:nowrap;border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_providerBadge{width:fit-content;max-width:100%;color:var(--mn-muted);background:var(--mn-fill);text-align:center;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap;border-radius:999px;flex:none;justify-content:center;align-items:center;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px;display:inline-flex;overflow:hidden}.IIa07q_providerBadge,.IIa07q_readSourceCard,.IIa07q_bodyCard,.IIa07q_metadataList>label,.IIa07q_graphNode,.IIa07q_providerBadge[data-provider=mnemon-native],.IIa07q_readSourceCard[data-provider=mnemon-native],.IIa07q_bodyCard[data-provider=mnemon-native],.IIa07q_metadataList>label[data-provider=mnemon-native],.IIa07q_graphNode[data-provider=mnemon-native]{--mn-provider-color:#64748b}.IIa07q_providerBadge[data-provider=openviking],.IIa07q_readSourceCard[data-provider=openviking],.IIa07q_bodyCard[data-provider=openviking],.IIa07q_metadataList>label[data-provider=openviking],.IIa07q_graphNode[data-provider=openviking]{--mn-provider-color:#3b82d0}.IIa07q_providerBadge[data-provider=honcho],.IIa07q_readSourceCard[data-provider=honcho],.IIa07q_bodyCard[data-provider=honcho],.IIa07q_metadataList>label[data-provider=honcho],.IIa07q_graphNode[data-provider=honcho]{--mn-provider-color:#c44fcf}.IIa07q_providerBadge[data-provider=mem0],.IIa07q_readSourceCard[data-provider=mem0],.IIa07q_bodyCard[data-provider=mem0],.IIa07q_metadataList>label[data-provider=mem0],.IIa07q_graphNode[data-provider=mem0]{--mn-provider-color:#8b5cf6}.IIa07q_providerBadge[data-provider=hindsight],.IIa07q_readSourceCard[data-provider=hindsight],.IIa07q_bodyCard[data-provider=hindsight],.IIa07q_metadataList>label[data-provider=hindsight],.IIa07q_graphNode[data-provider=hindsight]{--mn-provider-color:#0891b2}.IIa07q_providerBadge[data-provider=holographic],.IIa07q_readSourceCard[data-provider=holographic],.IIa07q_bodyCard[data-provider=holographic],.IIa07q_metadataList>label[data-provider=holographic],.IIa07q_graphNode[data-provider=holographic]{--mn-provider-color:#6366d9}.IIa07q_providerBadge[data-provider=retaindb],.IIa07q_readSourceCard[data-provider=retaindb],.IIa07q_bodyCard[data-provider=retaindb],.IIa07q_metadataList>label[data-provider=retaindb],.IIa07q_graphNode[data-provider=retaindb]{--mn-provider-color:#d08a28}.IIa07q_providerBadge[data-provider=byterover],.IIa07q_readSourceCard[data-provider=byterover],.IIa07q_bodyCard[data-provider=byterover],.IIa07q_metadataList>label[data-provider=byterover],.IIa07q_graphNode[data-provider=byterover]{--mn-provider-color:#0f9a83}.IIa07q_providerBadge[data-provider=supermemory],.IIa07q_readSourceCard[data-provider=supermemory],.IIa07q_bodyCard[data-provider=supermemory],.IIa07q_metadataList>label[data-provider=supermemory],.IIa07q_graphNode[data-provider=supermemory]{--mn-provider-color:#df4d72}.IIa07q_bodySwitch{min-height:28px;color:var(--mn-faint);cursor:pointer;background:0 0;border:0;align-items:center;gap:8px;padding:0;font-size:12px;line-height:18px;display:flex}.IIa07q_bodySwitchTrack{box-sizing:border-box;background:var(--mn-line-strong);border-radius:999px;flex:none;width:36px;height:20px;padding:2px;transition:background-color .12s;position:relative}.IIa07q_bodySwitchTrack i{background:var(--dsw-alias-label-primary-foreground);border-radius:50%;width:16px;height:16px;transition:transform .12s;display:block}.IIa07q_bodySwitch:hover,.IIa07q_bodySwitch[aria-checked=true]{color:var(--mn-muted)}.IIa07q_bodySwitch[aria-checked=true] .IIa07q_bodySwitchTrack{background:var(--dsw-alias-brand-primary)}.IIa07q_bodySwitch[aria-checked=true] .IIa07q_bodySwitchTrack i{transform:translate(16px)}.IIa07q_bodyCardActions{align-items:center;gap:8px;display:flex}.IIa07q_bodyCreateForm{gap:16px;padding-top:0}.IIa07q_createSection{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);gap:12px;padding:14px 16px;display:grid}.IIa07q_createSectionHeading{align-items:flex-start;gap:10px;display:flex}.IIa07q_createSectionHeading>span{min-width:22px;height:22px;color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;flex:none;place-items:center;padding:0 6px;font-size:11px;font-weight:500;line-height:1;display:grid}.IIa07q_createSectionHeading>div{gap:2px;min-width:0;display:grid}.IIa07q_createSectionHeading strong{color:var(--mn-text);font-size:14px;font-weight:500;line-height:22px}.IIa07q_createSectionHeading small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_createIdentityGrid{grid-template-columns:minmax(0,1fr);align-items:stretch;gap:12px;display:grid}.IIa07q_createIdentityGrid>label{align-content:start}.IIa07q_createIdentityGrid textarea{min-height:72px}.IIa07q_strategyForm{gap:16px;padding-top:0}.IIa07q_strategyLoading{border-radius:var(--dsw-radius-md);min-height:88px;color:var(--mn-faint);background:var(--mn-fill);justify-content:center;align-items:center;font-size:12px;display:flex;position:relative}.IIa07q_strategyLoading .IIa07q_sectionSpinner{top:10px;right:10px}.IIa07q_placementMode{border:0;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:0;padding:0;display:grid}.IIa07q_placementMode legend{color:var(--mn-muted);margin-bottom:6px;font-size:12px;font-weight:500;line-height:18px}.IIa07q_placementMode label{border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-md);cursor:pointer;grid-template-columns:16px minmax(0,1fr);align-items:center;gap:10px;min-width:0;padding:12px;display:grid;position:relative}.IIa07q_placementMode label:hover{background:var(--mn-hover)}.IIa07q_placementMode label[data-selected]{border-color:var(--mn-field-line);background:var(--mn-fill)}.IIa07q_placementMode label[data-disabled]{cursor:not-allowed;opacity:.5}.IIa07q_placementMode input{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.IIa07q_placementMode span{gap:2px;display:grid}.IIa07q_placementMode strong{color:var(--mn-text);font-size:13px;font-weight:500;line-height:20px}.IIa07q_placementMode strong em{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;margin-left:6px;padding:1px 8px;font-size:11px;font-style:normal;font-weight:500;line-height:17px}.IIa07q_placementMode small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_placementPolicy{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-md);gap:10px;margin:0;padding:12px 14px;display:grid}.IIa07q_placementPolicyHeading{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.IIa07q_placementPolicyHeading>div{gap:2px;display:grid}.IIa07q_placementPolicyHeading strong{font-size:13px;font-weight:500;line-height:20px}.IIa07q_placementPolicyHeading small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_placementPolicyHeading>span{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;flex:none;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_placementRuleGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;display:grid}.IIa07q_capabilityRules{border:0;flex-wrap:wrap;gap:6px;margin:0;padding:0;display:flex}.IIa07q_capabilityRules legend{width:100%;color:var(--mn-faint);margin-bottom:4px;font-size:12px;line-height:18px}.IIa07q_capabilityRules label{border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-sm);width:fit-content;min-height:28px;color:var(--mn-muted);cursor:pointer;align-items:center;gap:6px;padding:0 10px;font-size:12px;display:flex;position:relative}.IIa07q_capabilityRules label:hover{background:var(--mn-hover)}.IIa07q_capabilityRules label[data-selected]{border-color:var(--mn-field-line);color:var(--mn-text);background:var(--mn-fill)}.IIa07q_capabilityRules input{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.IIa07q_placementCandidates{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;display:grid}.IIa07q_placementCandidates>span,.IIa07q_placementCandidates>label{border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-md);grid-template-columns:28px minmax(0,1fr) 16px;align-items:center;gap:10px;min-width:0;padding:8px 10px;display:grid;position:relative}.IIa07q_placementCandidates>label{cursor:pointer}.IIa07q_placementCandidates>label:hover{background:var(--mn-hover)}.IIa07q_placementCandidates>[data-selected]{border-color:var(--mn-field-line);background:var(--mn-fill)}.IIa07q_placementCandidates>label[data-disabled]{cursor:not-allowed;opacity:.5}.IIa07q_placementCandidates input{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.IIa07q_placementCandidates>span>span:not(.IIa07q_candidateIcon),.IIa07q_placementCandidates>label>span:not(.IIa07q_candidateIcon){gap:2px;min-width:0;display:grid}.IIa07q_placementCandidates strong{color:var(--mn-text);font-size:13px;font-weight:500;line-height:20px}.IIa07q_placementCandidates small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_providerChoice{border:0;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:0;padding:0;display:grid}.IIa07q_providerChoice legend{color:var(--mn-muted);margin-bottom:6px;font-size:12px;font-weight:500;line-height:18px}.IIa07q_providerChoice label{border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-md);cursor:pointer;grid-template-columns:32px minmax(0,1fr) 16px;align-items:center;gap:10px;min-width:0;padding:10px 12px;display:grid;position:relative}.IIa07q_providerChoice label:hover{background:var(--mn-hover)}.IIa07q_providerChoice label[data-native]{grid-column:1/-1}.IIa07q_providerChoice label[data-selected]{border-color:var(--mn-field-line);background:var(--mn-fill)}.IIa07q_providerChoice label[data-disabled]{cursor:not-allowed;opacity:.5}.IIa07q_providerChoice input{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.IIa07q_providerChoice span{gap:2px;display:grid}.IIa07q_providerChoice strong{color:var(--mn-text);font-size:13px;font-weight:500;line-height:20px}.IIa07q_providerChoice strong em{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;margin-left:6px;padding:1px 8px;font-size:11px;font-style:normal;font-weight:500;line-height:17px}.IIa07q_providerChoice label[data-selected] strong em{background:var(--mn-layer-1)}.IIa07q_providerChoice small{color:var(--mn-faint);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.IIa07q_providerChoiceIcon,.IIa07q_candidateIcon,.IIa07q_providerFieldIcon{box-sizing:border-box;border:.5px solid var(--mn-line-strong);background:var(--mn-layer-1);place-items:center;display:grid;overflow:hidden}.IIa07q_providerChoiceIcon{border-radius:var(--dsw-radius-sm);width:32px;height:32px;padding:4px}.IIa07q_candidateIcon{border-radius:var(--dsw-radius-sm);width:28px;height:28px;padding:4px}.IIa07q_providerFieldIcon{border-radius:var(--dsw-radius-sm);flex:none;width:32px;height:32px;padding:4px}.IIa07q_providerChoiceIcon>img,.IIa07q_providerChoiceIcon>svg,.IIa07q_candidateIcon>img,.IIa07q_candidateIcon>svg,.IIa07q_providerFieldIcon>img,.IIa07q_providerFieldIcon>svg{object-fit:contain;border-radius:4px;width:100%;height:100%;display:block}.IIa07q_choiceControl{box-sizing:border-box;border:1px solid var(--mn-field-line);background:var(--mn-layer-1);border-radius:4px;flex:none;place-items:center;width:16px;height:16px;display:grid;position:relative}.IIa07q_choiceControl[data-kind=radio]{border-radius:50%}[data-selected]>.IIa07q_choiceControl{border-color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-brand-primary)}[data-selected]>.IIa07q_choiceControl[data-kind=check]:after{border-bottom:1.5px solid var(--dsw-alias-label-primary-foreground);border-left:1.5px solid var(--dsw-alias-label-primary-foreground);content:\"\";width:7px;height:4px;transform:translateY(-1px)rotate(-45deg)}[data-selected]>.IIa07q_choiceControl[data-kind=radio]:after{content:\"\";background:var(--dsw-alias-label-primary-foreground);border-radius:50%;width:6px;height:6px}.IIa07q_placementMode label:has(input:focus-visible),.IIa07q_providerChoice label:has(input:focus-visible),.IIa07q_capabilityRules label:has(input:focus-visible),.IIa07q_placementCandidates label:has(input:focus-visible){outline:var(--dsw-focus-ring-width,2px) solid var(--mn-focus);outline-offset:1px}.IIa07q_providerFields{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-md);gap:10px;padding:12px 14px;display:grid}.IIa07q_providerFieldHeading{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.IIa07q_providerFieldIdentity{align-items:center;gap:10px;min-width:0;display:flex}.IIa07q_providerFieldIdentity>div{gap:2px;min-width:0;display:grid}.IIa07q_providerFieldHeading strong{color:var(--mn-text);font-size:13px;font-weight:500;line-height:20px}.IIa07q_providerFieldHeading small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_providerFieldHeading>span{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;flex:none;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_providerFields details{min-width:0}.IIa07q_providerFields summary{width:fit-content;color:var(--mn-muted);cursor:pointer;font-size:12px;line-height:18px}.IIa07q_providerFields summary:hover{color:var(--mn-text)}.IIa07q_providerEnableHint{color:var(--mn-faint);margin-top:8px;font-size:12px;line-height:18px;display:block}.IIa07q_providerAdvancedGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:8px;display:grid}.IIa07q_providerFieldControl .IIa07q_providerSecretClear{color:var(--mn-muted);cursor:pointer;align-items:center;gap:6px;font-size:12px;font-weight:400;display:flex}.IIa07q_providerWriteHint{color:var(--mn-faint);margin-top:4px;font-size:12px;line-height:18px;display:block}.IIa07q_placementReceipt{border-radius:var(--dsw-radius-sm);min-width:0;color:var(--mn-muted);background:var(--mn-fill);align-items:flex-start;gap:8px;margin:8px 0;padding:8px 10px;display:flex}.IIa07q_placementReceipt>span{flex:none;font-size:12px}.IIa07q_placementReceipt>div{grid-template-columns:minmax(0,1fr) auto;gap:2px 8px;min-width:0;display:grid}.IIa07q_placementReceipt strong,.IIa07q_placementReceipt small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.IIa07q_placementReceipt strong{color:var(--mn-text);font-size:12px;font-weight:500;line-height:18px}.IIa07q_placementReceipt small{color:var(--mn-faint);font-size:11px;line-height:18px}.IIa07q_placementReceipt p{color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;grid-column:1/-1;margin:0;font-size:12px;line-height:18px;overflow:hidden}.IIa07q_bodyCard>p{min-height:18px;color:var(--mn-muted);margin:8px 0;font-size:13px;line-height:20px}.IIa07q_bodyCard footer{border-top:.5px solid var(--mn-line);min-width:0;color:var(--mn-faint);flex-wrap:nowrap;gap:4px 12px;padding-top:8px;font-size:12px;line-height:18px;display:flex;overflow:hidden}.IIa07q_bodyFooterBlock{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;display:block;overflow:hidden}.IIa07q_bodyFooterGrow{flex:auto}.IIa07q_graphLayout{grid-template-columns:minmax(0,1fr) minmax(240px,280px);gap:12px;display:grid}.IIa07q_graphPanel,.IIa07q_graphInspector{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg)}.IIa07q_graphPanel{min-width:0;position:relative;overflow:hidden}.IIa07q_graphToolbar,.IIa07q_graphFooter{min-height:44px;color:var(--mn-faint);justify-content:space-between;align-items:center;gap:16px;padding:0 14px;font-size:12px;line-height:18px;display:flex}.IIa07q_graphToolbar{border-bottom:.5px solid var(--mn-line)}.IIa07q_graphToolbar>div:first-child{align-items:center;gap:8px;display:flex}.IIa07q_graphToolbar small{color:var(--mn-faint)}.IIa07q_liveDot{background:var(--mn-success);border-radius:50%;width:6px;height:6px}.IIa07q_graphLegend{flex-wrap:wrap;justify-content:flex-end;gap:4px 12px;display:flex}.IIa07q_graphLegend span{align-items:center;gap:6px;display:flex}.IIa07q_graphLegend span:before{content:\"\";background:var(--edge-color);border-radius:2px;width:14px;height:2px}.IIa07q_graphLegend [data-edge=temporal]{--edge-color:#87909f}.IIa07q_graphLegend [data-edge=scope]{--edge-color:#708199}.IIa07q_graphLegend [data-edge=scope]:before{background:repeating-linear-gradient(90deg, var(--edge-color) 0 4px, transparent 4px 7px)}.IIa07q_graphLegend [data-edge=semantic]{--edge-color:#4d7cfe}.IIa07q_graphLegend [data-edge=causal]{--edge-color:#ef6b5b}.IIa07q_graphLegend [data-edge=entity]{--edge-color:#22a879}.IIa07q_graphViewport{min-height:clamp(390px,42vw,560px);position:relative;overflow:hidden}.IIa07q_graphCanvasControls{z-index:2;border-radius:var(--dsw-radius-md);background:var(--dsw-specific-menu,var(--mn-layer-2));box-shadow:var(--dsw-elevation-soft);backdrop-filter:var(--dsw-menu-backdrop-filter);align-items:center;gap:4px;padding:4px;display:flex;position:absolute;top:10px;right:10px}.IIa07q_graphCanvasControls span{color:var(--mn-faint);align-items:center;gap:6px;padding:0 6px;font-size:12px;display:flex}.IIa07q_graphCanvasControls span i{background:var(--mn-accent);border-radius:50%;width:6px;height:6px}.IIa07q_graphCanvasControls button{border-radius:var(--dsw-radius-sm);min-height:28px;color:var(--mn-muted);cursor:pointer;background:0 0;border:0;padding:0 10px;font-size:12px}.IIa07q_graphCanvasControls button:hover{color:var(--mn-text);background:var(--mn-hover)}.IIa07q_graphCanvasControls button[data-active]{color:var(--mn-text);background:var(--mn-fill)}.IIa07q_graphSvg{touch-action:pan-y pinch-zoom;user-select:none;width:100%;height:clamp(390px,42vw,560px);display:block}.IIa07q_graphBackdrop{fill:var(--mn-layer-1)}.IIa07q_graphGridLine{stroke:var(--mn-line);stroke-width:.6px;opacity:.5}.IIa07q_graphEdge{fill:none;stroke:#87909f;stroke-width:1px;opacity:.32;vector-effect:non-scaling-stroke}.IIa07q_graphEdge[data-edge=scope]{stroke:#708199;stroke-dasharray:4 5;opacity:.28}.IIa07q_graphEdge[data-edge=semantic]{stroke:#4d7cfe;opacity:.48}.IIa07q_graphEdge[data-edge=causal]{stroke:#ef6b5b;opacity:.52}.IIa07q_graphEdge[data-edge=entity]{stroke:#22a879;stroke-width:1.45px;opacity:.78}.IIa07q_graphNode{--node:#8290a8;cursor:grab;touch-action:none;outline:none}.IIa07q_graphNode[data-dragging]{cursor:grabbing}.IIa07q_graphNode[data-category=decision]{--node:#ef8354}.IIa07q_graphNode[data-category=preference]{--node:#a879e1}.IIa07q_graphNode[data-category=fact]{--node:#4d7cfe}.IIa07q_graphNode[data-category=insight]{--node:#19a77d}.IIa07q_graphNode[data-category=context]{--node:#d8a624}.IIa07q_graphNode[data-kind=space]{--node:var(--mn-provider-color)}.IIa07q_graphNode[data-kind=entity]{--node:#2b9db9}.IIa07q_nodeHalo{fill:color-mix(in srgb, var(--node) 18%, var(--mn-layer-1));stroke:color-mix(in srgb, var(--node) 60%, var(--mn-layer-1));stroke-width:1.5px;transition:r .16s}.IIa07q_nodeCore{fill:var(--node)}.IIa07q_nodeLabel{fill:var(--mn-muted);font:11px var(--mn-sans);pointer-events:auto}.IIa07q_nodeBodyLabel{fill:var(--mn-faint);font:500 11px var(--mn-sans);pointer-events:auto}.IIa07q_graphSvg[data-density=sparse] .IIa07q_nodeLabel{font-size:12px}.IIa07q_graphNode:hover .IIa07q_nodeHalo,.IIa07q_graphNode:focus .IIa07q_nodeHalo,.IIa07q_graphNode[data-selected] .IIa07q_nodeHalo{fill:color-mix(in srgb, var(--node) 28%, var(--mn-layer-1));stroke:var(--node)}.IIa07q_graphNode[data-selected] .IIa07q_nodeLabel{fill:var(--mn-text);font-weight:500}.IIa07q_graphFooter{border-top:.5px solid var(--mn-line);min-height:40px;color:var(--mn-faint)}.IIa07q_graphInspector{min-width:0;min-height:calc(clamp(390px,42vw,560px) + 84px);padding:16px;overflow:hidden}.IIa07q_inspectorEmpty{text-align:center;flex-direction:column;justify-content:center;align-items:center;height:100%;display:flex}.IIa07q_inspectorLogo{border-radius:var(--dsw-radius-lg);opacity:.72;width:48px;height:48px;margin-bottom:12px}.IIa07q_inspectorEmpty h3{margin:6px 0 2px;font-size:14px;font-weight:500;line-height:22px}.IIa07q_inspectorEmpty p{color:var(--mn-faint);margin:0;font-size:12px;line-height:18px}.IIa07q_inspectorHeading{justify-content:space-between;align-items:center;display:flex}.IIa07q_inspectorHeading button{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--mn-muted);cursor:pointer;background:0 0;border:0;place-items:center;display:grid}.IIa07q_inspectorHeading button:hover{background:var(--mn-hover)}.IIa07q_inspectorChips{flex-wrap:wrap;align-items:center;gap:6px;margin-top:20px;display:flex}.IIa07q_categoryChip{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px;display:inline-flex}.IIa07q_inspectorTitleRow{align-items:flex-start;gap:8px;min-width:0;margin:12px 0 20px;display:flex}.IIa07q_inspectorTitle{overflow-wrap:anywhere;white-space:pre-wrap;-webkit-line-clamp:6;-webkit-box-orient:vertical;flex:1;min-width:0;margin:0;font-size:14px;font-weight:400;line-height:22px;display:-webkit-box;overflow:hidden}.IIa07q_inspectorEye{border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--mn-muted);cursor:pointer;background:0 0;flex:none;place-items:center;transition:color .15s,background-color .15s;display:grid}.IIa07q_inspectorEye:hover{color:var(--mn-text);background:var(--mn-hover)}.IIa07q_inspectorMeta{margin:0}.IIa07q_inspectorMeta>div{border-top:.5px solid var(--mn-line);gap:2px;padding:10px 0;display:grid}.IIa07q_inspectorMeta dt{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_inspectorMeta dd{overflow-wrap:anywhere;color:var(--mn-muted);margin:0;font-size:13px;line-height:20px}.IIa07q_inspectorActions{gap:8px;margin-top:20px;display:grid}.IIa07q_previewContent{white-space:pre-wrap;overflow-wrap:anywhere;color:var(--mn-text);margin:0;font-size:14px;line-height:22px}.IIa07q_searchBar{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-bottom:16px;padding:14px}.IIa07q_queryField{width:100%;height:40px}.IIa07q_searchChoice{min-width:160px}.IIa07q_searchControls{justify-content:flex-end;align-items:flex-end;gap:12px;padding-top:12px;display:flex}.IIa07q_searchActions{align-items:center;gap:8px;display:flex}.IIa07q_agentAnswer{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-bottom:16px;padding:16px}.IIa07q_agentAnswerHeading{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.IIa07q_agentAnswerHeading span{color:var(--mn-faint);font-size:12px;font-weight:500;line-height:18px}.IIa07q_agentAnswerHeading h3{margin:2px 0 0;font-size:14px;font-weight:500;line-height:22px}.IIa07q_agentAnswerHeading>code{color:var(--mn-faint);font-size:11px}.IIa07q_agentAnswer>p{white-space:pre-wrap;color:var(--mn-text);margin:12px 0;font-size:14px;line-height:22px}.IIa07q_agentCitations{border-top:.5px solid var(--mn-line);flex-wrap:wrap;align-items:center;gap:6px;padding-top:10px;display:flex}.IIa07q_agentCitations small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_agentCitations span{max-width:100%;color:var(--mn-muted);background:var(--mn-fill);text-overflow:ellipsis;white-space:nowrap;border-radius:999px;padding:1px 8px;font-size:12px;line-height:18px;overflow:hidden}.IIa07q_fieldWide{color:var(--mn-muted);gap:6px;font-size:12px;font-weight:500;line-height:18px;display:grid}.IIa07q_supervisedForm textarea:focus{border-color:var(--mn-accent)}.IIa07q_singleColumn{max-width:830px}.IIa07q_resultLayout{grid-template-columns:minmax(0,1.15fr) minmax(300px,.85fr);align-items:start;gap:16px;display:grid}.IIa07q_results,.IIa07q_relatedPane,.IIa07q_entityResults{min-width:0}.IIa07q_relatedPane{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);-webkit-overflow-scrolling:touch;max-height:calc(100dvh - 230px);padding:14px;scroll-margin-top:14px;position:sticky;top:12px;overflow:auto}.IIa07q_relatedSource{border-radius:var(--dsw-radius-sm);color:var(--mn-muted);background:var(--mn-fill);margin:0 0 12px;padding:10px 12px;font-size:13px;line-height:20px}.IIa07q_insightCard{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);min-width:0;margin-bottom:8px;padding:14px 16px;transition:background-color .15s}.IIa07q_insightCard:hover{background:color-mix(in srgb, var(--mn-hover) 50%, transparent)}.IIa07q_cardTop{justify-content:space-between;align-items:center;gap:12px;display:flex}.IIa07q_badges,.IIa07q_tags,.IIa07q_entities{flex-wrap:wrap;gap:6px;display:flex}.IIa07q_badge{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_id{color:var(--mn-faint);font-size:11px}.IIa07q_content{white-space:pre-wrap;overflow-wrap:anywhere;margin:10px 0;font-size:14px;line-height:22px}.IIa07q_tags{color:var(--mn-accent);font-size:12px;line-height:18px}.IIa07q_entities{margin-top:8px}.IIa07q_entities span{border:.5px solid var(--mn-field-line);color:var(--mn-faint);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_cardActions{border-top:.5px solid var(--mn-line);justify-content:flex-end;align-items:center;gap:4px;min-height:32px;margin-top:10px;padding-top:8px;display:flex}.IIa07q_entityLayout{grid-template-columns:264px minmax(0,1fr);align-items:start;gap:16px;display:grid}.IIa07q_entityRail{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);padding:12px;position:sticky;top:0}.IIa07q_entitySearch{grid-template-columns:minmax(0,1fr) auto;gap:8px;display:grid}.IIa07q_entitySearch input{min-width:0}.IIa07q_entityHeading{justify-content:space-between;align-items:center;margin:16px 4px 6px;display:flex}.IIa07q_entityHeading small{color:var(--mn-faint);font-size:12px}.IIa07q_entityList{gap:2px;display:grid}.IIa07q_entityList button{border-radius:var(--dsw-radius-sm);min-height:32px;color:var(--mn-muted);cursor:pointer;text-align:left;background:0 0;border:0;justify-content:space-between;align-items:center;gap:10px;padding:0 10px;display:flex}.IIa07q_entityList button:hover,.IIa07q_entityList button[aria-pressed=true]{color:var(--mn-text);background:var(--mn-hover)}.IIa07q_entityList button[aria-pressed=true]{background:var(--mn-fill)}.IIa07q_entityList button>span{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.IIa07q_entityList strong{color:var(--mn-faint);font-variant-numeric:tabular-nums;flex:none;font-size:12px;font-weight:400}.IIa07q_entityResults>.IIa07q_emptyState{min-height:360px}.IIa07q_entitySection{min-width:0}.IIa07q_entitySection+.IIa07q_entitySection{margin-top:24px}.IIa07q_entitySectionBody{min-height:116px}.IIa07q_entityQuiet{color:var(--mn-faint);margin:0 0 8px;padding:12px 2px;font-size:13px;line-height:20px}.IIa07q_entityRetry{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 12px;display:flex}.IIa07q_entityRelatedHead{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.IIa07q_entityRelatedHead>div:first-child{flex:1;min-width:0}.IIa07q_entityRelatedHead>button{flex:none;margin-top:2px}.IIa07q_insightSkeleton{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);align-content:start;gap:12px;min-height:108px;margin-bottom:8px;padding:16px;display:grid;position:relative;overflow:hidden}.IIa07q_insightSkeleton>span{background:var(--mn-fill);border-radius:999px;height:10px;display:block}.IIa07q_insightSkeleton>span:first-child{width:36%}.IIa07q_insightSkeleton>span:nth-child(2){width:94%}.IIa07q_insightSkeleton>span:nth-child(3){width:68%}.IIa07q_entityRailSkeleton{border-radius:var(--dsw-radius-sm);background:color-mix(in srgb, var(--mn-fill) 55%, transparent);height:32px;display:block;position:relative;overflow:hidden}.IIa07q_insightSkeleton:after,.IIa07q_entityRailSkeleton:after{content:\"\";background:linear-gradient(105deg, transparent 20%, color-mix(in srgb, var(--mn-text) 5%, transparent) 45%, transparent 70%);pointer-events:none;animation:1.2s ease-in-out infinite IIa07q_entity-skeleton-sweep;position:absolute;inset:0;transform:translate(-120%)}@keyframes IIa07q_entity-skeleton-sweep{to{transform:translate(120%)}}@media (prefers-reduced-motion:reduce){.IIa07q_insightSkeleton:after,.IIa07q_entityRailSkeleton:after{animation:none}}.IIa07q_readSourceCard[data-status=loading] .IIa07q_readSourceSignal{background:var(--mn-idle)}.IIa07q_supervisedComposer{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);overflow:hidden}.IIa07q_supervisedForm{padding:16px}.IIa07q_candidateHeading{justify-content:space-between;align-items:center;gap:8px;min-width:0;margin-bottom:8px;display:flex}.IIa07q_candidateHeading>label{color:var(--mn-text);font-size:13px;font-weight:500;line-height:20px}.IIa07q_supervisedForm textarea{resize:vertical;border:.5px solid var(--mn-field-line);border-radius:var(--dsw-radius-md);width:100%;color:var(--mn-text);background:var(--mn-input);outline:0;padding:10px 12px;font-size:14px;line-height:22px}.IIa07q_sessionHint{color:var(--mn-danger);margin:8px 0 0;font-size:12px;line-height:18px}.IIa07q_fieldWide{grid-column:1/-1}.IIa07q_advancedWrite{border-top:.5px solid var(--mn-line)}.IIa07q_advancedWrite summary{cursor:pointer;justify-content:space-between;align-items:center;gap:16px;min-height:56px;padding:10px 16px;list-style:none;display:flex}.IIa07q_advancedWrite summary:hover{background:var(--mn-hover)}.IIa07q_advancedWrite summary::-webkit-details-marker{display:none}.IIa07q_advancedWrite summary>span:first-child{gap:2px;display:grid}.IIa07q_advancedWrite summary strong{font-size:13px;font-weight:500;line-height:20px}.IIa07q_advancedWrite summary small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_advancedWrite summary>span:last-child{color:var(--mn-faint);font-size:16px;line-height:1}.IIa07q_advancedWrite[open] summary{border-bottom:.5px solid var(--mn-line)}.IIa07q_advancedWrite[open] summary>span:last-child{font-size:0}.IIa07q_advancedWrite[open] summary>span:last-child:after{content:\"−\";font-size:16px}.IIa07q_manualForm{padding:4px 16px 16px}.IIa07q_manualActions{justify-content:space-between;align-items:center;gap:16px;margin-top:16px;display:flex}.IIa07q_manualActions p{max-width:520px;color:var(--mn-faint);margin:0;font-size:12px;line-height:18px}.IIa07q_listToolbar{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);grid-template-columns:minmax(0,1fr) 180px auto;gap:8px;padding:12px;display:grid}.IIa07q_listToolbar>*{min-width:0}.IIa07q_listNotice{color:var(--mn-faint);margin:10px 2px 16px;font-size:12px;line-height:18px}.IIa07q_listNotice span{color:var(--mn-success);background:color-mix(in srgb, var(--mn-success) 10%, transparent);border-radius:999px;margin-right:8px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_memoryList{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;gap:8px;display:grid}.IIa07q_memoryList .IIa07q_insightCard{height:100%;margin:0}.IIa07q_modalFooterNote{max-width:54ch;color:var(--mn-faint);margin:0 auto 0 0;font-size:12px;line-height:18px}.IIa07q_modalInlineStatus{color:var(--mn-muted);overflow-wrap:anywhere;margin:12px 0 0;font-size:12px;line-height:18px}.IIa07q_metadataDialog{gap:12px;display:grid}.IIa07q_metadataToolbar{color:var(--mn-faint);justify-content:space-between;align-items:center;gap:12px;font-size:12px;line-height:18px;display:flex}.IIa07q_metadataToolbar>span{align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_metadataToolbar em{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;padding:1px 8px;font-size:11px;font-style:normal;font-weight:500;line-height:17px}.IIa07q_metadataList{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;display:grid}.IIa07q_metadataEmpty{border-radius:var(--dsw-radius-md);color:var(--mn-faint);background:var(--mn-fill);text-align:center;grid-column:1/-1;padding:20px;font-size:12px}.IIa07q_metadataList>label{cursor:pointer;grid-template-columns:16px minmax(0,1fr);align-items:start;gap:10px;min-width:0;min-height:76px;padding:12px;display:grid;position:relative}.IIa07q_metadataList>label:hover{background:var(--mn-hover)}.IIa07q_metadataList>label[data-selected]{border-color:var(--mn-field-line);background:var(--mn-fill)}.IIa07q_metadataList>label[data-refreshing]{overflow:hidden}.IIa07q_metadataList>label[data-refreshing]:after{content:\"\";background:linear-gradient(105deg, transparent 20%, color-mix(in srgb, var(--mn-accent) 10%, transparent) 45%, transparent 70%);pointer-events:none;animation:.9s ease-in-out infinite IIa07q_mnemon-metadata-sweep;position:absolute;inset:0;transform:translate(-120%)}.IIa07q_metadataList>label[data-refreshed]{animation:.9s ease-out IIa07q_mnemon-metadata-refreshed}.IIa07q_metadataList>label[data-failed]{border-color:color-mix(in srgb, var(--mn-danger) 40%, transparent)}.IIa07q_metadataList>label>input{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.IIa07q_metadataList>label>span{gap:4px;min-width:0;display:grid}.IIa07q_metadataList strong{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;line-height:20px;overflow:hidden}.IIa07q_metadataList small{color:var(--mn-faint);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.IIa07q_metadataList>label>span>span{align-items:center;gap:6px;min-width:0;display:flex}.IIa07q_metadataList code{color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.IIa07q_metadataTaskStatus{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12px;line-height:18px;overflow:hidden}.IIa07q_metadataTaskStatus[data-status=running]{color:var(--mn-faint)}.IIa07q_metadataTaskStatus[data-status=success]{color:var(--mn-success)}.IIa07q_metadataTaskStatus[data-status=error]{color:var(--mn-danger)}@media (prefers-reduced-motion:reduce){.IIa07q_metadataList>label[data-refreshing]:after,.IIa07q_metadataList>label[data-refreshed]{animation:none}}@media (width<=1000px){.IIa07q_graphLayout{display:block;position:relative}.IIa07q_graphInspector{width:auto;min-height:0;box-shadow:none;margin-top:12px;position:static;overflow:visible}.IIa07q_graphInspector[data-empty]{display:none}.IIa07q_resultLayout{grid-template-columns:1fr}.IIa07q_relatedPane{grid-row:1;max-height:none;position:static}.IIa07q_memoryList{grid-template-columns:1fr}}@media (width<=760px){.IIa07q_metadataList{grid-template-columns:1fr}.IIa07q_modalFooterNote{max-width:none;margin:0}.IIa07q_modal .IIa07q_supervisedForm textarea{min-height:clamp(130px,30vh,210px)}.IIa07q_entityLayout{grid-template-columns:1fr}.IIa07q_manualActions{flex-direction:column;align-items:stretch}.IIa07q_entityRail{position:static}.IIa07q_searchControls{grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.IIa07q_searchActions{grid-column:1/-1}.IIa07q_searchActions>button{flex:1}.IIa07q_listToolbar{grid-template-columns:1fr}.IIa07q_bodyDirectoryHeader{grid-template-columns:minmax(0,1fr);display:grid}.IIa07q_bodyDirectoryHeader>div{min-width:0}.IIa07q_bodyDirectoryPath{max-width:100%}.IIa07q_bodyDirectoryControls{flex-wrap:wrap;justify-content:flex-start;padding-right:0}.IIa07q_createIdentityGrid,.IIa07q_placementMode,.IIa07q_placementRuleGrid,.IIa07q_placementCandidates,.IIa07q_providerChoice,.IIa07q_providerAdvancedGrid{grid-template-columns:1fr}.IIa07q_graphViewport{min-height:360px}.IIa07q_graphSvg{height:390px}.IIa07q_graphCanvasControls{top:8px;right:8px}.IIa07q_graphCanvasControls span{display:none}}@media (width<=520px){.IIa07q_memoryHeaderActions{width:100%}.IIa07q_memoryHeaderActions>button{flex:1}.IIa07q_cardTop{flex-direction:column;align-items:flex-start}.IIa07q_cardActions{flex-wrap:wrap;align-items:stretch}.IIa07q_cardActions button{flex:1}.IIa07q_searchControls{grid-template-columns:1fr}}@supports (height:100dvh){@media (width<=760px){.IIa07q_modal .IIa07q_supervisedForm textarea{min-height:clamp(130px,30dvh,210px)}}}@media (width<=1000px) and (height<=760px){.IIa07q_graphViewport{min-height:300px}.IIa07q_graphSvg{height:300px}}";
4163
+ const css$6 = ".IIa07q_entityHeading>span,.IIa07q_inspectorHeading>span{color:var(--mn-faint);font-size:12px;font-weight:500;line-height:18px}.IIa07q_memoryHeaderActions{align-items:center;gap:8px;display:flex}.IIa07q_memoryHeaderActions>button{white-space:nowrap}.IIa07q_asyncRegion{min-width:0;position:relative}.IIa07q_asyncResults{min-width:0;min-height:120px;position:relative}.IIa07q_asyncPlaceholder{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);min-height:220px;color:var(--mn-faint);place-items:center;display:grid;position:relative}.IIa07q_muted{color:var(--mn-faint);padding:16px 0;font-size:13px}.IIa07q_readSources{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);gap:8px;margin:0 0 16px;padding:12px 14px;display:grid}.IIa07q_readSources>header{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.IIa07q_readSources>header>div{gap:2px;display:grid}.IIa07q_readSources>header strong{font-size:13px;font-weight:500;line-height:20px}.IIa07q_readSources>header p{max-width:92ch;color:var(--mn-faint);margin:0;font-size:12px;line-height:18px}.IIa07q_readSources>header>button{border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-sm);min-height:28px;color:var(--mn-text);cursor:pointer;background:0 0;flex:none;padding:0 10px;font-size:12px;line-height:18px}.IIa07q_readSources>header>button:hover{background:var(--mn-hover)}.IIa07q_readSources>header>button[data-selected]{background:var(--mn-fill);border-color:#0000}.IIa07q_readSources>div{grid-template-columns:repeat(auto-fit,minmax(min(260px,100%),1fr));gap:8px;display:grid}.IIa07q_readSourceCard,.IIa07q_bodyCard,.IIa07q_metadataList>label{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-md);color:var(--mn-text);background:0 0}.IIa07q_readSourceCard{text-align:left;grid-template-columns:6px minmax(0,1fr) auto;align-items:center;gap:10px;min-width:0;min-height:56px;padding:8px 10px 8px 12px;display:grid}button.IIa07q_readSourceCard{cursor:pointer}button.IIa07q_readSourceCard:hover{background:var(--mn-hover)}.IIa07q_readSourceCard[data-selected]{border-color:var(--mn-field-line);background:var(--mn-fill)}.IIa07q_readSourceSignal{background:var(--mn-success);border-radius:50%;width:6px;height:6px}.IIa07q_readSourceCard[data-mode=projection] .IIa07q_readSourceSignal,.IIa07q_readSourceCard[data-mode=enumerable] .IIa07q_readSourceSignal{background:var(--mn-success)}.IIa07q_readSourceCard[data-mode=query-only] .IIa07q_readSourceSignal{background:var(--mn-warn)}.IIa07q_readSourceCard[data-status=unavailable] .IIa07q_readSourceSignal{background:var(--mn-danger)}.IIa07q_readSourceCard[data-status=unsupported] .IIa07q_readSourceSignal,.IIa07q_readSourceCard[data-status=empty] .IIa07q_readSourceSignal{background:var(--mn-idle)}.IIa07q_readSourceCard[data-status=unsupported]{color:var(--mn-faint)}.IIa07q_readSourceIdentity,.IIa07q_readSourceState{gap:2px;min-width:0;display:grid}.IIa07q_readSourceIdentity strong{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;line-height:20px;overflow:hidden}.IIa07q_readSourceMeta{align-items:center;gap:6px;min-width:0;display:flex}.IIa07q_readSourceMeta>small{color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:18px;overflow:hidden}.IIa07q_readSourceState{text-align:right;justify-items:end}.IIa07q_readSourceState em{width:fit-content;color:var(--mn-muted);background:var(--mn-fill);white-space:nowrap;border-radius:999px;padding:1px 8px;font-size:11px;font-style:normal;font-weight:500;line-height:17px}.IIa07q_readSourceCard[data-status=unsupported] .IIa07q_readSourceState em{border:.5px solid var(--mn-field-line);color:var(--mn-faint);background:0 0}.IIa07q_readSourceState small{color:var(--mn-faint);white-space:nowrap;font-size:11px;line-height:14px}.IIa07q_bodyDirectory{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-bottom:12px;padding:16px;position:relative}.IIa07q_bodyDirectoryHeader{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:16px;margin-bottom:12px;display:flex}.IIa07q_bodyDirectoryHeader>div:first-child{flex:260px;min-width:0}.IIa07q_bodyDirectoryHeader h3{margin:0;font-size:13px;font-weight:500;line-height:20px}.IIa07q_bodyDirectoryHeader p{color:var(--mn-faint);margin:2px 0 0;font-size:12px;line-height:18px}.IIa07q_bodyDirectoryPath{max-width:100%;color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;margin-top:4px;font-size:11px;line-height:16px;display:block;overflow:hidden}.IIa07q_bodyDirectoryControls{flex:none;justify-content:flex-end;align-items:center;gap:8px;padding-right:28px;display:flex}.IIa07q_bodyDirectoryControls>strong{color:var(--mn-muted);background:var(--mn-fill);font-variant-numeric:tabular-nums;border-radius:999px;flex:none;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_bodyGrid{grid-template-columns:repeat(auto-fit,minmax(245px,1fr));gap:8px;display:grid}.IIa07q_bodyDirectoryEmpty{border-radius:var(--dsw-radius-md);min-height:96px;color:var(--mn-muted);background:var(--mn-fill);grid-column:1/-1;justify-content:center;align-items:center;gap:12px;display:flex}.IIa07q_bodyDirectoryEmpty>span{color:var(--mn-faint);font-size:24px}.IIa07q_bodyDirectoryEmpty strong{color:var(--mn-text);font-weight:500;display:block}.IIa07q_bodyDirectoryEmpty p{color:var(--mn-faint);margin:2px 0 0;font-size:12px}.IIa07q_bodyCard{--mn-body-accent:var(--mn-success);min-width:0;padding:12px 14px;transition:border-color .16s,background-color .16s}.IIa07q_bodyCard:not([data-active]){background:var(--mn-fill);border-color:#0000}.IIa07q_bodyCard[data-reconnectable]{cursor:pointer}.IIa07q_bodyCard[data-reconnectable]:hover{border-color:var(--mn-field-line)}.IIa07q_bodyCard[data-reconnectable]:focus-visible{outline:var(--dsw-focus-ring-width,2px) solid var(--mn-focus);outline-offset:2px}.IIa07q_bodySignal{background:var(--mn-idle);border-radius:50%;width:6px;height:6px}.IIa07q_bodyCard[data-active] .IIa07q_bodySignal{background:var(--mn-body-accent)}.IIa07q_bodyCard:not([data-healthy]) .IIa07q_bodySignal{background:var(--mn-danger)}.IIa07q_bodyCard[data-status-loading] .IIa07q_bodySignal{background:var(--mn-idle)}.IIa07q_bodyCard[data-reconnecting] .IIa07q_bodySignal{box-sizing:border-box;border:1.5px solid color-mix(in srgb, var(--mn-faint) 25%, transparent);border-top-color:var(--mn-faint);background:0 0;width:8px;height:8px;animation:.9s linear infinite IIa07q_mnemon-spin}.IIa07q_bodyHealth{color:var(--mn-success);font-size:12px;line-height:18px}.IIa07q_bodyCard:not([data-healthy]) .IIa07q_bodyHealth{color:var(--mn-danger)}.IIa07q_bodyCard[data-status-loading] .IIa07q_bodyHealth{color:var(--mn-faint)}.IIa07q_mnemonDefaultBadge,.IIa07q_newSpaceBadge{width:fit-content;color:var(--mn-accent);background:color-mix(in srgb, var(--mn-accent) 10%, transparent);white-space:nowrap;border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_rediscoveryNotice{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-module-platform);align-items:flex-start;gap:8px 12px;min-width:0;margin:0 0 12px;padding:10px 12px;display:flex}.IIa07q_rediscoveryNotice>div{flex:auto;gap:2px;min-width:0;display:grid}.IIa07q_rediscoveryNotice p{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;margin:0;font-size:13px;line-height:20px}.IIa07q_rediscoveryNotice p[data-failed]{color:var(--mn-danger)}.IIa07q_rediscoveryNotice>button{flex:none}.IIa07q_providerBadge{width:fit-content;max-width:100%;color:var(--mn-muted);background:var(--mn-fill);text-align:center;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap;border-radius:999px;flex:none;justify-content:center;align-items:center;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px;display:inline-flex;overflow:hidden}.IIa07q_providerBadge,.IIa07q_readSourceCard,.IIa07q_bodyCard,.IIa07q_metadataList>label,.IIa07q_graphNode,.IIa07q_providerBadge[data-provider=mnemon-native],.IIa07q_readSourceCard[data-provider=mnemon-native],.IIa07q_bodyCard[data-provider=mnemon-native],.IIa07q_metadataList>label[data-provider=mnemon-native],.IIa07q_graphNode[data-provider=mnemon-native]{--mn-provider-color:#64748b}.IIa07q_providerBadge[data-provider=openviking],.IIa07q_readSourceCard[data-provider=openviking],.IIa07q_bodyCard[data-provider=openviking],.IIa07q_metadataList>label[data-provider=openviking],.IIa07q_graphNode[data-provider=openviking]{--mn-provider-color:#3b82d0}.IIa07q_providerBadge[data-provider=honcho],.IIa07q_readSourceCard[data-provider=honcho],.IIa07q_bodyCard[data-provider=honcho],.IIa07q_metadataList>label[data-provider=honcho],.IIa07q_graphNode[data-provider=honcho]{--mn-provider-color:#c44fcf}.IIa07q_providerBadge[data-provider=mem0],.IIa07q_readSourceCard[data-provider=mem0],.IIa07q_bodyCard[data-provider=mem0],.IIa07q_metadataList>label[data-provider=mem0],.IIa07q_graphNode[data-provider=mem0]{--mn-provider-color:#8b5cf6}.IIa07q_providerBadge[data-provider=hindsight],.IIa07q_readSourceCard[data-provider=hindsight],.IIa07q_bodyCard[data-provider=hindsight],.IIa07q_metadataList>label[data-provider=hindsight],.IIa07q_graphNode[data-provider=hindsight]{--mn-provider-color:#0891b2}.IIa07q_providerBadge[data-provider=holographic],.IIa07q_readSourceCard[data-provider=holographic],.IIa07q_bodyCard[data-provider=holographic],.IIa07q_metadataList>label[data-provider=holographic],.IIa07q_graphNode[data-provider=holographic]{--mn-provider-color:#6366d9}.IIa07q_providerBadge[data-provider=retaindb],.IIa07q_readSourceCard[data-provider=retaindb],.IIa07q_bodyCard[data-provider=retaindb],.IIa07q_metadataList>label[data-provider=retaindb],.IIa07q_graphNode[data-provider=retaindb]{--mn-provider-color:#d08a28}.IIa07q_providerBadge[data-provider=byterover],.IIa07q_readSourceCard[data-provider=byterover],.IIa07q_bodyCard[data-provider=byterover],.IIa07q_metadataList>label[data-provider=byterover],.IIa07q_graphNode[data-provider=byterover]{--mn-provider-color:#0f9a83}.IIa07q_providerBadge[data-provider=supermemory],.IIa07q_readSourceCard[data-provider=supermemory],.IIa07q_bodyCard[data-provider=supermemory],.IIa07q_metadataList>label[data-provider=supermemory],.IIa07q_graphNode[data-provider=supermemory]{--mn-provider-color:#df4d72}.IIa07q_bodySwitch{min-height:28px;color:var(--mn-faint);cursor:pointer;background:0 0;border:0;align-items:center;gap:8px;padding:0;font-size:12px;line-height:18px;display:flex}.IIa07q_bodySwitchTrack{box-sizing:border-box;background:var(--mn-line-strong);border-radius:999px;flex:none;width:36px;height:20px;padding:2px;transition:background-color .12s;position:relative}.IIa07q_bodySwitchTrack i{background:var(--dsw-alias-label-primary-foreground);border-radius:50%;width:16px;height:16px;transition:transform .12s;display:block}.IIa07q_bodySwitch:hover,.IIa07q_bodySwitch[aria-checked=true]{color:var(--mn-muted)}.IIa07q_bodySwitch[aria-checked=true] .IIa07q_bodySwitchTrack{background:var(--dsw-alias-brand-primary)}.IIa07q_bodySwitch[aria-checked=true] .IIa07q_bodySwitchTrack i{transform:translate(16px)}.IIa07q_bodyCardActions{align-items:center;gap:8px;display:flex}.IIa07q_bodyCreateForm{gap:16px;padding-top:0}.IIa07q_createSection{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);gap:12px;padding:14px 16px;display:grid}.IIa07q_createSectionHeading{align-items:flex-start;gap:10px;display:flex}.IIa07q_createSectionHeading>span{min-width:22px;height:22px;color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;flex:none;place-items:center;padding:0 6px;font-size:11px;font-weight:500;line-height:1;display:grid}.IIa07q_createSectionHeading>div{gap:2px;min-width:0;display:grid}.IIa07q_createSectionHeading strong{color:var(--mn-text);font-size:14px;font-weight:500;line-height:22px}.IIa07q_createSectionHeading small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_createIdentityGrid{grid-template-columns:minmax(0,1fr);align-items:stretch;gap:12px;display:grid}.IIa07q_createIdentityGrid>label{align-content:start}.IIa07q_createIdentityGrid textarea{min-height:72px}.IIa07q_strategyForm{gap:16px;padding-top:0}.IIa07q_strategyLoading{border-radius:var(--dsw-radius-md);min-height:88px;color:var(--mn-faint);background:var(--mn-fill);justify-content:center;align-items:center;font-size:12px;display:flex;position:relative}.IIa07q_strategyLoading .IIa07q_sectionSpinner{top:10px;right:10px}.IIa07q_placementMode{border:0;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:0;padding:0;display:grid}.IIa07q_placementMode legend{color:var(--mn-muted);margin-bottom:6px;font-size:12px;font-weight:500;line-height:18px}.IIa07q_placementMode label{border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-md);cursor:pointer;grid-template-columns:16px minmax(0,1fr);align-items:center;gap:10px;min-width:0;padding:12px;display:grid;position:relative}.IIa07q_placementMode label:hover{background:var(--mn-hover)}.IIa07q_placementMode label[data-selected]{border-color:var(--mn-field-line);background:var(--mn-fill)}.IIa07q_placementMode label[data-disabled]{cursor:not-allowed;opacity:.5}.IIa07q_placementMode input{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.IIa07q_placementMode span{gap:2px;display:grid}.IIa07q_placementMode strong{color:var(--mn-text);font-size:13px;font-weight:500;line-height:20px}.IIa07q_placementMode strong em{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;margin-left:6px;padding:1px 8px;font-size:11px;font-style:normal;font-weight:500;line-height:17px}.IIa07q_placementMode small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_placementPolicy{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-md);gap:10px;margin:0;padding:12px 14px;display:grid}.IIa07q_placementPolicyHeading{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.IIa07q_placementPolicyHeading>div{gap:2px;display:grid}.IIa07q_placementPolicyHeading strong{font-size:13px;font-weight:500;line-height:20px}.IIa07q_placementPolicyHeading small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_placementPolicyHeading>span{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;flex:none;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_placementRuleGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;display:grid}.IIa07q_capabilityRules{border:0;flex-wrap:wrap;gap:6px;margin:0;padding:0;display:flex}.IIa07q_capabilityRules legend{width:100%;color:var(--mn-faint);margin-bottom:4px;font-size:12px;line-height:18px}.IIa07q_capabilityRules label{border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-sm);width:fit-content;min-height:28px;color:var(--mn-muted);cursor:pointer;align-items:center;gap:6px;padding:0 10px;font-size:12px;display:flex;position:relative}.IIa07q_capabilityRules label:hover{background:var(--mn-hover)}.IIa07q_capabilityRules label[data-selected]{border-color:var(--mn-field-line);color:var(--mn-text);background:var(--mn-fill)}.IIa07q_capabilityRules input{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.IIa07q_placementCandidates{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;display:grid}.IIa07q_placementCandidates>span,.IIa07q_placementCandidates>label{border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-md);grid-template-columns:28px minmax(0,1fr) 16px;align-items:center;gap:10px;min-width:0;padding:8px 10px;display:grid;position:relative}.IIa07q_placementCandidates>label{cursor:pointer}.IIa07q_placementCandidates>label:hover{background:var(--mn-hover)}.IIa07q_placementCandidates>[data-selected]{border-color:var(--mn-field-line);background:var(--mn-fill)}.IIa07q_placementCandidates>label[data-disabled]{cursor:not-allowed;opacity:.5}.IIa07q_placementCandidates input{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.IIa07q_placementCandidates>span>span:not(.IIa07q_candidateIcon),.IIa07q_placementCandidates>label>span:not(.IIa07q_candidateIcon){gap:2px;min-width:0;display:grid}.IIa07q_placementCandidates strong{color:var(--mn-text);font-size:13px;font-weight:500;line-height:20px}.IIa07q_placementCandidates small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_providerChoice{border:0;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:0;padding:0;display:grid}.IIa07q_providerChoice legend{color:var(--mn-muted);margin-bottom:6px;font-size:12px;font-weight:500;line-height:18px}.IIa07q_providerChoice label{border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-md);cursor:pointer;grid-template-columns:32px minmax(0,1fr) 16px;align-items:center;gap:10px;min-width:0;padding:10px 12px;display:grid;position:relative}.IIa07q_providerChoice label:hover{background:var(--mn-hover)}.IIa07q_providerChoice label[data-native]{grid-column:1/-1}.IIa07q_providerChoice label[data-selected]{border-color:var(--mn-field-line);background:var(--mn-fill)}.IIa07q_providerChoice label[data-disabled]{cursor:not-allowed;opacity:.5}.IIa07q_providerChoice input{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.IIa07q_providerChoice span{gap:2px;display:grid}.IIa07q_providerChoice strong{color:var(--mn-text);font-size:13px;font-weight:500;line-height:20px}.IIa07q_providerChoice strong em{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;margin-left:6px;padding:1px 8px;font-size:11px;font-style:normal;font-weight:500;line-height:17px}.IIa07q_providerChoice label[data-selected] strong em{background:var(--mn-layer-1)}.IIa07q_providerChoice small{color:var(--mn-faint);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.IIa07q_providerChoiceIcon,.IIa07q_candidateIcon,.IIa07q_providerFieldIcon{box-sizing:border-box;border:.5px solid var(--mn-line-strong);background:var(--mn-layer-1);place-items:center;display:grid;overflow:hidden}.IIa07q_providerChoiceIcon{border-radius:var(--dsw-radius-sm);width:32px;height:32px;padding:4px}.IIa07q_candidateIcon{border-radius:var(--dsw-radius-sm);width:28px;height:28px;padding:4px}.IIa07q_providerFieldIcon{border-radius:var(--dsw-radius-sm);flex:none;width:32px;height:32px;padding:4px}.IIa07q_providerChoiceIcon>img,.IIa07q_providerChoiceIcon>svg,.IIa07q_candidateIcon>img,.IIa07q_candidateIcon>svg,.IIa07q_providerFieldIcon>img,.IIa07q_providerFieldIcon>svg{object-fit:contain;border-radius:4px;width:100%;height:100%;display:block}.IIa07q_choiceControl{box-sizing:border-box;border:1px solid var(--mn-field-line);background:var(--mn-layer-1);border-radius:4px;flex:none;place-items:center;width:16px;height:16px;display:grid;position:relative}.IIa07q_choiceControl[data-kind=radio]{border-radius:50%}[data-selected]>.IIa07q_choiceControl{border-color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-brand-primary)}[data-selected]>.IIa07q_choiceControl[data-kind=check]:after{border-bottom:1.5px solid var(--dsw-alias-label-primary-foreground);border-left:1.5px solid var(--dsw-alias-label-primary-foreground);content:\"\";width:7px;height:4px;transform:translateY(-1px)rotate(-45deg)}[data-selected]>.IIa07q_choiceControl[data-kind=radio]:after{content:\"\";background:var(--dsw-alias-label-primary-foreground);border-radius:50%;width:6px;height:6px}.IIa07q_placementMode label:has(input:focus-visible),.IIa07q_providerChoice label:has(input:focus-visible),.IIa07q_capabilityRules label:has(input:focus-visible),.IIa07q_placementCandidates label:has(input:focus-visible){outline:var(--dsw-focus-ring-width,2px) solid var(--mn-focus);outline-offset:1px}.IIa07q_providerFields{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-md);gap:10px;padding:12px 14px;display:grid}.IIa07q_providerFieldHeading{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.IIa07q_providerFieldIdentity{align-items:center;gap:10px;min-width:0;display:flex}.IIa07q_providerFieldIdentity>div{gap:2px;min-width:0;display:grid}.IIa07q_providerFieldHeading strong{color:var(--mn-text);font-size:13px;font-weight:500;line-height:20px}.IIa07q_providerFieldHeading small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_providerFieldHeading>span{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;flex:none;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_providerFields details{min-width:0}.IIa07q_providerFields summary{width:fit-content;color:var(--mn-muted);cursor:pointer;font-size:12px;line-height:18px}.IIa07q_providerFields summary:hover{color:var(--mn-text)}.IIa07q_providerEnableHint{color:var(--mn-faint);margin-top:8px;font-size:12px;line-height:18px;display:block}.IIa07q_providerAdvancedGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:8px;display:grid}.IIa07q_providerFieldControl .IIa07q_providerSecretClear{color:var(--mn-muted);cursor:pointer;align-items:center;gap:6px;font-size:12px;font-weight:400;display:flex}.IIa07q_providerWriteHint{color:var(--mn-faint);margin-top:4px;font-size:12px;line-height:18px;display:block}.IIa07q_placementReceipt{border-radius:var(--dsw-radius-sm);min-width:0;color:var(--mn-muted);background:var(--mn-fill);align-items:flex-start;gap:8px;margin:8px 0;padding:8px 10px;display:flex}.IIa07q_placementReceipt>span{flex:none;font-size:12px}.IIa07q_placementReceipt>div{grid-template-columns:minmax(0,1fr) auto;gap:2px 8px;min-width:0;display:grid}.IIa07q_placementReceipt strong,.IIa07q_placementReceipt small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.IIa07q_placementReceipt strong{color:var(--mn-text);font-size:12px;font-weight:500;line-height:18px}.IIa07q_placementReceipt small{color:var(--mn-faint);font-size:11px;line-height:18px}.IIa07q_placementReceipt p{color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;grid-column:1/-1;margin:0;font-size:12px;line-height:18px;overflow:hidden}.IIa07q_bodyCard>p{min-height:18px;color:var(--mn-muted);margin:8px 0;font-size:13px;line-height:20px}.IIa07q_bodyCard footer{border-top:.5px solid var(--mn-line);min-width:0;color:var(--mn-faint);flex-wrap:nowrap;gap:4px 12px;padding-top:8px;font-size:12px;line-height:18px;display:flex;overflow:hidden}.IIa07q_bodyFooterBlock{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;display:block;overflow:hidden}.IIa07q_bodyFooterGrow{flex:auto}.IIa07q_graphLayout{grid-template-columns:minmax(0,1fr) minmax(240px,280px);gap:12px;display:grid}.IIa07q_graphPanel,.IIa07q_graphInspector{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg)}.IIa07q_graphPanel{min-width:0;position:relative;overflow:hidden}.IIa07q_graphToolbar,.IIa07q_graphFooter{min-height:44px;color:var(--mn-faint);justify-content:space-between;align-items:center;gap:16px;padding:0 14px;font-size:12px;line-height:18px;display:flex}.IIa07q_graphToolbar{border-bottom:.5px solid var(--mn-line)}.IIa07q_graphToolbar>div:first-child{align-items:center;gap:8px;display:flex}.IIa07q_graphToolbar small{color:var(--mn-faint)}.IIa07q_liveDot{background:var(--mn-success);border-radius:50%;width:6px;height:6px}.IIa07q_graphLegend{flex-wrap:wrap;justify-content:flex-end;gap:4px 12px;display:flex}.IIa07q_graphLegend span{align-items:center;gap:6px;display:flex}.IIa07q_graphLegend span:before{content:\"\";background:var(--edge-color);border-radius:2px;width:14px;height:2px}.IIa07q_graphLegend [data-edge=temporal]{--edge-color:#87909f}.IIa07q_graphLegend [data-edge=scope]{--edge-color:#708199}.IIa07q_graphLegend [data-edge=scope]:before{background:repeating-linear-gradient(90deg, var(--edge-color) 0 4px, transparent 4px 7px)}.IIa07q_graphLegend [data-edge=semantic]{--edge-color:#4d7cfe}.IIa07q_graphLegend [data-edge=causal]{--edge-color:#ef6b5b}.IIa07q_graphLegend [data-edge=entity]{--edge-color:#22a879}.IIa07q_graphViewport{min-height:clamp(390px,42vw,560px);position:relative;overflow:hidden}.IIa07q_graphCanvasControls{z-index:2;border-radius:var(--dsw-radius-md);background:var(--dsw-specific-menu,var(--mn-layer-2));box-shadow:var(--dsw-elevation-soft);backdrop-filter:var(--dsw-menu-backdrop-filter);align-items:center;gap:4px;padding:4px;display:flex;position:absolute;top:10px;right:10px}.IIa07q_graphCanvasControls span{color:var(--mn-faint);align-items:center;gap:6px;padding:0 6px;font-size:12px;display:flex}.IIa07q_graphCanvasControls span i{background:var(--mn-accent);border-radius:50%;width:6px;height:6px}.IIa07q_graphCanvasControls button{border-radius:var(--dsw-radius-sm);min-height:28px;color:var(--mn-muted);cursor:pointer;background:0 0;border:0;padding:0 10px;font-size:12px}.IIa07q_graphCanvasControls button:hover{color:var(--mn-text);background:var(--mn-hover)}.IIa07q_graphCanvasControls button[data-active]{color:var(--mn-text);background:var(--mn-fill)}.IIa07q_graphSvg{touch-action:pan-y pinch-zoom;user-select:none;width:100%;height:clamp(390px,42vw,560px);display:block}.IIa07q_graphBackdrop{fill:var(--mn-layer-1)}.IIa07q_graphGridLine{stroke:var(--mn-line);stroke-width:.6px;opacity:.5}.IIa07q_graphEdge{fill:none;stroke:#87909f;stroke-width:1px;opacity:.32;vector-effect:non-scaling-stroke}.IIa07q_graphEdge[data-edge=scope]{stroke:#708199;stroke-dasharray:4 5;opacity:.28}.IIa07q_graphEdge[data-edge=semantic]{stroke:#4d7cfe;opacity:.48}.IIa07q_graphEdge[data-edge=causal]{stroke:#ef6b5b;opacity:.52}.IIa07q_graphEdge[data-edge=entity]{stroke:#22a879;stroke-width:1.45px;opacity:.78}.IIa07q_graphNode{--node:#8290a8;cursor:grab;touch-action:none;outline:none}.IIa07q_graphNode[data-dragging]{cursor:grabbing}.IIa07q_graphNode[data-category=decision]{--node:#ef8354}.IIa07q_graphNode[data-category=preference]{--node:#a879e1}.IIa07q_graphNode[data-category=fact]{--node:#4d7cfe}.IIa07q_graphNode[data-category=insight]{--node:#19a77d}.IIa07q_graphNode[data-category=context]{--node:#d8a624}.IIa07q_graphNode[data-kind=space]{--node:var(--mn-provider-color)}.IIa07q_graphNode[data-kind=entity]{--node:#2b9db9}.IIa07q_nodeHalo{fill:color-mix(in srgb, var(--node) 18%, var(--mn-layer-1));stroke:color-mix(in srgb, var(--node) 60%, var(--mn-layer-1));stroke-width:1.5px;transition:r .16s}.IIa07q_nodeCore{fill:var(--node)}.IIa07q_nodeLabel{fill:var(--mn-muted);font:11px var(--mn-sans);pointer-events:auto}.IIa07q_nodeBodyLabel{fill:var(--mn-faint);font:500 11px var(--mn-sans);pointer-events:auto}.IIa07q_graphSvg[data-density=sparse] .IIa07q_nodeLabel{font-size:12px}.IIa07q_graphNode:hover .IIa07q_nodeHalo,.IIa07q_graphNode:focus .IIa07q_nodeHalo,.IIa07q_graphNode[data-selected] .IIa07q_nodeHalo{fill:color-mix(in srgb, var(--node) 28%, var(--mn-layer-1));stroke:var(--node)}.IIa07q_graphNode[data-selected] .IIa07q_nodeLabel{fill:var(--mn-text);font-weight:500}.IIa07q_graphFooter{border-top:.5px solid var(--mn-line);min-height:40px;color:var(--mn-faint)}.IIa07q_graphInspector{min-width:0;min-height:calc(clamp(390px,42vw,560px) + 84px);padding:16px;overflow:hidden}.IIa07q_inspectorEmpty{text-align:center;flex-direction:column;justify-content:center;align-items:center;height:100%;display:flex}.IIa07q_inspectorLogo{border-radius:var(--dsw-radius-lg);opacity:.72;width:48px;height:48px;margin-bottom:12px}.IIa07q_inspectorEmpty h3{margin:6px 0 2px;font-size:14px;font-weight:500;line-height:22px}.IIa07q_inspectorEmpty p{color:var(--mn-faint);margin:0;font-size:12px;line-height:18px}.IIa07q_inspectorHeading{justify-content:space-between;align-items:center;display:flex}.IIa07q_inspectorHeading button{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--mn-muted);cursor:pointer;background:0 0;border:0;place-items:center;display:grid}.IIa07q_inspectorHeading button:hover{background:var(--mn-hover)}.IIa07q_inspectorChips{flex-wrap:wrap;align-items:center;gap:6px;margin-top:20px;display:flex}.IIa07q_categoryChip{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px;display:inline-flex}.IIa07q_inspectorTitleRow{align-items:flex-start;gap:8px;min-width:0;margin:12px 0 20px;display:flex}.IIa07q_inspectorTitle{overflow-wrap:anywhere;white-space:pre-wrap;-webkit-line-clamp:6;-webkit-box-orient:vertical;flex:1;min-width:0;margin:0;font-size:14px;font-weight:400;line-height:22px;display:-webkit-box;overflow:hidden}.IIa07q_inspectorEye{border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--mn-muted);cursor:pointer;background:0 0;flex:none;place-items:center;transition:color .15s,background-color .15s;display:grid}.IIa07q_inspectorEye:hover{color:var(--mn-text);background:var(--mn-hover)}.IIa07q_inspectorMeta{margin:0}.IIa07q_inspectorMeta>div{border-top:.5px solid var(--mn-line);gap:2px;padding:10px 0;display:grid}.IIa07q_inspectorMeta dt{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_inspectorMeta dd{overflow-wrap:anywhere;color:var(--mn-muted);margin:0;font-size:13px;line-height:20px}.IIa07q_inspectorActions{gap:8px;margin-top:20px;display:grid}.IIa07q_previewContent{white-space:pre-wrap;overflow-wrap:anywhere;color:var(--mn-text);margin:0;font-size:14px;line-height:22px}.IIa07q_searchBar{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-bottom:16px;padding:14px}.IIa07q_queryField{width:100%;height:40px}.IIa07q_searchChoice{min-width:160px}.IIa07q_searchControls{justify-content:flex-end;align-items:flex-end;gap:12px;padding-top:12px;display:flex}.IIa07q_searchActions{align-items:center;gap:8px;display:flex}.IIa07q_agentAnswer{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-bottom:16px;padding:16px}.IIa07q_agentAnswerHeading{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.IIa07q_agentAnswerHeading span{color:var(--mn-faint);font-size:12px;font-weight:500;line-height:18px}.IIa07q_agentAnswerHeading h3{margin:2px 0 0;font-size:14px;font-weight:500;line-height:22px}.IIa07q_agentAnswerHeading>code{color:var(--mn-faint);font-size:11px}.IIa07q_agentAnswer>p{white-space:pre-wrap;color:var(--mn-text);margin:12px 0;font-size:14px;line-height:22px}.IIa07q_agentCitations{border-top:.5px solid var(--mn-line);flex-wrap:wrap;align-items:center;gap:6px;padding-top:10px;display:flex}.IIa07q_agentCitations small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_agentCitations span{max-width:100%;color:var(--mn-muted);background:var(--mn-fill);text-overflow:ellipsis;white-space:nowrap;border-radius:999px;padding:1px 8px;font-size:12px;line-height:18px;overflow:hidden}.IIa07q_fieldWide{color:var(--mn-muted);gap:6px;font-size:12px;font-weight:500;line-height:18px;display:grid}.IIa07q_supervisedForm textarea:focus{border-color:var(--mn-accent)}.IIa07q_singleColumn{max-width:830px}.IIa07q_resultLayout{grid-template-columns:minmax(0,1.15fr) minmax(300px,.85fr);align-items:start;gap:16px;display:grid}.IIa07q_results,.IIa07q_relatedPane,.IIa07q_entityResults{min-width:0}.IIa07q_relatedPane{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);-webkit-overflow-scrolling:touch;max-height:calc(100dvh - 230px);padding:14px;scroll-margin-top:14px;position:sticky;top:12px;overflow:auto}.IIa07q_relatedSource{border-radius:var(--dsw-radius-sm);color:var(--mn-muted);background:var(--mn-fill);margin:0 0 12px;padding:10px 12px;font-size:13px;line-height:20px}.IIa07q_insightCard{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);min-width:0;margin-bottom:8px;padding:14px 16px;transition:background-color .15s}.IIa07q_insightCard:hover{background:color-mix(in srgb, var(--mn-hover) 50%, transparent)}.IIa07q_cardTop{justify-content:space-between;align-items:center;gap:12px;display:flex}.IIa07q_badges,.IIa07q_tags,.IIa07q_entities{flex-wrap:wrap;gap:6px;display:flex}.IIa07q_badge{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_id{color:var(--mn-faint);font-size:11px}.IIa07q_content{white-space:pre-wrap;overflow-wrap:anywhere;margin:10px 0;font-size:14px;line-height:22px}.IIa07q_tags{color:var(--mn-accent);font-size:12px;line-height:18px}.IIa07q_entities{margin-top:8px}.IIa07q_entities span{border:.5px solid var(--mn-field-line);color:var(--mn-faint);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_cardActions{border-top:.5px solid var(--mn-line);justify-content:flex-end;align-items:center;gap:4px;min-height:32px;margin-top:10px;padding-top:8px;display:flex}.IIa07q_entityLayout{grid-template-columns:264px minmax(0,1fr);align-items:start;gap:16px;display:grid}.IIa07q_entityRail{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);padding:12px;position:sticky;top:0}.IIa07q_entitySearch{grid-template-columns:minmax(0,1fr) auto;gap:8px;display:grid}.IIa07q_entitySearch input{min-width:0}.IIa07q_entityHeading{justify-content:space-between;align-items:center;margin:16px 4px 6px;display:flex}.IIa07q_entityHeading small{color:var(--mn-faint);font-size:12px}.IIa07q_entityList{gap:2px;display:grid}.IIa07q_entityList button{border-radius:var(--dsw-radius-sm);min-height:32px;color:var(--mn-muted);cursor:pointer;text-align:left;background:0 0;border:0;justify-content:space-between;align-items:center;gap:10px;padding:0 10px;display:flex}.IIa07q_entityList button:hover,.IIa07q_entityList button[aria-pressed=true]{color:var(--mn-text);background:var(--mn-hover)}.IIa07q_entityList button[aria-pressed=true]{background:var(--mn-fill)}.IIa07q_entityList button>span{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.IIa07q_entityList strong{color:var(--mn-faint);font-variant-numeric:tabular-nums;flex:none;font-size:12px;font-weight:400}.IIa07q_entityResults>.IIa07q_emptyState{min-height:360px}.IIa07q_entitySection{min-width:0}.IIa07q_entitySection+.IIa07q_entitySection{margin-top:24px}.IIa07q_entitySectionBody{min-height:116px}.IIa07q_entityQuiet{color:var(--mn-faint);margin:0 0 8px;padding:12px 2px;font-size:13px;line-height:20px}.IIa07q_entityRetry{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 12px;display:flex}.IIa07q_entityRelatedHead{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.IIa07q_entityRelatedHead>div:first-child{flex:1;min-width:0}.IIa07q_entityRelatedHead>button{flex:none;margin-top:2px}.IIa07q_insightSkeleton{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);align-content:start;gap:12px;min-height:108px;margin-bottom:8px;padding:16px;display:grid;position:relative;overflow:hidden}.IIa07q_insightSkeleton>span{background:var(--mn-fill);border-radius:999px;height:10px;display:block}.IIa07q_insightSkeleton>span:first-child{width:36%}.IIa07q_insightSkeleton>span:nth-child(2){width:94%}.IIa07q_insightSkeleton>span:nth-child(3){width:68%}.IIa07q_entityRailSkeleton{border-radius:var(--dsw-radius-sm);background:color-mix(in srgb, var(--mn-fill) 55%, transparent);height:32px;display:block;position:relative;overflow:hidden}.IIa07q_insightSkeleton:after,.IIa07q_entityRailSkeleton:after{content:\"\";background:linear-gradient(105deg, transparent 20%, color-mix(in srgb, var(--mn-text) 5%, transparent) 45%, transparent 70%);pointer-events:none;animation:1.2s ease-in-out infinite IIa07q_entity-skeleton-sweep;position:absolute;inset:0;transform:translate(-120%)}@keyframes IIa07q_entity-skeleton-sweep{to{transform:translate(120%)}}@media (prefers-reduced-motion:reduce){.IIa07q_insightSkeleton:after,.IIa07q_entityRailSkeleton:after{animation:none}}.IIa07q_readSourceCard[data-status=loading] .IIa07q_readSourceSignal{background:var(--mn-idle)}.IIa07q_supervisedComposer{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);overflow:hidden}.IIa07q_supervisedForm{padding:16px}.IIa07q_candidateHeading{justify-content:space-between;align-items:center;gap:8px;min-width:0;margin-bottom:8px;display:flex}.IIa07q_candidateHeading>label{color:var(--mn-text);font-size:13px;font-weight:500;line-height:20px}.IIa07q_supervisedForm textarea{resize:vertical;border:.5px solid var(--mn-field-line);border-radius:var(--dsw-radius-md);width:100%;color:var(--mn-text);background:var(--mn-input);outline:0;padding:10px 12px;font-size:14px;line-height:22px}.IIa07q_sessionHint{color:var(--mn-danger);margin:8px 0 0;font-size:12px;line-height:18px}.IIa07q_fieldWide{grid-column:1/-1}.IIa07q_advancedWrite{border-top:.5px solid var(--mn-line)}.IIa07q_advancedWrite summary{cursor:pointer;justify-content:space-between;align-items:center;gap:16px;min-height:56px;padding:10px 16px;list-style:none;display:flex}.IIa07q_advancedWrite summary:hover{background:var(--mn-hover)}.IIa07q_advancedWrite summary::-webkit-details-marker{display:none}.IIa07q_advancedWrite summary>span:first-child{gap:2px;display:grid}.IIa07q_advancedWrite summary strong{font-size:13px;font-weight:500;line-height:20px}.IIa07q_advancedWrite summary small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_advancedWrite summary>span:last-child{color:var(--mn-faint);font-size:16px;line-height:1}.IIa07q_advancedWrite[open] summary{border-bottom:.5px solid var(--mn-line)}.IIa07q_advancedWrite[open] summary>span:last-child{font-size:0}.IIa07q_advancedWrite[open] summary>span:last-child:after{content:\"−\";font-size:16px}.IIa07q_manualForm{padding:4px 16px 16px}.IIa07q_manualActions{justify-content:space-between;align-items:center;gap:16px;margin-top:16px;display:flex}.IIa07q_manualActions p{max-width:520px;color:var(--mn-faint);margin:0;font-size:12px;line-height:18px}.IIa07q_listToolbar{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);grid-template-columns:minmax(0,1fr) 180px auto;gap:8px;padding:12px;display:grid}.IIa07q_listToolbar>*{min-width:0}.IIa07q_listNotice{color:var(--mn-faint);margin:10px 2px 16px;font-size:12px;line-height:18px}.IIa07q_listNotice span{color:var(--mn-success);background:color-mix(in srgb, var(--mn-success) 10%, transparent);border-radius:999px;margin-right:8px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_memoryList{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;gap:8px;display:grid}.IIa07q_memoryList .IIa07q_insightCard{height:100%;margin:0}.IIa07q_modalFooterNote{max-width:54ch;color:var(--mn-faint);margin:0 auto 0 0;font-size:12px;line-height:18px}.IIa07q_modalInlineStatus{color:var(--mn-muted);overflow-wrap:anywhere;margin:12px 0 0;font-size:12px;line-height:18px}.IIa07q_metadataDialog{gap:12px;display:grid}.IIa07q_metadataToolbar{color:var(--mn-faint);justify-content:space-between;align-items:center;gap:12px;font-size:12px;line-height:18px;display:flex}.IIa07q_metadataToolbar>span{align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_metadataToolbar em{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;padding:1px 8px;font-size:11px;font-style:normal;font-weight:500;line-height:17px}.IIa07q_metadataList{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;display:grid}.IIa07q_metadataEmpty{border-radius:var(--dsw-radius-md);color:var(--mn-faint);background:var(--mn-fill);text-align:center;grid-column:1/-1;padding:20px;font-size:12px}.IIa07q_metadataList>label{cursor:pointer;grid-template-columns:16px minmax(0,1fr);align-items:start;gap:10px;min-width:0;min-height:76px;padding:12px;display:grid;position:relative}.IIa07q_metadataList>label:hover{background:var(--mn-hover)}.IIa07q_metadataList>label[data-selected]{border-color:var(--mn-field-line);background:var(--mn-fill)}.IIa07q_metadataList>label[data-refreshing]{overflow:hidden}.IIa07q_metadataList>label[data-refreshing]:after{content:\"\";background:linear-gradient(105deg, transparent 20%, color-mix(in srgb, var(--mn-accent) 10%, transparent) 45%, transparent 70%);pointer-events:none;animation:.9s ease-in-out infinite IIa07q_mnemon-metadata-sweep;position:absolute;inset:0;transform:translate(-120%)}.IIa07q_metadataList>label[data-refreshed]{animation:.9s ease-out IIa07q_mnemon-metadata-refreshed}.IIa07q_metadataList>label[data-failed]{border-color:color-mix(in srgb, var(--mn-danger) 40%, transparent)}.IIa07q_metadataList>label>input{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.IIa07q_metadataList>label>span{gap:4px;min-width:0;display:grid}.IIa07q_metadataList strong{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;line-height:20px;overflow:hidden}.IIa07q_metadataList small{color:var(--mn-faint);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.IIa07q_metadataList>label>span>span{align-items:center;gap:6px;min-width:0;display:flex}.IIa07q_metadataList code{color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.IIa07q_metadataTaskStatus{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12px;line-height:18px;overflow:hidden}.IIa07q_metadataTaskStatus[data-status=running]{color:var(--mn-faint)}.IIa07q_metadataTaskStatus[data-status=success]{color:var(--mn-success)}.IIa07q_metadataTaskStatus[data-status=error]{color:var(--mn-danger)}@media (prefers-reduced-motion:reduce){.IIa07q_metadataList>label[data-refreshing]:after,.IIa07q_metadataList>label[data-refreshed]{animation:none}}@media (width<=1000px){.IIa07q_graphLayout{display:block;position:relative}.IIa07q_graphInspector{width:auto;min-height:0;box-shadow:none;margin-top:12px;position:static;overflow:visible}.IIa07q_graphInspector[data-empty]{display:none}.IIa07q_resultLayout{grid-template-columns:1fr}.IIa07q_relatedPane{grid-row:1;max-height:none;position:static}.IIa07q_memoryList{grid-template-columns:1fr}}@media (width<=760px){.IIa07q_metadataList{grid-template-columns:1fr}.IIa07q_modalFooterNote{max-width:none;margin:0}.IIa07q_modal .IIa07q_supervisedForm textarea{min-height:clamp(130px,30vh,210px)}.IIa07q_entityLayout{grid-template-columns:1fr}.IIa07q_manualActions{flex-direction:column;align-items:stretch}.IIa07q_entityRail{position:static}.IIa07q_searchControls{grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.IIa07q_searchActions{grid-column:1/-1}.IIa07q_searchActions>button{flex:1}.IIa07q_listToolbar{grid-template-columns:1fr}.IIa07q_bodyDirectoryHeader{grid-template-columns:minmax(0,1fr);display:grid}.IIa07q_bodyDirectoryHeader>div{min-width:0}.IIa07q_bodyDirectoryPath{max-width:100%}.IIa07q_bodyDirectoryControls{flex-wrap:wrap;justify-content:flex-start;padding-right:0}.IIa07q_createIdentityGrid,.IIa07q_placementMode,.IIa07q_placementRuleGrid,.IIa07q_placementCandidates,.IIa07q_providerChoice,.IIa07q_providerAdvancedGrid{grid-template-columns:1fr}.IIa07q_graphViewport{min-height:360px}.IIa07q_graphSvg{height:390px}.IIa07q_graphCanvasControls{top:8px;right:8px}.IIa07q_graphCanvasControls span{display:none}}@media (width<=520px){.IIa07q_memoryHeaderActions{width:100%}.IIa07q_memoryHeaderActions>button{flex:1}.IIa07q_cardTop{flex-direction:column;align-items:flex-start}.IIa07q_cardActions{flex-wrap:wrap;align-items:stretch}.IIa07q_cardActions button{flex:1}.IIa07q_searchControls{grid-template-columns:1fr}}@supports (height:100dvh){@media (width<=760px){.IIa07q_modal .IIa07q_supervisedForm textarea{min-height:clamp(130px,30dvh,210px)}}}@media (width<=1000px) and (height<=760px){.IIa07q_graphViewport{min-height:300px}.IIa07q_graphSvg{height:300px}}";
4021
4164
  const tagId$6 = "dsh-mnemon-source-memory-spaces/presentation/page.module.css";
4022
4165
  if (typeof document !== "undefined") {
4023
4166
  let tag = document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$6) + "]");
@@ -4125,6 +4268,7 @@ window.__ModuleLoader__.load({
4125
4268
  "modalFooterNote": "IIa07q_modalFooterNote",
4126
4269
  "modalInlineStatus": "IIa07q_modalInlineStatus",
4127
4270
  "muted": "IIa07q_muted",
4271
+ "newSpaceBadge": "IIa07q_newSpaceBadge",
4128
4272
  "nodeBodyLabel": "IIa07q_nodeBodyLabel",
4129
4273
  "nodeCore": "IIa07q_nodeCore",
4130
4274
  "nodeHalo": "IIa07q_nodeHalo",
@@ -4155,6 +4299,7 @@ window.__ModuleLoader__.load({
4155
4299
  "readSourceSignal": "IIa07q_readSourceSignal",
4156
4300
  "readSourceState": "IIa07q_readSourceState",
4157
4301
  "readSources": "IIa07q_readSources",
4302
+ "rediscoveryNotice": "IIa07q_rediscoveryNotice",
4158
4303
  "relatedPane": "IIa07q_relatedPane",
4159
4304
  "relatedSource": "IIa07q_relatedSource",
4160
4305
  "resultLayout": "IIa07q_resultLayout",
@@ -6344,7 +6489,7 @@ window.__ModuleLoader__.load({
6344
6489
  window.setTimeout(() => URL.revokeObjectURL(url), 0);
6345
6490
  }
6346
6491
  /** Backup and migration of the data directory as one ZIP; the directory itself shows beside the storage choice. */
6347
- function MnemonPackSection({ connection, sessionId, workspaceId, target, t }) {
6492
+ function MnemonPackSection({ connection, sessionId, workspaceId, target, onImported, t }) {
6348
6493
  const client = (0, react.useMemo)(() => connection === void 0 ? null : new MnemonClient(connection, sessionId, workspaceId), [
6349
6494
  connection,
6350
6495
  sessionId,
@@ -6410,6 +6555,7 @@ window.__ModuleLoader__.load({
6410
6555
  setFailed(message(reason));
6411
6556
  } finally {
6412
6557
  setBusy(null);
6558
+ onImported?.();
6413
6559
  }
6414
6560
  };
6415
6561
  const items = pending?.preview.manifest.summary.reduce((sum, component) => sum + component.items, 0) ?? 0;
@@ -6565,7 +6711,7 @@ window.__ModuleLoader__.load({
6565
6711
  case "document-archive": return t("review.opArchive", { id: operation.documentId });
6566
6712
  }
6567
6713
  }
6568
- function stamp$1(value) {
6714
+ function stamp(value) {
6569
6715
  const parsed = new Date(value);
6570
6716
  return Number.isNaN(parsed.getTime()) ? value : parsed.toLocaleString();
6571
6717
  }
@@ -6667,7 +6813,7 @@ window.__ModuleLoader__.load({
6667
6813
  setComplaint(t("review.noSelection"));
6668
6814
  return;
6669
6815
  }
6670
- submit(entry.id, (api) => api.applyReview(entry.id, selection).then((result) => {
6816
+ submit(entry.id, (api) => api.applyReview(entry.id, selection).finally(() => props.onApplied?.()).then((result) => {
6671
6817
  setNotice(t("review.applied", { count: result.applied }));
6672
6818
  setChosen((previous) => {
6673
6819
  const next = { ...previous };
@@ -6746,12 +6892,12 @@ window.__ModuleLoader__.load({
6746
6892
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("review.meta", {
6747
6893
  count: entry.operations.length,
6748
6894
  machine: entry.machine.label,
6749
- time: stamp$1(entry.createdAt)
6895
+ time: stamp(entry.createdAt)
6750
6896
  }) }),
6751
6897
  entry.foreignMachines.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("review.foreign", { machines: entry.foreignMachines.join(", ") }) }),
6752
6898
  entry.appliedAt !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
6753
6899
  className: MnemonSettingsCard_module_css_default.syncSuccess,
6754
- children: t("review.appliedAt", { time: stamp$1(entry.appliedAt) })
6900
+ children: t("review.appliedAt", { time: stamp(entry.appliedAt) })
6755
6901
  }),
6756
6902
  (entry.appliedOperations ?? []).length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("review.appliedCount", {
6757
6903
  count: (entry.appliedOperations ?? []).length,
@@ -6867,14 +7013,6 @@ window.__ModuleLoader__.load({
6867
7013
  })]
6868
7014
  })
6869
7015
  }),
6870
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6871
- className: MnemonSettingsCard_module_css_default.reviewRules,
6872
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("review.rulesTitle") }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", { children: [
6873
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: t("review.rulesPull") }),
6874
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: t("review.rulesDiff") }),
6875
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: t("review.rulesPlan") })
6876
- ] })]
6877
- }),
6878
7016
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6879
7017
  className: MnemonSettingsCard_module_css_default.reviewGuidance,
6880
7018
  children: [
@@ -6947,16 +7085,79 @@ window.__ModuleLoader__.load({
6947
7085
  });
6948
7086
  }
6949
7087
  //#endregion
6950
- //#region src/client/MnemonSyncSection.tsx
6951
- /** How many backups one page of the branch history holds. */
6952
- const BACKUP_PAGE = 20;
6953
- /**
6954
- * The intervals the form offers. The floor is an hour: a backup more often than
6955
- * that is a repository being rewritten, not a memory being kept. The ceiling is
6956
- * a week, and off is the first choice because it is what a channel that has
6957
- * never been configured does.
6958
- */
6959
- const AUTO_BACKUP_CHOICES = [
7088
+ //#region src/client/sync-view.ts
7089
+ /** The transport one repository address uses. */
7090
+ function transportOf(url) {
7091
+ const value = url.trim();
7092
+ if (/^https:\/\//iu.test(value)) return "https";
7093
+ if (/^ssh:\/\//iu.test(value) || /^[A-Za-z0-9._-]+@[A-Za-z0-9._-]+:/u.test(value)) return "ssh";
7094
+ return "local";
7095
+ }
7096
+ /** Whether an address is HTTPS on github.com, the only host a GitHub sign-in is offered to. */
7097
+ function onGitHub(url) {
7098
+ try {
7099
+ const parsed = new URL(url.trim());
7100
+ return parsed.protocol === "https:" && parsed.hostname.toLowerCase() === "github.com";
7101
+ } catch {
7102
+ return false;
7103
+ }
7104
+ }
7105
+ /** A repository address as a reader recognizes it: host and path, without the scheme or `.git`. */
7106
+ function repositoryName(url) {
7107
+ const value = url.trim();
7108
+ if (transportOf(value) !== "https" && !/^ssh:\/\//iu.test(value)) return value;
7109
+ try {
7110
+ const parsed = new URL(value);
7111
+ return (parsed.host + parsed.pathname).replace(/\.git$/u, "").replace(/\/$/u, "");
7112
+ } catch {
7113
+ return value;
7114
+ }
7115
+ }
7116
+ function repositoryProblem(url) {
7117
+ const value = url.trim();
7118
+ if (value === "") return void 0;
7119
+ if (value.length > 2e3 || /\s/u.test(value)) return "format";
7120
+ if (/^[A-Za-z][A-Za-z0-9+.-]*:\/\//u.test(value)) {
7121
+ if (!/^(https|ssh):\/\/[^\s/]+(?::\d+)?\/[^\s]+$/u.test(value)) return "format";
7122
+ return /^https:\/\/[^/]*@/u.test(value) ? "credentials" : void 0;
7123
+ }
7124
+ if (/^[A-Za-z0-9._-]+@[A-Za-z0-9._-]+:[^\s]+$/u.test(value)) return void 0;
7125
+ return value.startsWith("/") || /^[A-Za-z]:[\\/]/u.test(value) || value.startsWith("\\\\") ? void 0 : "format";
7126
+ }
7127
+ /** A Git branch name, as the Host checks it. */
7128
+ function branchValid(value) {
7129
+ const name = value.trim();
7130
+ return name !== "" && name.length <= 200 && /^[A-Za-z0-9][A-Za-z0-9._/-]*$/u.test(name) && !name.includes("..") && !name.includes("//") && !name.includes("@{") && !name.endsWith("/") && !name.endsWith(".") && !name.endsWith(".lock");
7131
+ }
7132
+ /** A directory inside the branch, as the Host checks it. */
7133
+ function directoryValid(value) {
7134
+ const raw = value.trim().replaceAll("\\", "/");
7135
+ if (raw === "" || raw.length > 400 || /^[A-Za-z]:/u.test(raw)) return false;
7136
+ const parts = raw.split("/").filter((part) => part !== "");
7137
+ return parts.length > 0 && !parts.some((part) => part === "." || part === ".." || part.includes(":"));
7138
+ }
7139
+ function emailValid(value) {
7140
+ const email = value.trim();
7141
+ return email.length <= 320 && /^[^\s<>@]+@[^\s<>@]+$/u.test(email);
7142
+ }
7143
+ /** A name for this computer, as the Host stores one: one line, at most the shared limit. */
7144
+ function machineNameValid(value) {
7145
+ const name = value.trim();
7146
+ return name !== "" && name.length <= 120 && !/[\p{Cc}\u2028\u2029]/u.test(name);
7147
+ }
7148
+ /** A GitHub repository name, as GitHub accepts one. */
7149
+ function repositoryNameValid(value) {
7150
+ return /^(?!\.\.?$)[A-Za-z0-9._-]{1,100}$/u.test(value.trim());
7151
+ }
7152
+ function authorModeOf(name, email) {
7153
+ if (name === "dsh-mnemon sync" && email === "mnemon@localhost") return "default";
7154
+ if (name === "" && email === "") return "machine";
7155
+ return "custom";
7156
+ }
7157
+ /** The channel identity as a commit shows it. */
7158
+ const DEFAULT_AUTHOR = "dsh-mnemon sync <mnemon@localhost>";
7159
+ /** The intervals automatic sync offers, in minutes; off first, then an hour up to a week. */
7160
+ const AUTO_SYNC_CHOICES = [
6960
7161
  0,
6961
7162
  60,
6962
7163
  180,
@@ -6966,79 +7167,488 @@ window.__ModuleLoader__.load({
6966
7167
  4320,
6967
7168
  10080
6968
7169
  ];
6969
- /** One interval as the reader reads it: off, whole days, or whole hours. */
7170
+ /** One interval as a reader reads it. */
6970
7171
  function intervalLabel(t, minutes) {
6971
- if (minutes <= 0) return t("config.syncAutoBackupOff");
6972
- if (minutes % 1440 === 0) return t("config.syncAutoBackupDays", { days: minutes / 1440 });
6973
- return t("config.syncAutoBackupHours", { hours: minutes / 60 });
7172
+ if (minutes <= 0) return t("config.syncAutoOff");
7173
+ if (minutes === 60) return t("config.syncAutoHour");
7174
+ if (minutes === 1440) return t("config.syncAutoDay");
7175
+ if (minutes % 1440 === 0) return t("config.syncAutoDays", { days: minutes / 1440 });
7176
+ return t("config.syncAutoHours", { hours: minutes / 60 });
7177
+ }
7178
+ /** A time as a short local stamp: the time alone today, the date beside it otherwise. */
7179
+ function when(value, now = /* @__PURE__ */ new Date()) {
7180
+ if (value === void 0) return "";
7181
+ const at = new Date(value);
7182
+ if (Number.isNaN(at.getTime())) return value;
7183
+ return at.getFullYear() === now.getFullYear() && at.getMonth() === now.getMonth() && at.getDate() === now.getDate() ? at.toLocaleTimeString(void 0, {
7184
+ hour: "2-digit",
7185
+ minute: "2-digit"
7186
+ }) : at.toLocaleString(void 0, {
7187
+ year: "numeric",
7188
+ month: "short",
7189
+ day: "numeric",
7190
+ hour: "2-digit",
7191
+ minute: "2-digit"
7192
+ });
7193
+ }
7194
+ /** Why a remote could not be read, said for the transport the repository uses. */
7195
+ function issueText(t, issue, url, error) {
7196
+ const transport = transportOf(url);
7197
+ switch (issue) {
7198
+ case "auth":
7199
+ if (transport === "https") return onGitHub(url) ? t("config.syncIssueAuthHttps") : t("config.syncIssueAuthToken");
7200
+ return transport === "ssh" ? t("config.syncIssueAuthSsh") : t("config.syncIssueAuth");
7201
+ case "not-found": return onGitHub(url) ? t("config.syncIssueNotFoundGitHub") : t("config.syncIssueNotFound");
7202
+ case "network": return t("config.syncIssueNetwork");
7203
+ case "timeout": return t("config.syncIssueTimeout");
7204
+ default: return t("config.syncIssueUnknown", { error: error ?? "" });
7205
+ }
7206
+ }
7207
+ const REMOTE_ISSUE = {
7208
+ "remote-auth": "auth",
7209
+ "remote-not-found": "not-found",
7210
+ "remote-network": "network",
7211
+ "remote-timeout": "timeout"
7212
+ };
7213
+ /** A failure the Host named, in this page's language; anything it could not name keeps its own words. */
7214
+ function failureText(t, reason, message, url) {
7215
+ const issue = reason === void 0 ? void 0 : REMOTE_ISSUE[reason];
7216
+ if (issue !== void 0) return issueText(t, issue, url, message);
7217
+ switch (reason) {
7218
+ case "busy": return t("config.syncReasonBusy");
7219
+ case "no-repository": return t("config.syncReasonNoRepository");
7220
+ case "git-missing": return t("config.syncReasonGitMissing");
7221
+ case "remote-empty": return t("config.syncReasonRemoteEmpty");
7222
+ case "push-rejected": return t("config.syncReasonRejected");
7223
+ case "github-unauthorized": return t("config.syncGitHubExpiredGrant");
7224
+ default: return message;
7225
+ }
7226
+ }
7227
+ /** The reason a thrown failure carries, when the Host named one. */
7228
+ function reasonOf(error) {
7229
+ const reason = error instanceof Error ? error.reason : void 0;
7230
+ return typeof reason === "string" ? reason : void 0;
7231
+ }
7232
+ /** How a connected repository is authenticated, said as briefly as the state line allows. */
7233
+ function credentialText(t, status) {
7234
+ const transport = transportOf(status.config.repoUrl ?? "");
7235
+ if (transport === "ssh") return t("config.syncViaSsh");
7236
+ if (transport === "local") return void 0;
7237
+ switch (status.config.credentialSource) {
7238
+ case "github": return status.config.credentialLogin === void 0 ? t("config.syncViaGitHubAnonymous") : t("config.syncViaGitHub", { login: status.config.credentialLogin });
7239
+ case "environment": return t("config.syncViaEnvironment", { env: MNEMON_SYNC_TOKEN_ENV });
7240
+ case "token": return t("config.syncViaToken");
7241
+ default: return;
7242
+ }
6974
7243
  }
6975
- function draftOf(config) {
6976
- return {
6977
- repoUrl: config?.repoUrl ?? "",
6978
- branch: config?.branch ?? "mnemon-sync",
6979
- subdir: config?.subdir ?? "mnemon/",
6980
- token: "",
6981
- clearToken: false,
6982
- authorName: config?.authorName ?? "",
6983
- authorEmail: config?.authorEmail ?? "",
6984
- autoBackupMinutes: config?.autoBackupMinutes ?? 0
6985
- };
7244
+ //#endregion
7245
+ //#region src/client/MnemonSyncDialogs.tsx
7246
+ /** How many backups one page of the branch history holds. */
7247
+ const HISTORY_PAGE = 20;
7248
+ /** How many conflicting pairs the comparison lists before it only counts them. */
7249
+ const SHOWN_CONFLICTS = 5;
7250
+ /** One component's item count as a reader reads it. */
7251
+ function componentCount(t, component, count) {
7252
+ if (component === "runtime") return t("config.syncCountRuntime", { count });
7253
+ if (component === "documents") return t("config.syncCountDocuments", { count });
7254
+ return t("config.syncCountSpaces", { count });
7255
+ }
7256
+ function componentName(t, component) {
7257
+ if (component === "runtime") return t("config.syncComponentRuntime");
7258
+ if (component === "documents") return t("config.syncComponentDocuments");
7259
+ return t("config.syncComponentSpaces");
7260
+ }
7261
+ function clip(value, max) {
7262
+ const text = value.replace(/\s+/gu, " ").trim();
7263
+ return text.length <= max ? text : text.slice(0, max - 1) + "…";
6986
7264
  }
6987
- /** A repository is the one thing a save cannot invent, so it gates the save button. */
6988
- function configured(draft) {
6989
- return draft.repoUrl.trim() !== "";
7265
+ /** The commit message a sync writes on its own, which says nothing a backup's time does not. */
7266
+ const AUTOMATIC_MESSAGE = /^Mnemon sync \d{4}-\d{2}-\d{2}T[\d:.]+Z$/u;
7267
+ function summaryLine(t, summary) {
7268
+ return summary.map((entry) => componentCount(t, entry.component, entry.items)).join(" · ");
6990
7269
  }
6991
7270
  /**
6992
- * What a merge actually did. The Host states it as counts, because "added the branch's
6993
- * memories" is false when this machine's own deletions kept every one of them out, and a
6994
- * reader who is told the wrong thing will not look for the button that overrules them.
7271
+ * The versions the repository holds, newest first: when each was synced, from
7272
+ * which computer, and what it held. A page is read at a time; the commit is a
7273
+ * quiet tag, because the time and the computer are what a reader looks for.
6995
7274
  */
6996
- function addedNotice(t, result) {
6997
- const report = result.runtime;
6998
- const commit = result.commit.slice(0, 8);
6999
- const root = result.targetRoot;
7000
- if (report !== void 0 && report.added === 0 && report.held > 0) return t("config.syncDiffAddHeld", { count: report.held });
7001
- const parts = [t("config.syncDiffAdded", {
7002
- commit,
7003
- root
7004
- })];
7005
- if (report !== void 0 && report.held > 0) parts.push(t("config.syncDiffAddHeld", { count: report.held }));
7006
- return parts.join(" ");
7275
+ function SyncHistoryDialog({ client, repoUrl, t, onClose }) {
7276
+ const [history, setHistory] = (0, react.useState)(null);
7277
+ const [busy, setBusy] = (0, react.useState)(true);
7278
+ const [failed, setFailed] = (0, react.useState)(null);
7279
+ const [capped, setCapped] = (0, react.useState)(false);
7280
+ const load = (0, react.useCallback)(async (limit) => {
7281
+ setBusy(true);
7282
+ setFailed(null);
7283
+ try {
7284
+ const page = await client.syncBackups(limit);
7285
+ setHistory((current) => {
7286
+ if (current === null || limit === void 0) return page;
7287
+ const fresh = page.commits.filter((commit) => !current.commits.some((held) => held.commit === commit.commit));
7288
+ if (fresh.length === 0) setCapped(true);
7289
+ return {
7290
+ ...page,
7291
+ commits: [...current.commits, ...fresh]
7292
+ };
7293
+ });
7294
+ } catch (reason) {
7295
+ setFailed(failureText(t, reasonOf(reason), message(reason), repoUrl));
7296
+ } finally {
7297
+ setBusy(false);
7298
+ }
7299
+ }, [
7300
+ client,
7301
+ repoUrl,
7302
+ t
7303
+ ]);
7304
+ (0, react.useEffect)(() => {
7305
+ load();
7306
+ }, [load]);
7307
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MnemonDialog, {
7308
+ title: t("config.syncHistory"),
7309
+ description: t("config.syncHistoryHint"),
7310
+ closeLabel: t("common.close"),
7311
+ wide: true,
7312
+ busy,
7313
+ contentReady: history !== null || failed !== null,
7314
+ onClose,
7315
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7316
+ className: MnemonSettingsCard_module_css_default.syncDialogBody,
7317
+ children: [
7318
+ history === null && failed === null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7319
+ className: MnemonSettingsCard_module_css_default.syncDialogNote,
7320
+ role: "status",
7321
+ children: t("config.syncHistoryLoading")
7322
+ }),
7323
+ failed !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7324
+ className: MnemonSettingsCard_module_css_default.error,
7325
+ role: "alert",
7326
+ children: failed
7327
+ }),
7328
+ history !== null && history.commits.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7329
+ className: MnemonSettingsCard_module_css_default.syncDialogNote,
7330
+ children: t("config.syncHistoryEmpty")
7331
+ }),
7332
+ history !== null && history.commits.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ol", {
7333
+ className: MnemonSettingsCard_module_css_default.syncHistoryList,
7334
+ children: history.commits.map((commit) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
7335
+ className: MnemonSettingsCard_module_css_default.syncHistoryEntry,
7336
+ children: [
7337
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7338
+ className: MnemonSettingsCard_module_css_default.syncHistoryHead,
7339
+ children: [
7340
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: when(commit.pushedAt ?? commit.committedAt) }),
7341
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("config.syncHistoryFrom", { machine: commit.machine === void 0 ? t("config.syncHistoryUnknownMachine") : commit.machine.label.trim() || commit.machine.id }) }),
7342
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tag, {
7343
+ tone: "quiet",
7344
+ children: commit.commit.slice(0, 8)
7345
+ })
7346
+ ]
7347
+ }),
7348
+ commit.components.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: summaryLine(t, commit.components) }),
7349
+ !AUTOMATIC_MESSAGE.test(commit.message) && commit.message.trim() !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
7350
+ className: MnemonSettingsCard_module_css_default.syncHistoryMessage,
7351
+ children: commit.message
7352
+ })
7353
+ ]
7354
+ }, commit.commit))
7355
+ }),
7356
+ capped && history !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7357
+ className: MnemonSettingsCard_module_css_default.syncDialogNote,
7358
+ children: t("config.syncHistoryCapped", { count: history.commits.length })
7359
+ }),
7360
+ history?.truncated === true && !capped && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7361
+ className: MnemonSettingsCard_module_css_default.rowActions,
7362
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7363
+ variant: "outline",
7364
+ size: "sm",
7365
+ disabled: busy,
7366
+ onClick: () => void load(history.commits.length + HISTORY_PAGE),
7367
+ children: busy ? t("config.syncHistoryLoading") : t("config.syncHistoryMore")
7368
+ })
7369
+ })
7370
+ ]
7371
+ })
7372
+ });
7007
7373
  }
7008
- function stamp(value) {
7009
- if (value === void 0) return "";
7010
- const parsed = new Date(value);
7011
- return Number.isNaN(parsed.getTime()) ? value : parsed.toLocaleString();
7374
+ /**
7375
+ * What a sync would do, read before running it: per component whether the two
7376
+ * sides differ, and for runtime memory which entries are only on one side, which
7377
+ * subjects both wrote differently, which the branch holds that this computer
7378
+ * deleted, and which removals the branch recorded. Reading writes nothing; the
7379
+ * footer offers the sync itself and a merge that publishes nothing.
7380
+ */
7381
+ function SyncCompareDialog({ client, repoUrl, writable, t, onClose, onSync, onChanged }) {
7382
+ const [preview, setPreview] = (0, react.useState)(null);
7383
+ const [difference, setDifference] = (0, react.useState)(null);
7384
+ const [busy, setBusy] = (0, react.useState)("read");
7385
+ const [failed, setFailed] = (0, react.useState)(null);
7386
+ const [empty, setEmpty] = (0, react.useState)(false);
7387
+ const [notice, setNotice] = (0, react.useState)(null);
7388
+ const [showConflicts, setShowConflicts] = (0, react.useState)(false);
7389
+ const read = (0, react.useCallback)(async () => {
7390
+ setBusy("read");
7391
+ setFailed(null);
7392
+ setEmpty(false);
7393
+ try {
7394
+ const nextPreview = await client.previewSync();
7395
+ const nextDifference = await client.syncDiff();
7396
+ setPreview(nextPreview);
7397
+ setDifference(nextDifference);
7398
+ } catch (reason) {
7399
+ setPreview(null);
7400
+ setDifference(null);
7401
+ setEmpty(reasonOf(reason) === "remote-empty");
7402
+ setFailed(failureText(t, reasonOf(reason), message(reason), repoUrl));
7403
+ } finally {
7404
+ setBusy(null);
7405
+ }
7406
+ }, [
7407
+ client,
7408
+ repoUrl,
7409
+ t
7410
+ ]);
7411
+ (0, react.useEffect)(() => {
7412
+ read();
7413
+ }, [read]);
7414
+ const merge = async (revive) => {
7415
+ if (busy !== null) return;
7416
+ setBusy(revive ? "revive" : "merge");
7417
+ setFailed(null);
7418
+ setNotice(null);
7419
+ let failure = null;
7420
+ try {
7421
+ const result = await client.pullSync(void 0, revive);
7422
+ const added = result.runtime?.added ?? 0;
7423
+ setNotice(revive ? t("config.syncCompareRevived", { count: added }) : added > 0 ? t("config.syncMergedCount", { count: added }) : t("config.syncMerged", { commit: result.commit.slice(0, 8) }));
7424
+ } catch (reason) {
7425
+ failure = failureText(t, reasonOf(reason), message(reason), repoUrl);
7426
+ } finally {
7427
+ setBusy(null);
7428
+ }
7429
+ onChanged();
7430
+ await read();
7431
+ if (failure !== null) setFailed(failure);
7432
+ };
7433
+ const sync = async () => {
7434
+ if (busy !== null) return;
7435
+ setBusy("sync");
7436
+ setFailed(null);
7437
+ setNotice(null);
7438
+ const failure = await onSync();
7439
+ setBusy(null);
7440
+ if (failure === null) {
7441
+ onClose();
7442
+ return;
7443
+ }
7444
+ await read();
7445
+ setFailed(failure);
7446
+ };
7447
+ const goToReview = () => {
7448
+ onClose();
7449
+ const heading = document.getElementById("mnemon-review-heading");
7450
+ if (heading !== null && typeof heading.scrollIntoView === "function") heading.scrollIntoView({
7451
+ block: "start",
7452
+ behavior: "smooth"
7453
+ });
7454
+ };
7455
+ const conflicts = difference?.conflicts ?? [];
7456
+ const conflicted = new Set(conflicts.flatMap((conflict) => [conflict.target + "\0" + conflict.local.content, conflict.target + "\0" + conflict.remote.content]));
7457
+ const heldBack = difference?.heldBack ?? 0;
7458
+ const removals = difference?.remoteTombstones.length ?? 0;
7459
+ const remoteOnly = difference === null ? 0 : Math.max(difference.remoteOnly.filter((entry) => !conflicted.has(entry.target + "\0" + entry.content)).length - heldBack, 0);
7460
+ const localOnly = difference === null ? 0 : Math.max(difference.localOnly.filter((entry) => !conflicted.has(entry.target + "\0" + entry.content)).length - removals, 0);
7461
+ const differs = (component) => preview?.components.find((entry) => entry.component === component)?.changed === true;
7462
+ const runtimeDiffers = remoteOnly + localOnly + conflicts.length > 0;
7463
+ const anything = runtimeDiffers || removals + heldBack > 0 || differs("documents") || differs("memory-spaces");
7464
+ const mergeable = remoteOnly + conflicts.length + removals > 0 || differs("documents") || differs("memory-spaces");
7465
+ const ready = preview !== null && difference !== null;
7466
+ const machine = difference?.remote.machine === void 0 ? t("config.syncHistoryUnknownMachine") : difference.remote.machine.label.trim() || difference.remote.machine.id;
7467
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MnemonDialog, {
7468
+ title: t("config.syncCompareTitle"),
7469
+ closeLabel: t("common.close"),
7470
+ wide: true,
7471
+ busy: busy !== null && busy !== "read",
7472
+ contentReady: ready || failed !== null,
7473
+ onClose,
7474
+ footer: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7475
+ variant: "outline",
7476
+ size: "sm",
7477
+ disabled: busy !== null || !writable || !ready || !mergeable,
7478
+ onClick: () => void merge(false),
7479
+ children: busy === "merge" ? t("config.syncMerging") : t("config.syncMergeOnly")
7480
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7481
+ variant: "primary",
7482
+ size: "sm",
7483
+ disabled: busy !== null || !writable || !(ready || empty),
7484
+ onClick: () => void sync(),
7485
+ children: busy === "sync" ? t("config.syncNowRunning") : t("config.syncNow")
7486
+ })] }),
7487
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7488
+ className: MnemonSettingsCard_module_css_default.syncDialogBody,
7489
+ children: [
7490
+ busy === "read" && !ready && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7491
+ className: MnemonSettingsCard_module_css_default.syncDialogNote,
7492
+ role: "status",
7493
+ children: t("config.syncCompareLoading")
7494
+ }),
7495
+ failed !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7496
+ className: MnemonSettingsCard_module_css_default.error,
7497
+ role: "alert",
7498
+ children: failed
7499
+ }),
7500
+ notice !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7501
+ className: MnemonSettingsCard_module_css_default.syncSuccess,
7502
+ role: "status",
7503
+ children: notice
7504
+ }),
7505
+ ready && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
7506
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7507
+ className: MnemonSettingsCard_module_css_default.syncDialogNote,
7508
+ children: t("config.syncCompareRemote", {
7509
+ machine,
7510
+ time: when(difference.pushedAt ?? preview.pushedAt)
7511
+ })
7512
+ }),
7513
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", {
7514
+ className: MnemonSettingsCard_module_css_default.syncCompareList,
7515
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: componentName(t, "runtime") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
7516
+ "data-differs": runtimeDiffers || void 0,
7517
+ children: runtimeDiffers ? [t("config.syncCompareRuntime", {
7518
+ remote: remoteOnly,
7519
+ local: localOnly
7520
+ }), ...conflicts.length > 0 ? [t("config.syncCompareConflicts", { count: conflicts.length })] : []].join(" · ") : t("config.syncCompareSame")
7521
+ })] }), ["documents", "memory-spaces"].map((component) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: componentName(t, component) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
7522
+ "data-differs": differs(component) || void 0,
7523
+ children: differs(component) ? t("config.syncCompareDiffers") : t("config.syncCompareSame")
7524
+ })] }, component))]
7525
+ }),
7526
+ !anything && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7527
+ className: MnemonSettingsCard_module_css_default.syncDialogNote,
7528
+ children: t("config.syncCompareAllSame")
7529
+ }),
7530
+ difference.truncated && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7531
+ className: MnemonSettingsCard_module_css_default.syncDialogNote,
7532
+ children: t("config.syncCompareTruncated")
7533
+ }),
7534
+ removals > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7535
+ className: MnemonSettingsCard_module_css_default.syncDialogNote,
7536
+ children: t("config.syncCompareRemovals", { count: removals })
7537
+ }),
7538
+ conflicts.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7539
+ className: MnemonSettingsCard_module_css_default.syncCompareNote,
7540
+ children: [
7541
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7542
+ className: MnemonSettingsCard_module_css_default.syncDialogNote,
7543
+ children: t("config.syncCompareConflictNote", { count: conflicts.length })
7544
+ }),
7545
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7546
+ className: MnemonSettingsCard_module_css_default.rowActions,
7547
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7548
+ variant: "ghost",
7549
+ size: "sm",
7550
+ "aria-expanded": showConflicts,
7551
+ onClick: () => setShowConflicts((value) => !value),
7552
+ children: showConflicts ? t("review.collapse") : t("config.syncCompareShowConflicts")
7553
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7554
+ variant: "ghost",
7555
+ size: "sm",
7556
+ onClick: goToReview,
7557
+ children: t("config.syncCompareGoReview")
7558
+ })]
7559
+ }),
7560
+ showConflicts && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
7561
+ className: MnemonSettingsCard_module_css_default.syncConflictList,
7562
+ children: conflicts.slice(0, SHOWN_CONFLICTS).map((conflict) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
7563
+ className: MnemonSettingsCard_module_css_default.syncConflict,
7564
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncDiffHere") }), clip(conflict.local.content, 240)] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncDiffThere") }), clip(conflict.remote.content, 240)] })]
7565
+ }, conflict.target + "\0" + conflict.local.content))
7566
+ })
7567
+ ]
7568
+ }),
7569
+ heldBack > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7570
+ className: MnemonSettingsCard_module_css_default.syncCompareNote,
7571
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7572
+ className: MnemonSettingsCard_module_css_default.syncDialogNote,
7573
+ children: t("config.syncCompareHeldBack", { count: heldBack })
7574
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7575
+ className: MnemonSettingsCard_module_css_default.rowActions,
7576
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7577
+ variant: "ghost",
7578
+ size: "sm",
7579
+ disabled: busy !== null || !writable,
7580
+ onClick: () => void merge(true),
7581
+ children: busy === "revive" ? t("config.syncCompareReviving") : t("config.syncCompareRevive")
7582
+ })
7583
+ })]
7584
+ })
7585
+ ] })
7586
+ ]
7587
+ })
7588
+ });
7012
7589
  }
7013
- /** The name a backup or a difference is attributed to, as a reader can act on it. */
7014
- function ownerName(t, machine) {
7015
- if (machine === void 0) return t("config.syncBackupUnknownMachine");
7016
- return machine.label.trim() === "" ? machine.id : machine.label;
7590
+ /** A short question before an action whose consequence is easy to miss. */
7591
+ function SyncConfirmDialog(props) {
7592
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MnemonDialog, {
7593
+ title: props.title,
7594
+ closeLabel: props.t("common.close"),
7595
+ busy: props.busy === true,
7596
+ onClose: props.onClose,
7597
+ footer: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7598
+ variant: "outline",
7599
+ size: "sm",
7600
+ disabled: props.busy === true,
7601
+ onClick: props.onClose,
7602
+ children: props.t("common.cancel")
7603
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7604
+ variant: "primary",
7605
+ size: "sm",
7606
+ disabled: props.busy === true,
7607
+ onClick: props.onConfirm,
7608
+ children: props.confirm
7609
+ })] }),
7610
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7611
+ className: MnemonSettingsCard_module_css_default.syncDialogBody,
7612
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7613
+ className: MnemonSettingsCard_module_css_default.syncDialogNote,
7614
+ children: props.body
7615
+ }), props.error !== void 0 && props.error !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7616
+ className: MnemonSettingsCard_module_css_default.error,
7617
+ role: "alert",
7618
+ children: props.error
7619
+ })]
7620
+ })
7621
+ });
7017
7622
  }
7018
- /** One line of text as a reader scans it: whitespace collapsed, then cut to a readable length. */
7019
- function clip(value, max) {
7020
- const text = value.replace(/\s+/gu, " ").trim();
7021
- return text.length <= max ? text : text.slice(0, max - 1) + "…";
7623
+ //#endregion
7624
+ //#region src/client/MnemonSyncSection.tsx
7625
+ /** How long the row waits for the Host to report the switch it just saved. */
7626
+ const STATUS_SETTLE_MS = 250;
7627
+ const STATUS_SETTLE_ATTEMPTS = 20;
7628
+ /** How many repositories the picker lists before it asks for a narrower search. */
7629
+ const SHOWN_REPOSITORIES = 50;
7630
+ /** What an action just did, said beside the row that ran it. */
7631
+ function FeedbackLine({ value }) {
7632
+ if (value === null) return null;
7633
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7634
+ className: [MnemonSettingsCard_module_css_default.syncFeedbackLine, value.tone === "error" ? MnemonSettingsCard_module_css_default.error : MnemonSettingsCard_module_css_default.syncSuccess].join(" "),
7635
+ role: value.tone === "error" ? "alert" : "status",
7636
+ children: value.text
7637
+ });
7022
7638
  }
7023
7639
  /**
7024
- * Git repository sync: the repository this root publishes its Mnemon Pack to,
7025
- * the credential that authenticates the push, and the two operations that move
7026
- * the payload. The form reads the Host's status first, so a repository the Host
7027
- * cannot reach, a missing Git, or a read-only Host is visible before anything
7028
- * runs.
7640
+ * Git repository sync, in the order a person sets it up: connect a repository,
7641
+ * sync, choose how often it syncs on its own, look back at what it kept, and
7642
+ * only then the advanced choices of branch, directory and commit author.
7029
7643
  *
7030
- * The credential is optional: signing in to GitHub stores a grant the Host reads
7031
- * per operation, and the repository then comes from the account instead of being
7032
- * typed. The access token field stays as the fallback for every other host.
7644
+ * The switch is the whole gate: switched off, this is one row that asks the Host
7645
+ * nothing — no status, no repository, no Git.
7033
7646
  *
7034
- * The switch is the whole gate: switched off, this section is one row that asks
7035
- * the Host nothing — no status, no repository, no Git — and switching it on is
7036
- * what unfolds the form, the operations and the branch history.
7647
+ * A sync merges the repository's memory into this computer and then publishes
7648
+ * the result, so it is the one primary action. "Check remote" reads what a sync
7649
+ * would change and writes nothing until a button in it is pressed.
7037
7650
  */
7038
- /** How long the row waits for the Host to report the switch it just saved. */
7039
- const STATUS_SETTLE_MS = 250;
7040
- const STATUS_SETTLE_ATTEMPTS = 20;
7041
- function MnemonSyncSection({ connection, sessionId, workspaceId, disabled, enabled, onEnabled, t }) {
7651
+ function MnemonSyncSection({ connection, sessionId, workspaceId, disabled, enabled, onEnabled, onMerged, t }) {
7042
7652
  const client = (0, react.useMemo)(() => connection === void 0 ? null : new MnemonClient(connection, sessionId, workspaceId), [
7043
7653
  connection,
7044
7654
  sessionId,
@@ -7046,38 +7656,38 @@ window.__ModuleLoader__.load({
7046
7656
  ]);
7047
7657
  const [status, setStatus] = (0, react.useState)(null);
7048
7658
  const [loaded, setLoaded] = (0, react.useState)(false);
7049
- const [draft, setDraft] = (0, react.useState)(() => draftOf(void 0));
7050
- const [pending, setPending] = (0, react.useState)(null);
7051
- const [busy, setBusy] = (0, react.useState)(null);
7052
- const [failed, setFailed] = (0, react.useState)(null);
7053
- const [notice, setNotice] = (0, react.useState)(null);
7659
+ const [loadFailed, setLoadFailed] = (0, react.useState)(null);
7660
+ const [checking, setChecking] = (0, react.useState)(false);
7054
7661
  const [github, setGithub] = (0, react.useState)(null);
7055
- const [githubFailed, setGithubFailed] = (0, react.useState)(null);
7056
- const [repositories, setRepositories] = (0, react.useState)(null);
7057
- const [repositoryName, setRepositoryName] = (0, react.useState)("");
7058
- const [repositoryPrivate, setRepositoryPrivate] = (0, react.useState)(true);
7059
- const [backups, setBackups] = (0, react.useState)(null);
7060
- const [openCommit, setOpenCommit] = (0, react.useState)(null);
7061
- const [difference, setDifference] = (0, react.useState)(null);
7062
- const [dialog, setDialog] = (0, react.useState)(false);
7063
- const [copied, setCopied] = (0, react.useState)(false);
7064
- const [autoBackupSaving, setAutoBackupSaving] = (0, react.useState)(false);
7065
- const [pollTick, setPollTick] = (0, react.useState)(0);
7066
- const [pollMs, setPollMs] = (0, react.useState)(5e3);
7067
- const askedRepositories = (0, react.useRef)(false);
7068
- const refresh = (0, react.useCallback)(async () => {
7069
- if (client === null || !enabled) return;
7662
+ const [editing, setEditing] = (0, react.useState)(false);
7663
+ const [busy, setBusy] = (0, react.useState)(null);
7664
+ const [syncFeedback, setSyncFeedback] = (0, react.useState)(null);
7665
+ const [repositoryFeedback, setRepositoryFeedback] = (0, react.useState)(null);
7666
+ const [autoFeedback, setAutoFeedback] = (0, react.useState)(null);
7667
+ const [dialog, setDialog] = (0, react.useState)(null);
7668
+ const [disconnectFailed, setDisconnectFailed] = (0, react.useState)(null);
7669
+ const [editMode, setEditMode] = (0, react.useState)(void 0);
7670
+ const readStatus = (0, react.useCallback)(async () => {
7671
+ if (client === null) return;
7672
+ setChecking(true);
7070
7673
  try {
7071
7674
  setStatus(await client.syncStatus());
7675
+ setLoadFailed(null);
7072
7676
  } catch (reason) {
7073
- setFailed(message(reason));
7677
+ setLoadFailed(message(reason));
7074
7678
  } finally {
7679
+ setChecking(false);
7075
7680
  setLoaded(true);
7076
7681
  }
7682
+ }, [client]);
7683
+ const readGitHub = (0, react.useCallback)(async () => {
7684
+ if (client === null) return;
7077
7685
  try {
7078
7686
  setGithub(await client.githubStatus());
7079
- } catch {}
7080
- }, [client, enabled]);
7687
+ } catch {
7688
+ setGithub(null);
7689
+ }
7690
+ }, [client]);
7081
7691
  (0, react.useEffect)(() => {
7082
7692
  if (client === null) {
7083
7693
  setLoaded(true);
@@ -7096,11 +7706,12 @@ window.__ModuleLoader__.load({
7096
7706
  })().then((next) => {
7097
7707
  if (active) {
7098
7708
  setStatus(next);
7709
+ setLoadFailed(null);
7099
7710
  setLoaded(true);
7100
7711
  }
7101
7712
  }, (reason) => {
7102
7713
  if (active) {
7103
- setFailed(message(reason));
7714
+ setLoadFailed(message(reason));
7104
7715
  setLoaded(true);
7105
7716
  }
7106
7717
  });
@@ -7113,377 +7724,625 @@ window.__ModuleLoader__.load({
7113
7724
  active = false;
7114
7725
  };
7115
7726
  }, [client, enabled]);
7116
- const saved = status?.config;
7117
- (0, react.useEffect)(() => {
7118
- setDraft(draftOf(saved));
7119
- }, [
7120
- saved?.repoUrl,
7121
- saved?.branch,
7122
- saved?.subdir,
7123
- saved?.authorName,
7124
- saved?.authorEmail,
7125
- saved?.hasToken,
7126
- saved?.autoBackupMinutes
7127
- ]);
7128
- const save = async () => {
7129
- if (client === null || busy !== null) return;
7130
- setBusy("save");
7131
- setFailed(null);
7132
- setNotice(null);
7727
+ const repoUrl = status?.config.repoUrl;
7728
+ const connected = status !== null && status.enabled !== false && repoUrl !== void 0;
7729
+ const editable = !disabled && client !== null;
7730
+ const gitReady = status?.git.available === true;
7731
+ /**
7732
+ * The one primary action: merge the repository here, then publish the result.
7733
+ * Answers why it did not finish, or null when it did, for a caller that shows it elsewhere.
7734
+ */
7735
+ const sync = async () => {
7736
+ if (client === null || busy !== null || repoUrl === void 0) return null;
7737
+ setBusy("sync");
7738
+ setSyncFeedback(null);
7739
+ let failure = null;
7133
7740
  try {
7134
- const patch = {
7135
- branch: draft.branch,
7136
- subdir: draft.subdir,
7137
- authorName: draft.authorName,
7138
- authorEmail: draft.authorEmail,
7139
- autoBackupMinutes: draft.autoBackupMinutes,
7140
- repoUrl: draft.repoUrl.trim() === "" ? null : draft.repoUrl.trim()
7141
- };
7142
- if (draft.clearToken) patch.token = null;
7143
- else if (draft.token.trim() !== "") patch.token = draft.token.trim();
7144
- await client.configureSync(patch);
7145
- setNotice(t("config.syncSaved"));
7146
- setDraft((current) => ({
7147
- ...current,
7148
- token: "",
7149
- clearToken: false
7150
- }));
7151
- await refresh();
7741
+ const feedback = syncResult(t, await client.pushSync(), repoUrl);
7742
+ setSyncFeedback(feedback);
7743
+ if (feedback.tone === "error") failure = feedback.text;
7152
7744
  } catch (reason) {
7153
- setFailed(message(reason));
7745
+ failure = t("config.syncFailed", { error: failureText(t, reasonOf(reason), message(reason), repoUrl) });
7746
+ setSyncFeedback({
7747
+ tone: "error",
7748
+ text: failure
7749
+ });
7154
7750
  } finally {
7155
7751
  setBusy(null);
7156
7752
  }
7753
+ onMerged?.();
7754
+ readStatus();
7755
+ return failure;
7157
7756
  };
7158
- const push = async () => {
7757
+ const setAutoSync = async (minutes) => {
7159
7758
  if (client === null || busy !== null) return;
7160
- setBusy("push");
7161
- setFailed(null);
7162
- setNotice(null);
7163
- setPending(null);
7164
- setBackups(null);
7165
- setDifference(null);
7166
- try {
7167
- const result = await client.pushSync();
7168
- const parts = [result.pushed ? t("config.syncPushed", {
7169
- commit: result.commit.slice(0, 8),
7170
- files: result.files,
7171
- size: humanBytes(result.bytes)
7172
- }) : result.committed ? t("config.syncPushedLocal", {
7173
- commit: result.commit.slice(0, 8),
7174
- reason: result.reason ?? ""
7175
- }) : t("config.syncPushIdle")];
7176
- const compaction = result.compaction;
7177
- if (compaction !== void 0 && compaction.warning === void 0 && compaction.loose > 0) parts.push(t("config.syncCompacted", {
7178
- count: compaction.loose,
7179
- before: humanBytes(compaction.bytes),
7180
- after: humanBytes(compaction.packedBytes)
7181
- }));
7182
- setNotice(parts.join(" "));
7183
- await refresh();
7184
- } catch (reason) {
7185
- setFailed(message(reason));
7186
- } finally {
7187
- setBusy(null);
7188
- }
7189
- };
7190
- /** Turning the automatic backup on, off or to another interval is one saved value. */
7191
- const setAutoBackup = async (minutes) => {
7192
- if (client === null || busy !== null || autoBackupSaving) return;
7193
- setAutoBackupSaving(true);
7194
- setFailed(null);
7195
- setNotice(null);
7759
+ setBusy("auto");
7760
+ setAutoFeedback(null);
7196
7761
  try {
7197
7762
  const next = await client.configureSync({ autoBackupMinutes: minutes });
7198
7763
  setStatus((current) => current === null ? current : {
7199
7764
  ...current,
7200
7765
  config: next
7201
7766
  });
7202
- setNotice(t("config.syncAutoBackupSaved", { interval: intervalLabel(t, minutes) }));
7767
+ readStatus();
7203
7768
  } catch (reason) {
7204
- setFailed(message(reason));
7205
- } finally {
7206
- setAutoBackupSaving(false);
7207
- }
7208
- };
7209
- const preview = async () => {
7210
- if (client === null || busy !== null) return;
7211
- setBusy("preview");
7212
- setFailed(null);
7213
- setNotice(null);
7214
- setPending(null);
7215
- setDifference(null);
7216
- try {
7217
- setPending(await client.previewSync());
7218
- try {
7219
- setDifference(await client.syncDiff());
7220
- setDialog(true);
7221
- } catch {
7222
- setDifference(null);
7223
- }
7224
- } catch (reason) {
7225
- setFailed(message(reason));
7226
- } finally {
7227
- setBusy(null);
7228
- }
7229
- };
7230
- const pull = async () => {
7231
- if (client === null || pending === null || busy !== null) return;
7232
- setBusy("pull");
7233
- setFailed(null);
7234
- setNotice(null);
7235
- try {
7236
- const result = await client.pullSync();
7237
- setNotice(t("config.syncPulled", {
7238
- commit: result.commit.slice(0, 8),
7239
- root: result.targetRoot
7240
- }));
7241
- setPending(null);
7242
- setBackups(null);
7243
- setDifference(null);
7244
- await refresh();
7245
- } catch (reason) {
7246
- setFailed(message(reason));
7769
+ setAutoFeedback({
7770
+ tone: "error",
7771
+ text: message(reason)
7772
+ });
7247
7773
  } finally {
7248
7774
  setBusy(null);
7249
7775
  }
7250
7776
  };
7251
- /**
7252
- * The branch as one reading: the history of what was published, when, and by which
7253
- * installation, and - below it - which memories differ. The commit message is whatever
7254
- * its author typed, so the manifest inside the commit is what names the machine and
7255
- * says what the backup held.
7256
- *
7257
- * A difference that cannot be read still leaves the history standing: the two answers
7258
- * are separate requests and either one alone is worth showing.
7259
- */
7260
- const loadHistory = async () => {
7777
+ const disconnect = async () => {
7261
7778
  if (client === null || busy !== null) return;
7262
- setBusy("backups");
7263
- setFailed(null);
7264
- setNotice(null);
7265
- setDialog(true);
7779
+ setBusy("disconnect");
7780
+ setRepositoryFeedback(null);
7781
+ setSyncFeedback(null);
7782
+ setDisconnectFailed(null);
7266
7783
  try {
7267
- setBackups(await client.syncBackups());
7784
+ await client.configureSync({
7785
+ repoUrl: null,
7786
+ token: null,
7787
+ autoBackupMinutes: 0
7788
+ });
7789
+ setDialog(null);
7790
+ setEditing(false);
7791
+ setRepositoryFeedback({
7792
+ tone: "success",
7793
+ text: t("config.syncDisconnected")
7794
+ });
7795
+ readStatus();
7268
7796
  } catch (reason) {
7269
- setFailed(message(reason));
7797
+ setDisconnectFailed(message(reason));
7270
7798
  } finally {
7271
7799
  setBusy(null);
7272
7800
  }
7273
- try {
7274
- setDifference(await client.syncDiff());
7275
- } catch {
7276
- setDifference(null);
7277
- }
7278
7801
  };
7279
7802
  /**
7280
- * Older backups, appended to the page already read. The branch's history is a window
7281
- * that grows one page at a time; a page the branch no longer holds is not read twice,
7282
- * so the list keeps what it already had.
7803
+ * A connection was saved: the editor closes and the repository is read again.
7804
+ * The state line under the repository is the answer, so nothing claims it is
7805
+ * connected before the Host has said whether it answers.
7283
7806
  */
7284
- const loadMore = async () => {
7285
- if (client === null || busy !== null || backups === null) return;
7286
- setBusy("more");
7287
- setFailed(null);
7288
- setNotice(null);
7289
- try {
7290
- const page = await client.syncBackups(backups.commits.length + BACKUP_PAGE);
7291
- setBackups({
7292
- ...page,
7293
- commits: [...backups.commits, ...page.commits.filter((commit) => !backups.commits.some((held) => held.commit === commit.commit))]
7294
- });
7295
- } catch (reason) {
7296
- setFailed(message(reason));
7297
- } finally {
7298
- setBusy(null);
7299
- }
7807
+ const connectedTo = async () => {
7808
+ setEditing(false);
7809
+ setSyncFeedback(null);
7810
+ setRepositoryFeedback(null);
7811
+ await readStatus();
7812
+ };
7813
+ /** The state line's own way out: credentials are changed in the editor that set them. */
7814
+ const fixCredentials = () => {
7815
+ setRepositoryFeedback(null);
7816
+ setEditMode(repoUrl !== void 0 && onGitHub(repoUrl) && github?.available === true ? "github" : "address");
7817
+ setEditing(true);
7300
7818
  };
7301
- /** Which memories are only here and which are only on the branch, before merging anything. */
7302
- const loadDifference = async () => {
7303
- if (client === null || busy !== null) return;
7304
- setBusy("diff");
7305
- setFailed(null);
7306
- setNotice(null);
7307
- setDialog(true);
7308
- try {
7309
- setDifference(await client.syncDiff());
7310
- } catch (reason) {
7311
- setFailed(message(reason));
7312
- } finally {
7313
- setBusy(null);
7314
- }
7819
+ const autoBackup = status?.autoBackup;
7820
+ const minutes = status?.config.autoBackupMinutes ?? 0;
7821
+ const autoOptions = AUTO_SYNC_CHOICES.map((choice) => ({
7822
+ value: String(choice),
7823
+ label: intervalLabel(t, choice)
7824
+ }));
7825
+ const autoHint = autoBackup?.lastError !== void 0 && minutes > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7826
+ className: MnemonSettingsCard_module_css_default.error,
7827
+ children: t("config.syncAutoFailed", { error: failureText(t, autoBackup.lastFailure, autoBackup.lastError, repoUrl ?? "") })
7828
+ }) : minutes <= 0 ? t("config.syncAutoHintOff") : [autoBackup?.nextAt === void 0 ? "" : t("config.syncAutoNext", { time: when(autoBackup.nextAt) }), autoBackup?.lastAt === void 0 ? "" : t("config.syncAutoLast", { time: when(autoBackup.lastAt) })].filter(Boolean).join(" · ") || t("config.syncAutoHintOn");
7829
+ const lastRun = status?.lastRun;
7830
+ const syncHint = lastRun === void 0 ? t("config.syncNever") : lastRun.kind === "merge" ? t("config.syncLastMerge", { time: when(lastRun.at) }) : t("config.syncLast", { time: when(lastRun.at) });
7831
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7832
+ className: MnemonSettingsCard_module_css_default.syncRow,
7833
+ role: "group",
7834
+ "aria-labelledby": "mnemon-sync-heading",
7835
+ children: [
7836
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToggleRow, {
7837
+ id: "mnemon-sync-enabled",
7838
+ titleId: "mnemon-sync-heading",
7839
+ label: t("config.syncTitle"),
7840
+ hint: t("config.syncSimpleDescription"),
7841
+ checked: enabled,
7842
+ disabled,
7843
+ onChange: onEnabled
7844
+ }),
7845
+ enabled && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7846
+ className: MnemonSettingsCard_module_css_default.syncPanel,
7847
+ children: [
7848
+ client === null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7849
+ className: MnemonSettingsCard_module_css_default.readOnly,
7850
+ children: t("config.syncUnavailable")
7851
+ }),
7852
+ client !== null && !loaded && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7853
+ className: MnemonSettingsCard_module_css_default.syncDialogNote,
7854
+ role: "status",
7855
+ children: t("config.syncLoading")
7856
+ }),
7857
+ client !== null && loaded && status === null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7858
+ className: MnemonSettingsCard_module_css_default.error,
7859
+ role: "alert",
7860
+ children: t("config.syncUnavailableReason", { error: loadFailed ?? "" })
7861
+ }),
7862
+ client !== null && loaded && status !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
7863
+ !gitReady && status.enabled !== false && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7864
+ className: MnemonSettingsCard_module_css_default.syncWarning,
7865
+ role: "status",
7866
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("config.syncGitMissing", { required: status.git.required }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7867
+ variant: "ghost",
7868
+ size: "sm",
7869
+ disabled: checking,
7870
+ onClick: () => void readStatus(),
7871
+ children: t("config.syncRecheck")
7872
+ })]
7873
+ }),
7874
+ connected && !editing ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(SettingRow, {
7875
+ title: t("config.syncRepository"),
7876
+ titleId: "mnemon-sync-repository-title",
7877
+ hint: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(RepositoryState, {
7878
+ status,
7879
+ checking,
7880
+ t,
7881
+ onRecheck: () => void readStatus(),
7882
+ onFix: editable ? fixCredentials : void 0
7883
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FeedbackLine, { value: repositoryFeedback })] }),
7884
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7885
+ variant: "outline",
7886
+ size: "sm",
7887
+ disabled: !editable || busy !== null,
7888
+ onClick: () => {
7889
+ setRepositoryFeedback(null);
7890
+ setEditMode(void 0);
7891
+ setEditing(true);
7892
+ },
7893
+ children: t("config.syncChange")
7894
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7895
+ variant: "ghost",
7896
+ size: "sm",
7897
+ disabled: !editable || busy !== null,
7898
+ onClick: () => setDialog("disconnect"),
7899
+ children: t("config.syncDisconnect")
7900
+ })]
7901
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7902
+ className: MnemonSettingsCard_module_css_default.syncConnect,
7903
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(SettingRow, {
7904
+ title: t("config.syncRepository"),
7905
+ titleId: "mnemon-sync-repository-title",
7906
+ hint: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [t("config.syncRepositoryHint"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FeedbackLine, { value: repositoryFeedback })] })
7907
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RepositoryEditor, {
7908
+ client,
7909
+ status,
7910
+ github,
7911
+ disabled: !editable,
7912
+ cancellable: connected,
7913
+ initialMode: editMode,
7914
+ t,
7915
+ onGitHub: setGithub,
7916
+ onReadGitHub: readGitHub,
7917
+ onRefresh: readStatus,
7918
+ onCancel: () => {
7919
+ setEditing(false);
7920
+ readStatus();
7921
+ },
7922
+ onConnected: connectedTo
7923
+ })]
7924
+ }),
7925
+ connected && !editing && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
7926
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(SettingRow, {
7927
+ title: t("config.syncRowTitle"),
7928
+ titleId: "mnemon-sync-now-title",
7929
+ hint: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [syncHint, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FeedbackLine, { value: syncFeedback })] }),
7930
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7931
+ variant: "outline",
7932
+ size: "sm",
7933
+ disabled: !gitReady || busy !== null,
7934
+ onClick: () => {
7935
+ setSyncFeedback(null);
7936
+ setDialog("compare");
7937
+ },
7938
+ children: t("config.syncCheck")
7939
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7940
+ variant: "primary",
7941
+ size: "sm",
7942
+ disabled: !gitReady || !editable || busy !== null,
7943
+ onClick: () => void sync(),
7944
+ children: busy === "sync" ? t("config.syncNowRunning") : t("config.syncNow")
7945
+ })]
7946
+ }),
7947
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SettingRow, {
7948
+ title: t("config.syncAuto"),
7949
+ titleId: "mnemon-sync-auto-title",
7950
+ hint: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [autoHint, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FeedbackLine, { value: autoFeedback })] }),
7951
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SettingSelect, {
7952
+ labelledBy: "mnemon-sync-auto-title",
7953
+ value: String(minutes),
7954
+ options: autoOptions,
7955
+ disabled: !editable || busy !== null,
7956
+ onChange: (value) => void setAutoSync(Number(value))
7957
+ })
7958
+ }),
7959
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SettingRow, {
7960
+ title: t("config.syncHistory"),
7961
+ titleId: "mnemon-sync-history-title",
7962
+ hint: t("config.syncHistoryHint"),
7963
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7964
+ variant: "outline",
7965
+ size: "sm",
7966
+ disabled: !gitReady,
7967
+ onClick: () => setDialog("history"),
7968
+ children: t("config.syncHistoryView")
7969
+ })
7970
+ })
7971
+ ] }),
7972
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AdvancedSettings, {
7973
+ client,
7974
+ status,
7975
+ disabled: !editable,
7976
+ t,
7977
+ onSaved: readStatus
7978
+ })
7979
+ ] })
7980
+ ]
7981
+ }),
7982
+ client !== null && repoUrl !== void 0 && dialog === "compare" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SyncCompareDialog, {
7983
+ client,
7984
+ repoUrl,
7985
+ writable: editable,
7986
+ t,
7987
+ onClose: () => setDialog(null),
7988
+ onSync: sync,
7989
+ onChanged: () => {
7990
+ onMerged?.();
7991
+ readStatus();
7992
+ }
7993
+ }),
7994
+ client !== null && repoUrl !== void 0 && dialog === "history" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SyncHistoryDialog, {
7995
+ client,
7996
+ repoUrl,
7997
+ t,
7998
+ onClose: () => setDialog(null)
7999
+ }),
8000
+ repoUrl !== void 0 && dialog === "disconnect" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SyncConfirmDialog, {
8001
+ title: t("config.syncDisconnectTitle"),
8002
+ body: t("config.syncDisconnectBody", { repository: repositoryName(repoUrl) }),
8003
+ confirm: t("config.syncDisconnect"),
8004
+ busy: busy === "disconnect",
8005
+ error: disconnectFailed,
8006
+ t,
8007
+ onConfirm: () => void disconnect(),
8008
+ onClose: () => {
8009
+ setDialog(null);
8010
+ setDisconnectFailed(null);
8011
+ }
8012
+ })
8013
+ ]
8014
+ });
8015
+ }
8016
+ /** What one finished sync did, said as one line. */
8017
+ function syncResult(t, result, repoUrl) {
8018
+ const added = result.merged?.runtime?.added ?? 0;
8019
+ const commit = result.commit.slice(0, 8);
8020
+ if (result.pushed) return {
8021
+ tone: "success",
8022
+ text: added > 0 ? t("config.syncDoneMerged", {
8023
+ count: added,
8024
+ commit
8025
+ }) : t("config.syncDone", { commit })
7315
8026
  };
7316
- /**
7317
- * The plain case: the branch holds memories this installation does not, and no subject
7318
- * is stated twice. Merging is additive and honors the branch's removals, so there is
7319
- * nothing to decide - the entries are simply added.
7320
- */
7321
- const addRemote = async (revive = false) => {
7322
- if (client === null || busy !== null || difference === null) return;
7323
- setBusy(revive ? "revive" : "add");
7324
- setFailed(null);
7325
- setNotice(null);
7326
- try {
7327
- const result = await client.pullSync(void 0, revive);
7328
- setNotice(addedNotice(t, result));
7329
- setPending(null);
7330
- await refresh();
7331
- try {
7332
- setDifference(await client.syncDiff());
7333
- } catch {
7334
- setDifference(null);
7335
- }
7336
- } catch (reason) {
7337
- setFailed(message(reason));
7338
- } finally {
7339
- setBusy(null);
7340
- }
8027
+ if (!result.committed) return {
8028
+ tone: "success",
8029
+ text: added > 0 ? t("config.syncUpToDateMerged", { count: added }) : t("config.syncUpToDate")
7341
8030
  };
7342
- /**
7343
- * A conflict needs a plan, and the plan is the review ledger's: **整理记忆** below runs
7344
- * the reconciliation, reads the proposal and applies it, so this page never keeps a
7345
- * second copy of it. What this page does is read the branch and say what differs.
7346
- */
7347
- /**
7348
- * The plan is the review ledger's, and the review list below this row is the one place it
7349
- * is read, decided and applied. This closes the dialog and puts the reader on that row,
7350
- * so a conflict found here has one obvious way to be answered.
7351
- */
7352
- const goToReview = () => {
7353
- setDialog(false);
7354
- const heading = document.getElementById("mnemon-review-heading");
7355
- if (heading === null) return;
7356
- if (typeof heading.scrollIntoView === "function") heading.scrollIntoView({
7357
- block: "start",
7358
- behavior: "smooth"
7359
- });
8031
+ return {
8032
+ tone: "error",
8033
+ text: t("config.syncPushFailed", { reason: failureText(t, result.failure, result.reason ?? "", repoUrl) })
8034
+ };
8035
+ }
8036
+ /** Where the repository is, whether it answers, and how it is authenticated. */
8037
+ function RepositoryState({ status, checking, t, onRecheck, onFix }) {
8038
+ const url = status.config.repoUrl ?? "";
8039
+ const remote = status.remote;
8040
+ const credential = credentialText(t, status);
8041
+ const state = checking ? {
8042
+ dot: "ongoing",
8043
+ text: t("config.syncStateChecking")
8044
+ } : !status.git.available ? {
8045
+ dot: "idle",
8046
+ text: t("config.syncReasonGitMissing")
8047
+ } : !remote.reachable ? {
8048
+ dot: "error",
8049
+ text: issueText(t, remote.issue, url, remote.error)
8050
+ } : {
8051
+ dot: credential === void 0 && transportOf(url) === "https" ? "warning" : "done",
8052
+ text: [remote.branchExists ? t("config.syncStateConnected") : t("config.syncStateNewBranch", { branch: status.config.branch }), ...credential !== void 0 ? [credential] : transportOf(url) === "https" ? [onGitHub(url) ? t("config.syncNoCredential") : t("config.syncNoCredentialToken")] : []].join(" · ")
7360
8053
  };
7361
- /** Choosing a repository is the whole configuration step, so it is saved at once. */
7362
- const choose = async (repository) => {
7363
- if (client === null || busy !== null || !editable) return;
7364
- setBusy("save");
7365
- setFailed(null);
7366
- setNotice(null);
8054
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
8055
+ className: MnemonSettingsCard_module_css_default.syncRepositoryState,
8056
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8057
+ className: MnemonSettingsCard_module_css_default.syncRepositoryName,
8058
+ children: transportOf(url) === "local" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.PathLabel, { path: url }) : repositoryName(url)
8059
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
8060
+ className: MnemonSettingsCard_module_css_default.syncStateLine,
8061
+ "data-tone": state.dot,
8062
+ children: [
8063
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: state.dot }),
8064
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: state.text }),
8065
+ !checking && onFix !== void 0 && (remote.issue === "auth" || remote.issue === "not-found") && transportOf(url) === "https" && status.git.available && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
8066
+ type: "button",
8067
+ className: MnemonSettingsCard_module_css_default.syncInlineAction,
8068
+ onClick: onFix,
8069
+ children: t("config.syncFixCredentials")
8070
+ }),
8071
+ !checking && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
8072
+ type: "button",
8073
+ className: MnemonSettingsCard_module_css_default.syncInlineAction,
8074
+ onClick: onRecheck,
8075
+ children: t("config.syncRecheck")
8076
+ })
8077
+ ]
8078
+ })]
8079
+ });
8080
+ }
8081
+ /** Connect a repository: through a GitHub sign-in, or by its address. */
8082
+ function RepositoryEditor(props) {
8083
+ const { status, github, t } = props;
8084
+ const githubOffered = github?.available === true;
8085
+ const saved = status.config.repoUrl;
8086
+ const [mode, setMode] = (0, react.useState)(() => props.initialMode ?? (githubOffered && (saved === void 0 || onGitHub(saved)) ? "github" : "address"));
8087
+ const chosen = (0, react.useRef)(props.initialMode !== void 0);
8088
+ (0, react.useEffect)(() => {
8089
+ if (!chosen.current && githubOffered && saved === void 0) setMode("github");
8090
+ }, [githubOffered, saved]);
8091
+ const name = (0, react.useId)();
8092
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8093
+ className: MnemonSettingsCard_module_css_default.editor,
8094
+ children: [githubOffered && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8095
+ className: MnemonSettingsCard_module_css_default.inlineChoices,
8096
+ role: "radiogroup",
8097
+ "aria-label": t("config.syncConnectWith"),
8098
+ children: ["github", "address"].map((value) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
8099
+ type: "radio",
8100
+ name,
8101
+ value,
8102
+ checked: mode === value,
8103
+ disabled: props.disabled,
8104
+ onChange: () => {
8105
+ chosen.current = true;
8106
+ setMode(value);
8107
+ }
8108
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: value === "github" ? t("config.syncModeGitHub") : t("config.syncModeAddress") })] }, value))
8109
+ }), mode === "github" && githubOffered && github !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(GitHubConnect, {
8110
+ ...props,
8111
+ github
8112
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AddressConnect, { ...props })]
8113
+ });
8114
+ }
8115
+ /** Whether two HTTPS addresses name the same host, the one a saved token was saved for. */
8116
+ function sameHost(left, right) {
8117
+ try {
8118
+ return new URL(left.trim()).host.toLowerCase() === new URL(right.trim()).host.toLowerCase();
8119
+ } catch {
8120
+ return false;
8121
+ }
8122
+ }
8123
+ /** The address form: a repository URL, and a token where the address is HTTPS. */
8124
+ function AddressConnect({ client, status, disabled, cancellable, t, onRefresh, onCancel, onConnected }) {
8125
+ const saved = status.config.repoUrl ?? "";
8126
+ const [url, setUrl] = (0, react.useState)(saved);
8127
+ const [token, setToken] = (0, react.useState)("");
8128
+ const [busy, setBusy] = (0, react.useState)(null);
8129
+ const [feedback, setFeedback] = (0, react.useState)(null);
8130
+ const tokenId = (0, react.useId)();
8131
+ const problem = repositoryProblem(url);
8132
+ const https = transportOf(url) === "https";
8133
+ const environment = status.config.credentialSource === "environment";
8134
+ const storedToken = status.config.credentialSource === "token" && sameHost(url, saved);
8135
+ const changed = url.trim() !== saved || token.trim() !== "";
8136
+ const ready = url.trim() !== "" && problem === void 0 && changed;
8137
+ const connect = async () => {
8138
+ if (!ready || busy !== null) return;
8139
+ setBusy("connect");
8140
+ setFeedback(null);
7367
8141
  try {
7368
- await client.configureSync({ repoUrl: repository.url });
7369
- setNotice(t("config.syncSaved"));
7370
- await refresh();
8142
+ const next = url.trim();
8143
+ await client.configureSync({
8144
+ repoUrl: next,
8145
+ ...https && token.trim() !== "" ? { token: token.trim() } : {},
8146
+ ...https ? {} : { token: null }
8147
+ });
8148
+ setToken("");
8149
+ await onConnected();
7371
8150
  } catch (reason) {
7372
- setFailed(message(reason));
8151
+ setFeedback({
8152
+ tone: "error",
8153
+ text: message(reason)
8154
+ });
7373
8155
  } finally {
7374
8156
  setBusy(null);
7375
8157
  }
7376
8158
  };
7377
- const loadRepositories = (0, react.useCallback)(async () => {
7378
- if (client === null || busy !== null) return;
7379
- setBusy("repos");
7380
- setGithubFailed(null);
8159
+ const removeToken = async () => {
8160
+ if (busy !== null) return;
8161
+ setBusy("token");
8162
+ setFeedback(null);
7381
8163
  try {
7382
- const answer = await client.githubRepositories();
7383
- setRepositories(answer.repositories);
8164
+ await client.configureSync({ token: null });
8165
+ setFeedback({
8166
+ tone: "success",
8167
+ text: t("config.syncTokenRemoved")
8168
+ });
8169
+ onRefresh();
7384
8170
  } catch (reason) {
7385
- setGithubFailed(message(reason));
8171
+ setFeedback({
8172
+ tone: "error",
8173
+ text: message(reason)
8174
+ });
7386
8175
  } finally {
7387
8176
  setBusy(null);
7388
8177
  }
7389
- }, [client, busy]);
7390
- const signIn = async () => {
7391
- if (client === null || busy !== null) return;
7392
- setBusy("github");
7393
- setGithubFailed(null);
7394
- setNotice(null);
8178
+ };
8179
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
8180
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8181
+ className: MnemonSettingsCard_module_css_default.fieldGrid,
8182
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [t("config.syncRepoUrl"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
8183
+ type: "text",
8184
+ value: url,
8185
+ "aria-label": t("config.syncRepoUrl"),
8186
+ placeholder: t("config.syncRepoUrlPlaceholder"),
8187
+ disabled: disabled || busy !== null,
8188
+ "aria-invalid": problem === void 0 ? void 0 : true,
8189
+ autoComplete: "off",
8190
+ spellCheck: false,
8191
+ autoCapitalize: "none",
8192
+ autoCorrect: "off",
8193
+ onChange: (event) => setUrl(event.target.value),
8194
+ onKeyDown: (event) => {
8195
+ if (event.key === "Enter") connect();
8196
+ }
8197
+ })] }), https && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8198
+ className: MnemonSettingsCard_module_css_default.syncFieldBox,
8199
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
8200
+ className: MnemonSettingsCard_module_css_default.syncFieldLabel,
8201
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
8202
+ htmlFor: tokenId,
8203
+ children: t("config.syncToken")
8204
+ }), storedToken && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
8205
+ type: "button",
8206
+ className: MnemonSettingsCard_module_css_default.syncInlineAction,
8207
+ disabled: disabled || busy !== null,
8208
+ onClick: () => void removeToken(),
8209
+ children: t("config.syncTokenRemove")
8210
+ })]
8211
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
8212
+ id: tokenId,
8213
+ type: "password",
8214
+ value: token,
8215
+ "aria-label": t("config.syncToken"),
8216
+ disabled: disabled || busy !== null || environment,
8217
+ placeholder: environment ? t("config.syncTokenEnvironment", { env: "MNEMON_SYNC_GIT_TOKEN" }) : storedToken ? t("config.syncTokenSaved") : t("config.syncTokenOptional"),
8218
+ autoComplete: "new-password",
8219
+ spellCheck: false,
8220
+ onChange: (event) => setToken(event.target.value)
8221
+ })]
8222
+ })]
8223
+ }),
8224
+ problem !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8225
+ className: MnemonSettingsCard_module_css_default.error,
8226
+ children: problem === "credentials" ? t("config.syncRepoUrlCredentials") : t("config.syncRepoUrlInvalid")
8227
+ }),
8228
+ https && problem === void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8229
+ className: MnemonSettingsCard_module_css_default.editorNote,
8230
+ children: t("config.syncTokenHint")
8231
+ }),
8232
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8233
+ className: MnemonSettingsCard_module_css_default.memoryConfigFooter,
8234
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8235
+ className: MnemonSettingsCard_module_css_default.configFeedback,
8236
+ "aria-live": "polite",
8237
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FeedbackLine, { value: feedback })
8238
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [cancellable && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8239
+ variant: "ghost",
8240
+ size: "sm",
8241
+ disabled: busy !== null,
8242
+ onClick: onCancel,
8243
+ children: t("common.cancel")
8244
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8245
+ variant: "primary",
8246
+ size: "sm",
8247
+ disabled: disabled || !ready || busy !== null,
8248
+ onClick: () => void connect(),
8249
+ children: busy === "connect" ? t("config.syncConnecting") : saved === "" ? t("config.syncConnect") : t("config.syncSave")
8250
+ })] })]
8251
+ })
8252
+ ] });
8253
+ }
8254
+ /** Sign in with the GitHub device flow, then pick or create the repository. */
8255
+ function GitHubConnect(props) {
8256
+ const { client, github, disabled, cancellable, t, onGitHub, onReadGitHub, onCancel, onConnected } = props;
8257
+ const [busy, setBusy] = (0, react.useState)(null);
8258
+ const [failed, setFailed] = (0, react.useState)(null);
8259
+ const [copied, setCopied] = (0, react.useState)(false);
8260
+ const [pollTick, setPollTick] = (0, react.useState)(0);
8261
+ const [pollMs, setPollMs] = (0, react.useState)(5e3);
8262
+ const flow = github.flow;
8263
+ const signedIn = github.signedIn;
8264
+ const start = async () => {
8265
+ if (busy !== null) return;
8266
+ setBusy("start");
8267
+ setFailed(null);
8268
+ setCopied(false);
7395
8269
  try {
7396
8270
  const next = await client.githubStart();
7397
- setGithub(next);
8271
+ onGitHub(next);
7398
8272
  setPollMs(next.flow?.intervalMs ?? 5e3);
7399
8273
  setPollTick(0);
7400
8274
  } catch (reason) {
7401
- setGithubFailed(message(reason));
8275
+ setFailed(t("config.syncGitHubFailed", { error: message(reason) }));
7402
8276
  } finally {
7403
8277
  setBusy(null);
7404
8278
  }
7405
8279
  };
7406
- const cancelSignIn = async () => {
7407
- if (client === null || busy !== null) return;
7408
- setBusy("github");
7409
- setGithubFailed(null);
8280
+ const cancel = async () => {
8281
+ if (busy !== null) return;
8282
+ setBusy("cancel");
8283
+ setFailed(null);
7410
8284
  try {
7411
- setGithub(await client.githubCancel());
8285
+ onGitHub(await client.githubCancel());
7412
8286
  } catch (reason) {
7413
- setGithubFailed(message(reason));
8287
+ setFailed(message(reason));
7414
8288
  } finally {
7415
8289
  setBusy(null);
7416
8290
  }
7417
8291
  };
7418
8292
  const signOut = async () => {
7419
- if (client === null || busy !== null) return;
7420
- setBusy("github");
7421
- setGithubFailed(null);
7422
- setNotice(null);
7423
- try {
7424
- setGithub(await client.githubSignOut());
7425
- askedRepositories.current = false;
7426
- setRepositories(null);
7427
- await refresh();
7428
- } catch (reason) {
7429
- setGithubFailed(message(reason));
7430
- } finally {
7431
- setBusy(null);
7432
- }
7433
- };
7434
- const createRepository = async () => {
7435
- if (client === null || busy !== null || repositoryName.trim() === "") return;
7436
- setBusy("create");
8293
+ if (busy !== null) return;
8294
+ setBusy("signout");
7437
8295
  setFailed(null);
7438
- setGithubFailed(null);
7439
- setNotice(null);
7440
8296
  try {
7441
- const created = await client.githubCreateRepository(repositoryName.trim(), repositoryPrivate);
7442
- setNotice(t("config.syncRepositoryCreated", { name: created.fullName }));
7443
- setRepositoryName("");
7444
- askedRepositories.current = false;
7445
- await loadRepositories();
7446
- await choose(created);
8297
+ onGitHub(await client.githubSignOut());
7447
8298
  } catch (reason) {
7448
- setGithubFailed(message(reason));
8299
+ setFailed(message(reason));
7449
8300
  } finally {
7450
8301
  setBusy(null);
7451
8302
  }
7452
8303
  };
7453
- const copyCode = async (code) => {
7454
- try {
7455
- setCopied(await (0, _deepseek_ai_dsh_client_ui_primitives.writeClipboard)(code));
7456
- } catch {
7457
- setCopied(false);
7458
- }
8304
+ /** A grant GitHub stopped honouring is replaced: sign out, then start a new sign-in. */
8305
+ const signInAgain = async () => {
8306
+ await signOut();
8307
+ await start();
8308
+ };
8309
+ /**
8310
+ * One click copies the code and opens the page it is typed into. The copy starts
8311
+ * first, while this page still has focus, and the page opens within the same click,
8312
+ * so neither the clipboard nor a popup blocker refuses it.
8313
+ */
8314
+ const copyAndOpen = async () => {
8315
+ if (flow === void 0) return;
8316
+ const copying = (0, _deepseek_ai_dsh_client_ui_primitives.writeClipboard)(flow.userCode).catch(() => false);
8317
+ const opened = window.open(flow.verificationUri, "_blank");
8318
+ if (opened !== null) opened.opener = null;
8319
+ setCopied(await copying);
8320
+ if (opened === null) setFailed(t("config.syncGitHubOpenBlocked", { url: flow.verificationUri }));
7459
8321
  };
7460
- const flow = github?.flow;
7461
- const signedIn = github?.signedIn === true;
7462
8322
  (0, react.useEffect)(() => {
7463
- if (client === null || !enabled || flow === void 0) return;
8323
+ if (flow === void 0 || signedIn) return;
7464
8324
  let active = true;
7465
8325
  const timer = setTimeout(() => {
7466
8326
  (async () => {
7467
8327
  try {
7468
8328
  const answer = await client.githubPoll();
7469
8329
  if (!active) return;
8330
+ setFailed(null);
7470
8331
  if (answer.status === "pending") {
7471
8332
  if (answer.intervalMs !== void 0) setPollMs(answer.intervalMs);
7472
8333
  setPollTick((current) => current + 1);
7473
8334
  return;
7474
8335
  }
7475
- const next = await client.githubStatus();
8336
+ await onReadGitHub();
7476
8337
  if (!active) return;
7477
- setGithub(next);
7478
- if (answer.status === "success") {
7479
- askedRepositories.current = false;
7480
- setRepositories(null);
7481
- setNotice(next.login === void 0 ? t("config.syncTokenGitHub") : t("config.syncGitHubSignedIn", { login: next.login }));
7482
- } else if (answer.status === "expired") setGithubFailed(t("config.syncGitHubExpired"));
7483
- else if (answer.status === "denied") setGithubFailed(t("config.syncGitHubDenied"));
7484
- else if (answer.message !== void 0) setGithubFailed(answer.message);
8338
+ if (answer.status === "expired") setFailed(t("config.syncGitHubExpired"));
8339
+ else if (answer.status === "denied") setFailed(t("config.syncGitHubDenied"));
8340
+ else if (answer.status === "error") setFailed(t("config.syncGitHubFailed", { error: answer.message ?? "" }));
7485
8341
  } catch (reason) {
7486
- if (active) setGithubFailed(message(reason));
8342
+ if (active) {
8343
+ setFailed(message(reason));
8344
+ setPollTick((current) => current + 1);
8345
+ }
7487
8346
  }
7488
8347
  })();
7489
8348
  }, Math.max(pollMs, 1e3));
@@ -7493,653 +8352,557 @@ window.__ModuleLoader__.load({
7493
8352
  };
7494
8353
  }, [
7495
8354
  client,
7496
- enabled,
7497
8355
  flow?.userCode,
8356
+ signedIn,
7498
8357
  pollMs,
7499
8358
  pollTick,
8359
+ onReadGitHub,
7500
8360
  t
7501
8361
  ]);
7502
- (0, react.useEffect)(() => {
7503
- if (!enabled || !signedIn || repositories !== null || askedRepositories.current) return;
7504
- askedRepositories.current = true;
7505
- loadRepositories();
7506
- }, [
7507
- enabled,
7508
- signedIn,
7509
- repositories,
7510
- loadRepositories
7511
- ]);
7512
- const states = [];
7513
- if (!loaded) states.push(t("config.syncLoading"));
7514
- else if (status === null) states.push(t("config.syncUnavailable"));
7515
- else if (status.enabled === false) states.push(t("config.syncLoading"));
7516
- else {
7517
- if (!status.configured) states.push(t("config.syncNotConfigured"));
7518
- if (!status.git.available) states.push(t("config.syncGitMissing", { required: status.git.required }));
7519
- if (status.configured && status.git.available) {
7520
- if (!status.remote.reachable) states.push(t("config.syncRemoteUnreachable"));
7521
- else if (!status.remote.branchExists) states.push(t("config.syncRemoteBranchMissing", { branch: status.config.branch }));
7522
- else if (status.remote.commit !== void 0) states.push(t("config.syncRemoteCommit", { commit: status.remote.commit.slice(0, 8) }));
8362
+ /** Choosing a repository connects it; the GitHub grant then authenticates, so no token is kept. */
8363
+ const choose = async (repository) => {
8364
+ setBusy("choose");
8365
+ setFailed(null);
8366
+ try {
8367
+ await client.configureSync({
8368
+ repoUrl: repository.url,
8369
+ token: null
8370
+ });
8371
+ await onConnected();
8372
+ } catch (reason) {
8373
+ setFailed(message(reason));
8374
+ } finally {
8375
+ setBusy(null);
7523
8376
  }
7524
- const credential = status.config.credentialSource;
7525
- if (credential === "github") states.push(status.config.credentialLogin === void 0 ? t("config.syncTokenGitHub") : t("config.syncGitHubSignedIn", { login: status.config.credentialLogin }));
7526
- else if (credential === "environment") states.push(t("config.syncTokenEnvironment"));
7527
- else if (credential === "token") states.push(t("config.syncTokenSaved"));
7528
- else states.push(t("config.syncTokenNone"));
7529
- }
7530
- const autoBackup = status?.autoBackup;
7531
- const ready = client !== null && status !== null && status.configured && status.git.available;
7532
- const editable = !disabled && client !== null;
7533
- const changed = pending?.components.filter((component) => component.changed).length ?? 0;
7534
- const selected = repositories?.some((repository) => repository.url === draft.repoUrl) === true ? draft.repoUrl : "";
7535
- const conflicts = difference?.conflicts ?? [];
7536
- const conflicted = new Set(conflicts.flatMap((conflict) => [conflict.target + "\0" + conflict.local.content, conflict.target + "\0" + conflict.remote.content]));
7537
- const additions = difference === null ? 0 : difference.remoteOnly.filter((entry) => !conflicted.has(entry.target + "\0" + entry.content)).length;
7538
- const heldBack = difference?.heldBack ?? 0;
7539
- const addable = Math.max(additions - heldBack, 0);
7540
- const onlyHere = difference === null ? 0 : difference.localOnly.filter((entry) => !conflicted.has(entry.target + "\0" + entry.content)).length;
7541
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7542
- className: MnemonSettingsCard_module_css_default.syncRow,
7543
- role: "group",
7544
- "aria-labelledby": "mnemon-sync-heading",
7545
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToggleRow, {
7546
- id: "mnemon-sync-enabled",
7547
- titleId: "mnemon-sync-heading",
7548
- label: t("config.syncTitle"),
7549
- hint: t("config.syncSimpleDescription"),
7550
- checked: enabled,
7551
- disabled,
7552
- onChange: onEnabled
7553
- }), enabled && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
8377
+ };
8378
+ const create = async (name) => {
8379
+ setBusy("create");
8380
+ setFailed(null);
8381
+ try {
8382
+ const created = await client.githubCreateRepository(name, true);
8383
+ await client.configureSync({
8384
+ repoUrl: created.url,
8385
+ token: null
8386
+ });
8387
+ await onConnected();
8388
+ } catch (reason) {
8389
+ setFailed(failureText(t, reasonOf(reason), message(reason), ""));
8390
+ } finally {
8391
+ setBusy(null);
8392
+ }
8393
+ };
8394
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
8395
+ !signedIn && flow === void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8396
+ className: MnemonSettingsCard_module_css_default.editorNote,
8397
+ children: github.writable ? t("config.syncGitHubHint") : t("config.syncGitHubReadOnly")
8398
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8399
+ className: MnemonSettingsCard_module_css_default.rowActions,
8400
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8401
+ variant: "primary",
8402
+ size: "sm",
8403
+ disabled: disabled || !github.writable || busy !== null,
8404
+ onClick: () => void start(),
8405
+ children: busy === "start" ? t("config.syncGitHubStarting") : t("config.syncGitHubSignIn")
8406
+ }), cancellable && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8407
+ variant: "ghost",
8408
+ size: "sm",
8409
+ disabled: busy !== null,
8410
+ onClick: onCancel,
8411
+ children: t("common.cancel")
8412
+ })]
8413
+ })] }),
8414
+ !signedIn && flow !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8415
+ className: MnemonSettingsCard_module_css_default.syncDevice,
8416
+ children: [
8417
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8418
+ className: MnemonSettingsCard_module_css_default.editorNote,
8419
+ children: t("config.syncGitHubCode")
8420
+ }),
8421
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8422
+ className: MnemonSettingsCard_module_css_default.syncCode,
8423
+ children: [
8424
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("code", { children: flow.userCode }),
8425
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8426
+ variant: "primary",
8427
+ size: "sm",
8428
+ onClick: () => void copyAndOpen(),
8429
+ children: t("config.syncGitHubCopyOpen")
8430
+ }),
8431
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8432
+ variant: "ghost",
8433
+ size: "sm",
8434
+ disabled: busy !== null,
8435
+ onClick: () => void cancel(),
8436
+ children: t("common.cancel")
8437
+ })
8438
+ ]
8439
+ }),
8440
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8441
+ className: MnemonSettingsCard_module_css_default.editorNote,
8442
+ role: "status",
8443
+ children: copied ? t("config.syncGitHubCopied") : t("config.syncGitHubWaiting")
8444
+ })
8445
+ ]
8446
+ }),
8447
+ signedIn && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
7554
8448
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7555
- className: MnemonSettingsCard_module_css_default.rowActions,
7556
- children: [
7557
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7558
- variant: "outline",
7559
- size: "sm",
7560
- disabled: !ready || busy !== null,
7561
- onClick: () => void preview(),
7562
- children: busy === "preview" ? t("config.syncPreviewing") : t("config.syncPreview")
7563
- }),
7564
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7565
- variant: "outline",
7566
- size: "sm",
7567
- disabled: !ready || busy !== null,
7568
- onClick: () => void loadHistory(),
7569
- children: busy === "backups" ? t("config.syncBackupsLoading") : t("config.syncBackups")
7570
- }),
7571
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7572
- variant: "primary",
7573
- size: "sm",
7574
- disabled: !ready || disabled || busy !== null,
7575
- onClick: () => void push(),
7576
- children: busy === "push" ? t("config.syncPushing") : t("config.syncPush")
7577
- })
7578
- ]
8449
+ className: MnemonSettingsCard_module_css_default.syncAccount,
8450
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: github.login === void 0 ? t("config.syncViaGitHubAnonymous") : t("config.syncGitHubSignedIn", { login: github.login }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8451
+ variant: "ghost",
8452
+ size: "sm",
8453
+ disabled: disabled || busy !== null,
8454
+ onClick: () => void signOut(),
8455
+ children: t("config.syncGitHubSignOut")
8456
+ })]
8457
+ }),
8458
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RepositoryPicker, {
8459
+ client,
8460
+ login: github.login,
8461
+ current: props.status.config.repoUrl,
8462
+ disabled: disabled || busy !== null,
8463
+ creating: busy === "create",
8464
+ t,
8465
+ onChoose: choose,
8466
+ onCreate: create,
8467
+ onSignInAgain: () => void signInAgain()
7579
8468
  }),
8469
+ cancellable && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8470
+ className: MnemonSettingsCard_module_css_default.rowActions,
8471
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8472
+ variant: "ghost",
8473
+ size: "sm",
8474
+ disabled: busy !== null,
8475
+ onClick: onCancel,
8476
+ children: t("common.cancel")
8477
+ })
8478
+ })
8479
+ ] }),
8480
+ failed !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8481
+ className: MnemonSettingsCard_module_css_default.error,
8482
+ role: "alert",
8483
+ children: failed
8484
+ })
8485
+ ] });
8486
+ }
8487
+ /**
8488
+ * The account's repositories, searched by name. A name that matches none can be
8489
+ * created on the spot, private; a public repository is used only after the
8490
+ * reader confirms that anyone can then read the memory.
8491
+ */
8492
+ function RepositoryPicker({ client, login, current, disabled, creating, t, onChoose, onCreate, onSignInAgain }) {
8493
+ const [repositories, setRepositories] = (0, react.useState)(null);
8494
+ const [loading, setLoading] = (0, react.useState)(false);
8495
+ const [failed, setFailed] = (0, react.useState)(null);
8496
+ const [query, setQuery] = (0, react.useState)("");
8497
+ const [confirming, setConfirming] = (0, react.useState)(null);
8498
+ const load = (0, react.useCallback)(async () => {
8499
+ setLoading(true);
8500
+ setFailed(null);
8501
+ try {
8502
+ setRepositories((await client.githubRepositories()).repositories);
8503
+ } catch (reason) {
8504
+ const expired = reasonOf(reason) === "github-unauthorized";
8505
+ setFailed({
8506
+ text: expired ? t("config.syncGitHubExpiredGrant") : t("config.syncRepositoriesFailed", { error: message(reason) }),
8507
+ expired
8508
+ });
8509
+ } finally {
8510
+ setLoading(false);
8511
+ }
8512
+ }, [client, t]);
8513
+ (0, react.useEffect)(() => {
8514
+ load();
8515
+ }, [load]);
8516
+ const needle = query.trim().toLowerCase();
8517
+ const matches = (repositories ?? []).filter((repository) => needle === "" || repository.fullName.toLowerCase().includes(needle));
8518
+ const exact = (repositories ?? []).some((repository) => repository.name.toLowerCase() === needle && (login === void 0 || repository.owner.toLowerCase() === login.toLowerCase()));
8519
+ const creatable = needle !== "" && !exact && repositoryNameValid(query) && !query.includes("/");
8520
+ const pick = (repository) => {
8521
+ if (!repository.private) {
8522
+ setConfirming(repository);
8523
+ return;
8524
+ }
8525
+ onChoose(repository);
8526
+ };
8527
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8528
+ className: MnemonSettingsCard_module_css_default.syncPicker,
8529
+ children: [
7580
8530
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7581
- className: MnemonSettingsCard_module_css_default.syncState,
7582
- "aria-live": "polite",
7583
- children: states.map((state) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: state }, state))
8531
+ className: MnemonSettingsCard_module_css_default.fieldGrid,
8532
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [t("config.syncRepositoryLabel"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
8533
+ type: "search",
8534
+ value: query,
8535
+ "aria-label": t("config.syncRepositorySearch"),
8536
+ placeholder: t("config.syncRepositorySearch"),
8537
+ disabled,
8538
+ autoComplete: "off",
8539
+ spellCheck: false,
8540
+ autoCapitalize: "none",
8541
+ autoCorrect: "off",
8542
+ onChange: (event) => setQuery(event.target.value)
8543
+ })] })
7584
8544
  }),
7585
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7586
- className: MnemonSettingsCard_module_css_default.syncForm,
7587
- children: [
7588
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7589
- className: MnemonSettingsCard_module_css_default.syncBlock,
7590
- children: [
7591
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("config.syncGitHub") }), signedIn && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7592
- className: MnemonSettingsCard_module_css_default.syncAccount,
7593
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: github?.login === void 0 ? t("config.syncTokenGitHub") : t("config.syncGitHubSignedIn", { login: github.login }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7594
- variant: "ghost",
7595
- size: "sm",
7596
- disabled: !editable || busy !== null,
7597
- onClick: () => void signOut(),
7598
- children: t("config.syncGitHubSignOut")
7599
- })]
7600
- })] }),
7601
- github === null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncLoading") }),
7602
- github !== null && !github.available && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncGitHubUnavailable") }),
7603
- github !== null && github.available && !signedIn && flow === void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncGitHubHint") }), github.writable ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7604
- className: MnemonSettingsCard_module_css_default.syncFormActions,
7605
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7606
- variant: "outline",
7607
- size: "sm",
7608
- disabled: !editable || busy !== null,
7609
- onClick: () => void signIn(),
7610
- children: busy === "github" ? t("config.syncGitHubStarting") : t("config.syncGitHubSignIn")
7611
- })
7612
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncGitHubReadOnly") })] }),
7613
- flow !== void 0 && !signedIn && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
7614
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncGitHubCode") }),
7615
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7616
- className: MnemonSettingsCard_module_css_default.syncCode,
7617
- children: [
7618
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("code", { children: flow.userCode }),
7619
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7620
- variant: "outline",
7621
- size: "sm",
7622
- onClick: () => void copyCode(flow.userCode),
7623
- children: copied ? t("config.syncGitHubCopied") : t("config.syncGitHubCopy")
7624
- }),
7625
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
7626
- href: flow.verificationUri,
7627
- target: "_blank",
7628
- rel: "noreferrer noopener",
7629
- children: t("config.syncGitHubOpen")
7630
- })
7631
- ]
7632
- }),
7633
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncGitHubWaiting") }),
7634
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7635
- className: MnemonSettingsCard_module_css_default.syncFormActions,
7636
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7637
- variant: "ghost",
7638
- size: "sm",
7639
- disabled: busy !== null,
7640
- onClick: () => void cancelSignIn(),
7641
- children: t("common.cancel")
7642
- })
7643
- })
7644
- ] }),
7645
- githubFailed !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7646
- className: MnemonSettingsCard_module_css_default.error,
7647
- children: t("config.syncGitHubFailed", { error: githubFailed })
7648
- })
7649
- ]
7650
- }),
7651
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7652
- className: MnemonSettingsCard_module_css_default.syncBlock,
8545
+ loading && repositories === null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8546
+ className: MnemonSettingsCard_module_css_default.editorNote,
8547
+ role: "status",
8548
+ children: t("config.syncRepositoriesLoading")
8549
+ }),
8550
+ failed !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8551
+ className: MnemonSettingsCard_module_css_default.syncWarning,
8552
+ role: "alert",
8553
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: failed.text }), failed.expired ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8554
+ variant: "ghost",
8555
+ size: "sm",
8556
+ onClick: onSignInAgain,
8557
+ children: t("config.syncGitHubSignInAgain")
8558
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8559
+ variant: "ghost",
8560
+ size: "sm",
8561
+ disabled: loading,
8562
+ onClick: () => void load(),
8563
+ children: t("config.syncRepositoriesRetry")
8564
+ })]
8565
+ }),
8566
+ repositories !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", {
8567
+ className: MnemonSettingsCard_module_css_default.syncRepositoryList,
8568
+ "aria-label": t("config.syncRepositoryLabel"),
8569
+ children: [
8570
+ creatable && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
8571
+ type: "button",
8572
+ className: MnemonSettingsCard_module_css_default.syncRepositoryOption,
8573
+ disabled,
8574
+ onClick: () => void onCreate(query.trim()),
8575
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: creating ? t("config.syncRepositoryCreating") : t("config.syncRepositoryCreate", { name: (login === void 0 ? "" : login + "/") + query.trim() }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tag, {
8576
+ tone: "quiet",
8577
+ children: t("config.syncRepositoryPrivate")
8578
+ })]
8579
+ }) }),
8580
+ matches.slice(0, SHOWN_REPOSITORIES).map((repository) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
8581
+ type: "button",
8582
+ className: MnemonSettingsCard_module_css_default.syncRepositoryOption,
8583
+ disabled: disabled || !repository.push,
8584
+ "aria-current": repository.url === current ? "true" : void 0,
8585
+ onClick: () => pick(repository),
7653
8586
  children: [
7654
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("header", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("config.syncAutoBackup") }) }),
7655
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncAutoBackupHint") }),
7656
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7657
- className: MnemonSettingsCard_module_css_default.syncField,
7658
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
7659
- htmlFor: "mnemon-sync-auto-backup",
7660
- children: t("config.syncAutoBackup")
7661
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
7662
- id: "mnemon-sync-auto-backup",
7663
- value: String(draft.autoBackupMinutes),
7664
- disabled: !editable || autoBackupSaving,
7665
- onChange: (event) => void setAutoBackup(Number(event.target.value)),
7666
- children: AUTO_BACKUP_CHOICES.map((minutes) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
7667
- value: String(minutes),
7668
- children: intervalLabel(t, minutes)
7669
- }, minutes))
7670
- })]
8587
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: repository.fullName }),
8588
+ repository.url === current && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tag, {
8589
+ tone: "outline",
8590
+ children: t("config.syncRepositoryCurrent")
8591
+ }),
8592
+ !repository.push && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tag, {
8593
+ tone: "quiet",
8594
+ children: t("config.syncRepositoryNoPush")
7671
8595
  }),
7672
- autoBackup !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: autoBackup.available ? autoBackup.nextAt === void 0 ? "" : t("config.syncAutoBackupNext", { at: stamp(autoBackup.nextAt) }) : t("config.syncAutoBackupNever") }),
7673
- autoBackup?.lastAt !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncAutoBackupLast", { at: stamp(autoBackup.lastAt) }) }),
7674
- autoBackup?.lastError !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
7675
- className: MnemonSettingsCard_module_css_default.error,
7676
- children: t("config.syncAutoBackupFailed", { error: autoBackup.lastError })
8596
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tag, {
8597
+ tone: "quiet",
8598
+ children: repository.private ? t("config.syncRepositoryPrivate") : t("config.syncRepositoryPublic")
7677
8599
  })
7678
8600
  ]
8601
+ }) }, repository.fullName)),
8602
+ matches.length === 0 && !creatable && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
8603
+ className: MnemonSettingsCard_module_css_default.editorNote,
8604
+ children: needle === "" ? t("config.syncRepositoriesNone") : t("config.syncRepositoriesEmpty")
7679
8605
  }),
7680
- github !== null && github.available && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7681
- className: MnemonSettingsCard_module_css_default.syncBlock,
7682
- children: [
7683
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("config.syncRepositories") }), repositories !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7684
- variant: "ghost",
7685
- size: "sm",
7686
- disabled: !editable || busy !== null,
7687
- onClick: () => void loadRepositories(),
7688
- children: busy === "repos" ? t("config.syncRepositoriesLoading") : t("config.syncRepositoriesLoad")
7689
- })] }),
7690
- !signedIn && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncRepositoriesSignIn") }),
7691
- signedIn && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
7692
- repositories === null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: busy === "repos" ? t("config.syncRepositoriesLoading") : t("config.syncRepositoriesHint") }),
7693
- repositories !== null && repositories.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncRepositoriesEmpty") }),
7694
- repositories !== null && repositories.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7695
- className: MnemonSettingsCard_module_css_default.syncField,
7696
- children: [
7697
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
7698
- htmlFor: "mnemon-sync-repository",
7699
- children: t("config.syncRepositories")
7700
- }),
7701
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
7702
- id: "mnemon-sync-repository",
7703
- value: selected,
7704
- disabled: !editable || busy !== null,
7705
- onChange: (event) => {
7706
- const repository = repositories.find((candidate) => candidate.url === event.target.value);
7707
- if (repository !== void 0) choose(repository);
7708
- },
7709
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
7710
- value: "",
7711
- children: t("config.syncRepositoriesChoose")
7712
- }), repositories.map((repository) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
7713
- value: repository.url,
7714
- disabled: !repository.push,
7715
- children: repository.fullName + (repository.private ? " · " + t("config.syncRepositoriesPrivate") : "") + (repository.push ? "" : " · " + t("config.syncRepositoriesNoPush"))
7716
- }, repository.fullName))]
7717
- }),
7718
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncRepoUrlHint") })
7719
- ]
7720
- }),
7721
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7722
- className: MnemonSettingsCard_module_css_default.syncField,
7723
- children: [
7724
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
7725
- htmlFor: "mnemon-sync-repository-name",
7726
- children: t("config.syncRepositoryName")
7727
- }),
7728
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
7729
- id: "mnemon-sync-repository-name",
7730
- type: "text",
7731
- value: repositoryName,
7732
- placeholder: "mnemon-memory",
7733
- disabled: !editable || busy !== null,
7734
- autoComplete: "off",
7735
- spellCheck: false,
7736
- autoCapitalize: "none",
7737
- autoCorrect: "off",
7738
- onChange: (event) => setRepositoryName(event.target.value)
7739
- }),
7740
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
7741
- className: MnemonSettingsCard_module_css_default.syncCheck,
7742
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
7743
- type: "checkbox",
7744
- checked: repositoryPrivate,
7745
- disabled: !editable || busy !== null,
7746
- onChange: (event) => setRepositoryPrivate(event.target.checked)
7747
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("config.syncRepositoryPrivate") })]
7748
- })
7749
- ]
8606
+ matches.length > SHOWN_REPOSITORIES && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
8607
+ className: MnemonSettingsCard_module_css_default.editorNote,
8608
+ children: t("config.syncRepositoriesMore", { count: matches.length - SHOWN_REPOSITORIES })
8609
+ })
8610
+ ]
8611
+ }),
8612
+ needle !== "" && !creatable && !exact && !repositoryNameValid(query) && !query.includes("/") && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8613
+ className: MnemonSettingsCard_module_css_default.error,
8614
+ children: t("config.syncRepositoryNameInvalid")
8615
+ }),
8616
+ confirming !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SyncConfirmDialog, {
8617
+ title: t("config.syncPublicTitle"),
8618
+ body: t("config.syncPublicBody", { name: confirming.fullName }),
8619
+ confirm: t("config.syncPublicConfirm"),
8620
+ t,
8621
+ onClose: () => setConfirming(null),
8622
+ onConfirm: () => {
8623
+ const repository = confirming;
8624
+ setConfirming(null);
8625
+ onChoose(repository);
8626
+ }
8627
+ })
8628
+ ]
8629
+ });
8630
+ }
8631
+ /**
8632
+ * What this computer is called, where on the branch the memory goes and whose name
8633
+ * its commits carry. Each field shows the value in use; the computer's name is the
8634
+ * host name or a typed one, and the author an explicit choice between the channel's
8635
+ * own identity, this computer's Git identity, and a typed one.
8636
+ */
8637
+ function AdvancedSettings({ client, status, disabled, t, onSaved }) {
8638
+ const [open, setOpen] = (0, react.useState)(false);
8639
+ const config = status.config;
8640
+ const savedMode = authorModeOf(config.authorName, config.authorEmail);
8641
+ const [branch, setBranch] = (0, react.useState)(config.branch);
8642
+ const [subdir, setSubdir] = (0, react.useState)(config.subdir);
8643
+ const [mode, setMode] = (0, react.useState)(savedMode);
8644
+ const [name, setName] = (0, react.useState)(savedMode === "custom" ? config.authorName : "");
8645
+ const [email, setEmail] = (0, react.useState)(savedMode === "custom" ? config.authorEmail : "");
8646
+ const savedLabel = status.machine?.label ?? "";
8647
+ const savedSource = status.machineLabel?.source ?? "hostname";
8648
+ const hostname = status.machineLabel?.hostname ?? savedLabel;
8649
+ const [nameSource, setNameSource] = (0, react.useState)(savedSource);
8650
+ const [machineName, setMachineName] = (0, react.useState)(savedSource === "custom" ? savedLabel : "");
8651
+ const [busy, setBusy] = (0, react.useState)(false);
8652
+ const [feedback, setFeedback] = (0, react.useState)(null);
8653
+ const radio = (0, react.useId)();
8654
+ const nameRadio = (0, react.useId)();
8655
+ (0, react.useEffect)(() => {
8656
+ setBranch(config.branch);
8657
+ setSubdir(config.subdir);
8658
+ const next = authorModeOf(config.authorName, config.authorEmail);
8659
+ setMode(next);
8660
+ setName(next === "custom" ? config.authorName : "");
8661
+ setEmail(next === "custom" ? config.authorEmail : "");
8662
+ }, [
8663
+ config.branch,
8664
+ config.subdir,
8665
+ config.authorName,
8666
+ config.authorEmail
8667
+ ]);
8668
+ (0, react.useEffect)(() => {
8669
+ setNameSource(savedSource);
8670
+ setMachineName(savedSource === "custom" ? savedLabel : "");
8671
+ }, [savedSource, savedLabel]);
8672
+ const author = mode === "default" ? {
8673
+ authorName: MNEMON_SYNC_DEFAULT_AUTHOR_NAME,
8674
+ authorEmail: MNEMON_SYNC_DEFAULT_AUTHOR_EMAIL
8675
+ } : mode === "machine" ? {
8676
+ authorName: "",
8677
+ authorEmail: ""
8678
+ } : {
8679
+ authorName: name.trim(),
8680
+ authorEmail: email.trim()
8681
+ };
8682
+ const branchOk = branchValid(branch);
8683
+ const subdirOk = directoryValid(subdir);
8684
+ const authorChanged = author.authorName !== config.authorName || author.authorEmail !== config.authorEmail;
8685
+ const customOk = mode !== "custom" || !authorChanged || name.trim() !== "" && emailValid(email);
8686
+ const normalizedSubdir = subdir.trim().replaceAll("\\", "/").split("/").filter((part) => part !== "").join("/") + "/";
8687
+ const moved = branch.trim() !== config.branch || normalizedSubdir !== config.subdir;
8688
+ const nameOk = nameSource === "hostname" || machineNameValid(machineName);
8689
+ const renamed = nameSource !== savedSource || nameSource === "custom" && machineName.trim() !== savedLabel;
8690
+ const ready = (moved || renamed || author.authorName !== config.authorName || author.authorEmail !== config.authorEmail) && branchOk && subdirOk && customOk && nameOk;
8691
+ const shownName = nameSource === "hostname" ? hostname : machineName.trim();
8692
+ const save = async () => {
8693
+ if (!ready || busy) return;
8694
+ setBusy(true);
8695
+ setFeedback(null);
8696
+ try {
8697
+ await client.configureSync({
8698
+ branch: branch.trim(),
8699
+ subdir: subdir.trim(),
8700
+ ...author,
8701
+ ...renamed ? { machineLabel: nameSource === "hostname" ? null : machineName.trim() } : {}
8702
+ });
8703
+ setFeedback({
8704
+ tone: "success",
8705
+ text: t("config.syncAdvancedSaved")
8706
+ });
8707
+ onSaved();
8708
+ } catch (reason) {
8709
+ setFeedback({
8710
+ tone: "error",
8711
+ text: message(reason)
8712
+ });
8713
+ } finally {
8714
+ setBusy(false);
8715
+ }
8716
+ };
8717
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8718
+ className: MnemonSettingsCard_module_css_default.syncAdvanced,
8719
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
8720
+ type: "button",
8721
+ className: MnemonSettingsCard_module_css_default.syncDisclosure,
8722
+ "aria-expanded": open,
8723
+ onClick: () => setOpen((value) => !value),
8724
+ children: [
8725
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("config.syncAdvanced") }),
8726
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: [
8727
+ savedLabel,
8728
+ config.branch,
8729
+ config.subdir,
8730
+ savedMode === "default" ? t("config.syncAuthorDefault") : savedMode === "machine" ? t("config.syncAuthorMachine") : config.authorName || config.authorEmail || t("config.syncAuthorCustom")
8731
+ ].filter((part) => part !== "").join(" · ") }),
8732
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, {
8733
+ className: MnemonSettingsCard_module_css_default.providerChevron,
8734
+ size: 14
8735
+ })
8736
+ ]
8737
+ }), open && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8738
+ className: MnemonSettingsCard_module_css_default.editor,
8739
+ children: [
8740
+ status.machine !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8741
+ className: MnemonSettingsCard_module_css_default.syncChoice,
8742
+ children: [
8743
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8744
+ className: MnemonSettingsCard_module_css_default.syncFieldLabel,
8745
+ id: nameRadio + "-label",
8746
+ children: t("config.syncMachineName")
8747
+ }),
8748
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8749
+ className: MnemonSettingsCard_module_css_default.inlineChoices,
8750
+ role: "radiogroup",
8751
+ "aria-labelledby": nameRadio + "-label",
8752
+ children: ["hostname", "custom"].map((value) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
8753
+ type: "radio",
8754
+ name: nameRadio,
8755
+ value,
8756
+ checked: nameSource === value,
8757
+ disabled: disabled || busy,
8758
+ onChange: () => setNameSource(value)
8759
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: value === "hostname" ? t("config.syncMachineHostname") : t("config.syncMachineCustom") })] }, value))
8760
+ }),
8761
+ nameSource === "custom" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8762
+ className: MnemonSettingsCard_module_css_default.fieldGrid,
8763
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [
8764
+ t("config.syncMachineNameLabel"),
8765
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
8766
+ type: "text",
8767
+ value: machineName,
8768
+ "aria-label": t("config.syncMachineName"),
8769
+ disabled: disabled || busy,
8770
+ "aria-invalid": machineName.trim() === "" || nameOk ? void 0 : true,
8771
+ autoComplete: "off",
8772
+ spellCheck: false,
8773
+ onChange: (event) => setMachineName(event.target.value)
7750
8774
  }),
7751
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7752
- className: MnemonSettingsCard_module_css_default.syncFormActions,
7753
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7754
- variant: "outline",
7755
- size: "sm",
7756
- disabled: !editable || busy !== null || repositoryName.trim() === "",
7757
- onClick: () => void createRepository(),
7758
- children: busy === "create" ? t("config.syncRepositoryCreating") : t("config.syncRepositoryCreate")
7759
- })
8775
+ machineName.trim() !== "" && !nameOk && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
8776
+ className: MnemonSettingsCard_module_css_default.error,
8777
+ children: t("config.syncMachineNameInvalid")
7760
8778
  })
7761
8779
  ] })
7762
- ]
7763
- }),
7764
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7765
- className: MnemonSettingsCard_module_css_default.syncField,
7766
- children: [
7767
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
7768
- htmlFor: "mnemon-sync-repo",
7769
- children: t("config.syncRepoUrl")
7770
- }),
7771
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
7772
- id: "mnemon-sync-repo",
7773
- type: "text",
7774
- value: draft.repoUrl,
7775
- placeholder: "https://github.com/owner/repository.git",
7776
- disabled: !editable,
7777
- autoComplete: "off",
7778
- spellCheck: false,
7779
- autoCapitalize: "none",
7780
- autoCorrect: "off",
7781
- onChange: (event) => setDraft((current) => ({
7782
- ...current,
7783
- repoUrl: event.target.value
7784
- }))
7785
- }),
7786
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncRepoUrlHint") })
7787
- ]
7788
- }),
7789
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7790
- className: MnemonSettingsCard_module_css_default.syncField,
7791
- children: [
7792
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
7793
- htmlFor: "mnemon-sync-branch",
7794
- children: t("config.syncBranch")
7795
- }),
7796
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
7797
- id: "mnemon-sync-branch",
7798
- type: "text",
7799
- value: draft.branch,
7800
- placeholder: saved?.branch ?? "mnemon-sync",
7801
- disabled: !editable,
7802
- autoComplete: "off",
7803
- spellCheck: false,
7804
- autoCapitalize: "none",
7805
- autoCorrect: "off",
7806
- onChange: (event) => setDraft((current) => ({
7807
- ...current,
7808
- branch: event.target.value
7809
- }))
7810
- }),
7811
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncBranchHint", { branch: saved?.branch ?? "mnemon-sync" }) })
7812
- ]
7813
- }),
7814
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7815
- className: MnemonSettingsCard_module_css_default.syncField,
7816
- children: [
7817
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
7818
- htmlFor: "mnemon-sync-subdir",
7819
- children: t("config.syncSubdir")
7820
- }),
7821
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
7822
- id: "mnemon-sync-subdir",
7823
- type: "text",
7824
- value: draft.subdir,
7825
- placeholder: saved?.subdir ?? "mnemon/",
7826
- disabled: !editable,
7827
- autoComplete: "off",
7828
- spellCheck: false,
7829
- autoCapitalize: "none",
7830
- autoCorrect: "off",
7831
- onChange: (event) => setDraft((current) => ({
7832
- ...current,
7833
- subdir: event.target.value
7834
- }))
7835
- }),
7836
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncSubdirHint", { subdir: saved?.subdir ?? "mnemon/" }) })
7837
- ]
7838
- }),
7839
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7840
- className: MnemonSettingsCard_module_css_default.syncField,
7841
- children: [
7842
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
7843
- htmlFor: "mnemon-sync-token",
7844
- children: t("config.syncToken")
7845
- }),
7846
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
7847
- id: "mnemon-sync-token",
7848
- type: "password",
7849
- value: draft.token,
7850
- disabled: !editable || draft.clearToken,
7851
- placeholder: saved?.hasToken ? t("config.syncTokenSaved") : t("config.syncTokenNone"),
7852
- autoComplete: "new-password",
7853
- spellCheck: false,
7854
- onChange: (event) => setDraft((current) => ({
7855
- ...current,
7856
- token: event.target.value
7857
- }))
7858
- }),
7859
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncTokenOptional") }),
7860
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncTokenHint", {
7861
- path: status?.configPath ?? "",
7862
- env: "MNEMON_SYNC_GIT_TOKEN"
7863
- }) }),
7864
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncTokenKeep") }),
7865
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
7866
- className: MnemonSettingsCard_module_css_default.syncCheck,
7867
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
7868
- type: "checkbox",
7869
- checked: draft.clearToken,
7870
- disabled: !editable,
7871
- onChange: (event) => setDraft((current) => ({
7872
- ...current,
7873
- clearToken: event.target.checked,
7874
- token: ""
7875
- }))
7876
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("config.syncTokenClear") })]
7877
- })
7878
- ]
7879
- }),
7880
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7881
- className: MnemonSettingsCard_module_css_default.syncField,
7882
- children: [
7883
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
7884
- htmlFor: "mnemon-sync-author-name",
7885
- children: t("config.syncAuthorName")
7886
- }),
7887
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
7888
- id: "mnemon-sync-author-name",
7889
- type: "text",
7890
- value: draft.authorName,
7891
- placeholder: t("config.syncAuthorOptional"),
7892
- disabled: !editable,
7893
- autoComplete: "off",
7894
- spellCheck: false,
7895
- onChange: (event) => setDraft((current) => ({
7896
- ...current,
7897
- authorName: event.target.value
7898
- }))
7899
- }),
7900
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncAuthorHint") })
7901
- ]
7902
- }),
7903
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7904
- className: MnemonSettingsCard_module_css_default.syncField,
7905
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
7906
- htmlFor: "mnemon-sync-author-email",
7907
- children: t("config.syncAuthorEmail")
7908
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
7909
- id: "mnemon-sync-author-email",
8780
+ }),
8781
+ (nameSource === "hostname" || nameOk) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8782
+ className: MnemonSettingsCard_module_css_default.editorNote,
8783
+ children: nameSource === "hostname" ? t("config.syncMachineHostnameNote", { name: shownName }) : t("config.syncMachineCustomNote", { name: shownName })
8784
+ })
8785
+ ]
8786
+ }),
8787
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8788
+ className: MnemonSettingsCard_module_css_default.fieldGrid,
8789
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [
8790
+ t("config.syncBranch"),
8791
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
7910
8792
  type: "text",
7911
- value: draft.authorEmail,
7912
- placeholder: t("config.syncAuthorOptional"),
7913
- disabled: !editable,
8793
+ value: branch,
8794
+ "aria-label": t("config.syncBranch"),
8795
+ disabled: disabled || busy,
8796
+ "aria-invalid": branchOk ? void 0 : true,
7914
8797
  autoComplete: "off",
7915
8798
  spellCheck: false,
7916
- onChange: (event) => setDraft((d) => ({
7917
- ...d,
7918
- authorEmail: event.target.value
7919
- }))
7920
- })]
7921
- }),
7922
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7923
- className: MnemonSettingsCard_module_css_default.syncFormActions,
7924
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7925
- variant: "primary",
7926
- size: "sm",
7927
- disabled: !editable || busy !== null || !configured(draft),
7928
- onClick: () => void save(),
7929
- children: busy === "save" ? t("config.syncSave") + "…" : t("config.syncSave")
8799
+ autoCapitalize: "none",
8800
+ autoCorrect: "off",
8801
+ onChange: (event) => setBranch(event.target.value)
8802
+ }),
8803
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: branchOk ? t("config.syncDefaultValue", { value: "mnemon-sync" }) : t("config.syncBranchInvalid") })
8804
+ ] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [
8805
+ t("config.syncSubdir"),
8806
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
8807
+ type: "text",
8808
+ value: subdir,
8809
+ "aria-label": t("config.syncSubdir"),
8810
+ disabled: disabled || busy,
8811
+ "aria-invalid": subdirOk ? void 0 : true,
8812
+ autoComplete: "off",
8813
+ spellCheck: false,
8814
+ autoCapitalize: "none",
8815
+ autoCorrect: "off",
8816
+ onChange: (event) => setSubdir(event.target.value)
8817
+ }),
8818
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: subdirOk ? t("config.syncDefaultValue", { value: "mnemon/" }) : t("config.syncSubdirInvalid") })
8819
+ ] })]
8820
+ }),
8821
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8822
+ className: MnemonSettingsCard_module_css_default.syncChoice,
8823
+ children: [
8824
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8825
+ className: MnemonSettingsCard_module_css_default.syncFieldLabel,
8826
+ id: radio + "-label",
8827
+ children: t("config.syncAuthor")
8828
+ }),
8829
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8830
+ className: MnemonSettingsCard_module_css_default.inlineChoices,
8831
+ role: "radiogroup",
8832
+ "aria-labelledby": radio + "-label",
8833
+ children: [
8834
+ "default",
8835
+ "machine",
8836
+ "custom"
8837
+ ].map((value) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
8838
+ type: "radio",
8839
+ name: radio,
8840
+ value,
8841
+ checked: mode === value,
8842
+ disabled: disabled || busy,
8843
+ onChange: () => setMode(value)
8844
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: value === "default" ? t("config.syncAuthorDefault") : value === "machine" ? t("config.syncAuthorMachine") : t("config.syncAuthorCustom") })] }, value))
8845
+ }),
8846
+ mode === "default" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8847
+ className: MnemonSettingsCard_module_css_default.editorNote,
8848
+ children: t("config.syncAuthorDefaultNote", { identity: DEFAULT_AUTHOR })
8849
+ }),
8850
+ mode === "machine" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8851
+ className: MnemonSettingsCard_module_css_default.editorNote,
8852
+ children: t("config.syncAuthorMachineNote")
8853
+ }),
8854
+ mode === "custom" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8855
+ className: MnemonSettingsCard_module_css_default.fieldGrid,
8856
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [t("config.syncAuthorName"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
8857
+ type: "text",
8858
+ value: name,
8859
+ "aria-label": t("config.syncAuthorName"),
8860
+ disabled: disabled || busy,
8861
+ autoComplete: "off",
8862
+ spellCheck: false,
8863
+ onChange: (event) => setName(event.target.value)
8864
+ })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [
8865
+ t("config.syncAuthorEmail"),
8866
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
8867
+ type: "email",
8868
+ value: email,
8869
+ "aria-label": t("config.syncAuthorEmail"),
8870
+ disabled: disabled || busy,
8871
+ "aria-invalid": email.trim() === "" || emailValid(email) ? void 0 : true,
8872
+ autoComplete: "off",
8873
+ spellCheck: false,
8874
+ onChange: (event) => setEmail(event.target.value)
8875
+ }),
8876
+ email.trim() !== "" && !emailValid(email) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
8877
+ className: MnemonSettingsCard_module_css_default.error,
8878
+ children: t("config.syncAuthorEmailInvalid")
8879
+ })
8880
+ ] })]
7930
8881
  })
7931
- })
7932
- ]
7933
- }),
7934
- pending !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7935
- className: MnemonSettingsCard_module_css_default.syncBar,
7936
- role: "status",
7937
- children: [
7938
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
7939
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("config.syncPreviewReady", {
7940
- commit: pending.commit.slice(0, 8),
7941
- components: pending.manifest.components.length,
7942
- size: humanBytes(pending.archiveBytes)
7943
- }) }),
7944
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncPreviewComponents", {
7945
- changed,
7946
- total: pending.components.length
7947
- }) }),
7948
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncPreviewFiles", {
7949
- added: pending.files.added,
7950
- removed: pending.files.removed,
7951
- changed: pending.files.changed
7952
- }) })
7953
- ] }),
7954
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7955
- variant: "ghost",
7956
- size: "sm",
7957
- disabled: busy !== null,
7958
- onClick: () => setPending(null),
7959
- children: t("common.cancel")
7960
- }),
7961
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8882
+ ]
8883
+ }),
8884
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8885
+ className: MnemonSettingsCard_module_css_default.memoryConfigFooter,
8886
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8887
+ className: MnemonSettingsCard_module_css_default.configFeedback,
8888
+ "aria-live": "polite",
8889
+ children: feedback !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FeedbackLine, { value: feedback }) : moved && branchOk && subdirOk ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8890
+ className: MnemonSettingsCard_module_css_default.editorNote,
8891
+ children: t("config.syncAdvancedNote")
8892
+ }) : renamed && nameOk ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8893
+ className: MnemonSettingsCard_module_css_default.editorNote,
8894
+ children: t("config.syncMachineRenameNote")
8895
+ }) : null
8896
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7962
8897
  variant: "primary",
7963
8898
  size: "sm",
7964
- disabled: busy !== null || disabled,
7965
- onClick: () => void pull(),
7966
- children: busy === "pull" ? t("config.syncPulling") : t("config.syncPull")
7967
- })
7968
- ]
7969
- }),
7970
- dialog && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MnemonDialog, {
7971
- title: t("config.syncBackups"),
7972
- closeLabel: t("common.close"),
7973
- wide: true,
7974
- busy: busy !== null,
7975
- onClose: () => setDialog(false),
7976
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7977
- className: MnemonSettingsCard_module_css_default.syncDialogBody,
7978
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7979
- className: MnemonSettingsCard_module_css_default.syncBackups,
7980
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("config.syncBackupsTitle", { branch: backups?.branch ?? status?.config.branch ?? "" }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7981
- className: MnemonSettingsCard_module_css_default.rowActions,
7982
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7983
- variant: "ghost",
7984
- size: "sm",
7985
- disabled: busy !== null,
7986
- onClick: () => void loadHistory(),
7987
- children: busy === "backups" ? t("config.syncBackupsLoading") : t("review.refresh")
7988
- })
7989
- })] }), backups === null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncBackupsLoading") }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncBackupsHint", { subdir: backups.subdir }) }), backups.commits.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncBackupsEmpty") }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7990
- className: MnemonSettingsCard_module_css_default.syncBackupList,
7991
- children: [backups.commits.map((commit) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7992
- className: MnemonSettingsCard_module_css_default.syncBackupEntry,
7993
- children: [
7994
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7995
- className: MnemonSettingsCard_module_css_default.reviewTitle,
7996
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: commit.message }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tag, {
7997
- tone: "quiet",
7998
- children: commit.commit.slice(0, 8)
7999
- })]
8000
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8001
- className: MnemonSettingsCard_module_css_default.rowActions,
8002
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8003
- variant: "ghost",
8004
- size: "sm",
8005
- disabled: busy !== null,
8006
- onClick: () => setOpenCommit(openCommit === commit.commit ? null : commit.commit),
8007
- children: openCommit === commit.commit ? t("review.collapse") : t("review.expand")
8008
- })
8009
- })] }),
8010
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncBackupMeta", {
8011
- machine: ownerName(t, commit.machine),
8012
- time: stamp(commit.committedAt)
8013
- }) }),
8014
- commit.pushedAt !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncBackupPushedAt", { time: stamp(commit.pushedAt) }) }),
8015
- openCommit === commit.commit && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8016
- className: MnemonSettingsCard_module_css_default.syncBackupComponents,
8017
- children: commit.components.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncBackupNoComponents") }) : commit.components.map((component) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncBackupComponent", {
8018
- component: component.component,
8019
- items: component.items,
8020
- files: component.files,
8021
- size: humanBytes(component.bytes)
8022
- }) }, component.component))
8023
- })
8024
- ]
8025
- }, commit.commit)), backups.truncated && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8026
- className: MnemonSettingsCard_module_css_default.rowActions,
8027
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8028
- variant: "outline",
8029
- size: "sm",
8030
- disabled: busy !== null,
8031
- onClick: () => void loadMore(),
8032
- children: busy === "more" ? t("config.syncBackupsLoading") : t("config.syncBackupsMore")
8033
- })
8034
- })]
8035
- })] })]
8036
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8037
- className: MnemonSettingsCard_module_css_default.syncDiff,
8038
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("config.syncDiffTitle", {
8039
- commit: difference?.commit.slice(0, 8) ?? "",
8040
- shared: difference?.shared ?? 0
8041
- }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8042
- className: MnemonSettingsCard_module_css_default.rowActions,
8043
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8044
- variant: "ghost",
8045
- size: "sm",
8046
- disabled: busy !== null,
8047
- onClick: () => void loadDifference(),
8048
- children: busy === "diff" ? t("config.syncPreviewing") : t("review.refresh")
8049
- })
8050
- })] }), difference === null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncBackupsLoading") }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
8051
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncDiffSides", {
8052
- local: difference.local.entries,
8053
- remote: difference.remote.entries,
8054
- machine: ownerName(t, difference.remote.machine)
8055
- }) }),
8056
- difference.truncated && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncDiffTruncated") }),
8057
- difference.remoteTombstones.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncDiffTombstones", { count: difference.remoteTombstones.length }) }),
8058
- conflicts.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8059
- className: MnemonSettingsCard_module_css_default.syncDialogNote,
8060
- children: additions === 0 ? t("config.syncDiffNothing") : t("config.syncDiffClear")
8061
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8062
- className: MnemonSettingsCard_module_css_default.syncDialogNote,
8063
- children: t("config.syncDiffConflicts", { count: conflicts.length })
8064
- }),
8065
- conflicts.length === 0 && addable > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8066
- className: MnemonSettingsCard_module_css_default.syncDialogNote,
8067
- children: t("config.syncDiffAdditions", { count: addable })
8068
- }),
8069
- conflicts.length === 0 && heldBack > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8070
- className: MnemonSettingsCard_module_css_default.syncDialogNote,
8071
- children: t("config.syncDiffHeldBack", { count: heldBack })
8072
- }),
8073
- conflicts.length === 0 && onlyHere > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8074
- className: MnemonSettingsCard_module_css_default.syncDialogNote,
8075
- children: t("config.syncDiffLocalOnlyNote", { count: onlyHere })
8076
- }),
8077
- conflicts.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8078
- className: MnemonSettingsCard_module_css_default.syncConflictList,
8079
- children: conflicts.map((conflict) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8080
- className: MnemonSettingsCard_module_css_default.syncConflict,
8081
- "data-target": conflict.target,
8082
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t(conflict.target === "user" ? "review.targetUser" : "review.targetMemory") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: conflict.local.importance + " · " + Math.round(conflict.similarity * 100) + "%" })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8083
- className: MnemonSettingsCard_module_css_default.syncConflictSides,
8084
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncDiffHere") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: clip(conflict.local.content, 400) })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.syncDiffThere") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: clip(conflict.remote.content, 400) })] })]
8085
- })]
8086
- }, conflict.target + "\0" + conflict.local.content))
8087
- }),
8088
- conflicts.length === 0 && (addable > 0 || heldBack > 0) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8089
- className: MnemonSettingsCard_module_css_default.rowActions,
8090
- children: [addable > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8091
- variant: "primary",
8092
- size: "sm",
8093
- disabled: busy !== null || disabled,
8094
- onClick: () => void addRemote(),
8095
- children: busy === "add" ? t("config.syncDiffAdding") : t("config.syncDiffAdd")
8096
- }), heldBack > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8097
- variant: "outline",
8098
- size: "sm",
8099
- disabled: busy !== null || disabled,
8100
- onClick: () => void addRemote(true),
8101
- children: busy === "revive" ? t("config.syncDiffReviving") : t("config.syncDiffRevive")
8102
- })]
8103
- }),
8104
- conflicts.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8105
- className: MnemonSettingsCard_module_css_default.syncPlan,
8106
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8107
- className: MnemonSettingsCard_module_css_default.syncDialogNote,
8108
- children: t("config.syncPlanWhere")
8109
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8110
- className: MnemonSettingsCard_module_css_default.rowActions,
8111
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8112
- variant: "outline",
8113
- size: "sm",
8114
- onClick: goToReview,
8115
- children: t("config.syncPlanGo")
8116
- })
8117
- })]
8118
- })
8119
- ] })]
8120
- })]
8899
+ disabled: disabled || !ready || busy,
8900
+ onClick: () => void save(),
8901
+ children: busy ? t("config.syncSaving") : t("config.syncSave")
8902
+ }) })]
8121
8903
  })
8122
- }),
8123
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8124
- className: MnemonSettingsCard_module_css_default.syncFeedback,
8125
- "aria-live": "polite",
8126
- children: [
8127
- failed !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8128
- className: MnemonSettingsCard_module_css_default.error,
8129
- role: "alert",
8130
- children: t("config.syncFailed", { error: failed })
8131
- }),
8132
- notice !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8133
- className: MnemonSettingsCard_module_css_default.syncSuccess,
8134
- children: notice
8135
- }),
8136
- client === null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8137
- className: MnemonSettingsCard_module_css_default.readOnly,
8138
- children: t("config.syncUnavailable")
8139
- })
8140
- ]
8141
- })
8142
- ] })]
8904
+ ]
8905
+ })]
8143
8906
  });
8144
8907
  }
8145
8908
  //#endregion
@@ -8364,6 +9127,7 @@ window.__ModuleLoader__.load({
8364
9127
  ...props.sessionId === void 0 ? {} : { sessionId: props.sessionId },
8365
9128
  ...props.workspaceId === void 0 ? {} : { workspaceId: props.workspaceId },
8366
9129
  target: props.target,
9130
+ ...props.onDataChanged === void 0 ? {} : { onImported: props.onDataChanged },
8367
9131
  t
8368
9132
  }),
8369
9133
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MnemonSyncSection, {
@@ -8373,6 +9137,7 @@ window.__ModuleLoader__.load({
8373
9137
  disabled: props.disabled,
8374
9138
  enabled: sync.value,
8375
9139
  onEnabled: sync.set,
9140
+ ...props.onDataChanged === void 0 ? {} : { onMerged: props.onDataChanged },
8376
9141
  t
8377
9142
  }),
8378
9143
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WriteFailure, {
@@ -8384,6 +9149,7 @@ window.__ModuleLoader__.load({
8384
9149
  ...props.sessionId === void 0 ? {} : { sessionId: props.sessionId },
8385
9150
  ...props.workspaceId === void 0 ? {} : { workspaceId: props.workspaceId },
8386
9151
  disabled: props.disabled,
9152
+ ...props.onDataChanged === void 0 ? {} : { onApplied: props.onDataChanged },
8387
9153
  t
8388
9154
  })
8389
9155
  ]
@@ -8394,7 +9160,8 @@ window.__ModuleLoader__.load({
8394
9160
  //#region src/client/MnemonSettingsCard.tsx
8395
9161
  const NO_CHANGE_SIGNAL$1 = {
8396
9162
  subscribe: () => () => {},
8397
- getSnapshot: () => 0
9163
+ getSnapshot: () => 0,
9164
+ bump: () => {}
8398
9165
  };
8399
9166
  const NO_COMPONENT_LIST = {
8400
9167
  subscribe: () => () => {},
@@ -8590,7 +9357,8 @@ window.__ModuleLoader__.load({
8590
9357
  language,
8591
9358
  t,
8592
9359
  onOpen: (entry) => pages.open(entry.entryId, "configuration"),
8593
- onSaved: () => setTargetRevision((revision) => revision + 1)
9360
+ onSaved: () => setTargetRevision((revision) => revision + 1),
9361
+ onDataChanged: componentChanges.bump
8594
9362
  }),
8595
9363
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
8596
9364
  className: MnemonSettingsCard_module_css_default.section,
@@ -12945,7 +13713,7 @@ window.__ModuleLoader__.load({
12945
13713
  })
12946
13714
  });
12947
13715
  }
12948
- function MnemonWorkspace({ connection, settingsScope, sessionId, workspaceId, workspaceSelection, surface = "sidebar", active = true, onClose, configuration, componentChanges, sourcePageDirectory = EMPTY_SOURCE_PAGE_DIRECTORY, renderSlot }) {
13716
+ function MnemonWorkspace({ connection, settingsScope, sessionId, workspaceId, workspaceSelection, surface = "sidebar", active = true, titleBar = false, onClose, configuration, componentChanges, sourcePageDirectory = EMPTY_SOURCE_PAGE_DIRECTORY, renderSlot }) {
12949
13717
  const t = useT();
12950
13718
  const locale = useLocale();
12951
13719
  const configurationSeat = configuration ?? NO_ACTION_SEAT;
@@ -13475,6 +14243,7 @@ window.__ModuleLoader__.load({
13475
14243
  children: [
13476
14244
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", {
13477
14245
  className: appearanceClass(MnemonView_module_css_default.masthead, MnemonSidebarView_module_css_default.masthead),
14246
+ "data-window-drag": titleBar || void 0,
13478
14247
  children: [
13479
14248
  onClose !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
13480
14249
  type: "button",
@@ -13643,7 +14412,7 @@ window.__ModuleLoader__.load({
13643
14412
  }
13644
14413
  //#endregion
13645
14414
  //#region \0dsh-mnemon-css:/home/runner/work/dsh-mnemon/dsh-mnemon/src/client/MnemonWorkspace.module.css.mjs
13646
- const css = ".NS3bAW_workspacePanel{box-sizing:border-box;background:var(--dsw-alias-bg-overlay,var(--dsw-alias-bg-base));pointer-events:auto;min-width:0;min-height:0;display:flex;position:fixed;overflow:hidden}.NS3bAW_workspacePanel>*{flex:auto;width:100%;min-width:0}.NS3bAW_betterSidebarSeat,.NS3bAW_nativeWorkspace{flex:auto;width:100%;min-width:0;height:100%;min-height:0;display:flex;overflow:hidden}.NS3bAW_betterSidebarSeat>*,.NS3bAW_nativeWorkspace>*{flex:auto;min-width:0}.NS3bAW_nativeWorkspace{z-index:2;position:relative}.NS3bAW_nativeWorkspace[data-dsh-mnemon-main-seat]{box-sizing:border-box;padding-block-start:var(--dsh-frame-top-clearance,0px)}.NS3bAW_nativeWorkspace[hidden]{display:none}.NS3bAW_entry{box-sizing:border-box;border-radius:var(--dsw-radius-md);width:calc(100% - 4px);min-height:36px;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;white-space:nowrap;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;margin:0 2px;padding:7px 8px;line-height:22px;display:flex}.NS3bAW_entry:hover,.NS3bAW_entry[data-active]{background:var(--dsw-alias-interactive-bg-hover)}.NS3bAW_entry:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.NS3bAW_entryIcon{flex:none;justify-content:center;align-items:center;display:inline-flex}.NS3bAW_entryIcon svg{width:16px;height:16px;display:block}.NS3bAW_entryLabel{text-overflow:ellipsis;min-width:0;overflow:hidden}[data-sidebar-collapsed] .NS3bAW_entry{justify-content:center;width:36px;height:36px;min-height:36px;margin:0 auto 12px;padding:0}[data-sidebar-collapsed] .NS3bAW_entryIcon svg{width:18px;height:18px}[data-sidebar-collapsed] .NS3bAW_entryLabel{display:none}";
14415
+ const css = ".NS3bAW_workspacePanel{box-sizing:border-box;background:var(--dsw-alias-bg-overlay,var(--dsw-alias-bg-base));pointer-events:auto;min-width:0;min-height:0;display:flex;position:fixed;overflow:hidden}.NS3bAW_workspacePanel>*{flex:auto;width:100%;min-width:0}.NS3bAW_betterSidebarSeat,.NS3bAW_nativeWorkspace{flex:auto;width:100%;min-width:0;height:100%;min-height:0;display:flex;overflow:hidden}.NS3bAW_betterSidebarSeat>*,.NS3bAW_nativeWorkspace>*{flex:auto;min-width:0}.NS3bAW_nativeWorkspace{z-index:2;position:relative}.NS3bAW_nativeWorkspace[data-dsh-mnemon-main-seat]{box-sizing:border-box;padding-block-start:var(--dsh-frame-top-clearance,0px)}.NS3bAW_windowDragBand{height:var(--dsh-frame-top-clearance,0px);position:absolute;inset:0 0 auto}.NS3bAW_nativeWorkspace[hidden]{display:none}.NS3bAW_entry{box-sizing:border-box;border-radius:var(--dsw-radius-md);width:calc(100% - 4px);min-height:36px;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;white-space:nowrap;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;margin:0 2px;padding:7px 8px;line-height:22px;display:flex}.NS3bAW_entry:hover,.NS3bAW_entry[data-active]{background:var(--dsw-alias-interactive-bg-hover)}.NS3bAW_entry:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.NS3bAW_entryIcon{flex:none;justify-content:center;align-items:center;display:inline-flex}.NS3bAW_entryIcon svg{width:16px;height:16px;display:block}.NS3bAW_entryLabel{text-overflow:ellipsis;min-width:0;overflow:hidden}[data-sidebar-collapsed] .NS3bAW_entry{justify-content:center;width:36px;height:36px;min-height:36px;margin:0 auto 12px;padding:0}[data-sidebar-collapsed] .NS3bAW_entryIcon svg{width:18px;height:18px}[data-sidebar-collapsed] .NS3bAW_entryLabel{display:none}";
13647
14416
  const tagId = "dsh-mnemon/src/client/MnemonWorkspace.module.css";
13648
14417
  if (typeof document !== "undefined") {
13649
14418
  let tag = document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]");
@@ -13660,6 +14429,7 @@ window.__ModuleLoader__.load({
13660
14429
  "entryIcon": "NS3bAW_entryIcon",
13661
14430
  "entryLabel": "NS3bAW_entryLabel",
13662
14431
  "nativeWorkspace": "NS3bAW_nativeWorkspace",
14432
+ "windowDragBand": "NS3bAW_windowDragBand",
13663
14433
  "workspacePanel": "NS3bAW_workspacePanel"
13664
14434
  };
13665
14435
  //#endregion
@@ -13881,6 +14651,7 @@ window.__ModuleLoader__.load({
13881
14651
  ...resolvedSelectedId === void 0 ? {} : { workspaceId: resolvedSelectedId },
13882
14652
  workspaceSelection: selection,
13883
14653
  active: props.active ?? true,
14654
+ titleBar: props.titleBar === true,
13884
14655
  t: props.t,
13885
14656
  locale: locale.active,
13886
14657
  sourcePageDirectory: props.sourcePageDirectory,
@@ -13995,7 +14766,8 @@ window.__ModuleLoader__.load({
13995
14766
  "aria-label": props.t("tab.label"),
13996
14767
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MnemonWorkspaceHost, {
13997
14768
  ...props,
13998
- active: state.open
14769
+ active: state.open,
14770
+ titleBar: true
13999
14771
  })
14000
14772
  }), nativeSidebar.target),
14001
14773
  !nativeSidebar?.available && bounds !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("section", {
@@ -14136,7 +14908,12 @@ window.__ModuleLoader__.load({
14136
14908
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
14137
14909
  ref: parent,
14138
14910
  className: MnemonWorkspace_module_css_default.nativeWorkspace,
14139
- "data-dsh-mnemon-main-seat": true
14911
+ "data-dsh-mnemon-main-seat": true,
14912
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
14913
+ className: MnemonWorkspace_module_css_default.windowDragBand,
14914
+ "data-window-drag": true,
14915
+ "aria-hidden": "true"
14916
+ })
14140
14917
  });
14141
14918
  }
14142
14919
  /** Use the published panel contract, with a fallback for replacement layouts. */