dsh-mnemon 0.5.24 → 0.5.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/README.zh-CN.md +2 -1
- package/lib/bundle.js +1 -1
- package/lib/client.js +2564 -116
- package/lib/index.js +4451 -270
- package/lib/{starter-resolution-DFLhgaoL.js → starter-resolution-BjfPGF8R.js} +5 -5
- package/lib/starter.js +1 -1
- package/lib/types/src/client/locales.d.ts +209 -0
- package/lib/types/src/client/page-controls.d.ts +1 -0
- package/lib/types/src/host/protocol.d.ts +487 -1
- package/package.json +7 -6
package/lib/client.js
CHANGED
|
@@ -29,7 +29,14 @@ window.__ModuleLoader__.load({
|
|
|
29
29
|
const MNEMON_ACTIVATION_CHANNEL = "/dsh-mnemon-activation";
|
|
30
30
|
const MNEMON_WRITE_CHANNEL = "/dsh-mnemon-write";
|
|
31
31
|
const MNEMON_PACK_CHANNEL = "/dsh-mnemon-pack";
|
|
32
|
+
const MNEMON_SYNC_CHANNEL = "/dsh-mnemon-sync";
|
|
32
33
|
const MNEMON_SETTINGS_CHANNEL = "/dsh-mnemon-settings";
|
|
34
|
+
/**
|
|
35
|
+
* Reconciliation is the only channel that changes memory after a human read it:
|
|
36
|
+
* it stages proposals into a review ledger, takes opinions, and applies an
|
|
37
|
+
* accepted entry. It is deliberately separate from the write channel.
|
|
38
|
+
*/
|
|
39
|
+
const MNEMON_REVIEW_CHANNEL = "/dsh-mnemon-review";
|
|
33
40
|
/** DSH API Gateway endpoints used by paired remote Web clients. */
|
|
34
41
|
const MNEMON_REMOTE_CHANNEL = "/api";
|
|
35
42
|
const MNEMON_REMOTE_NAMESPACE = "dshMnemon";
|
|
@@ -37,9 +44,11 @@ window.__ModuleLoader__.load({
|
|
|
37
44
|
const MNEMON_REMOTE_ACTIVATION_ENDPOINT = `${MNEMON_REMOTE_NAMESPACE}/activation`;
|
|
38
45
|
const MNEMON_REMOTE_WRITE_ENDPOINT = `${MNEMON_REMOTE_NAMESPACE}/write`;
|
|
39
46
|
const MNEMON_REMOTE_PACK_ENDPOINT = `${MNEMON_REMOTE_NAMESPACE}/pack`;
|
|
47
|
+
const MNEMON_REMOTE_SYNC_ENDPOINT = `${MNEMON_REMOTE_NAMESPACE}/sync`;
|
|
40
48
|
const MNEMON_REMOTE_SETTINGS_ENDPOINT = `${MNEMON_REMOTE_NAMESPACE}/settings`;
|
|
41
49
|
const MNEMON_REMOTE_VIEW_ENDPOINT = `${MNEMON_REMOTE_NAMESPACE}/view`;
|
|
42
50
|
const MNEMON_REMOTE_VIEW_WRITE_ENDPOINT = `${MNEMON_REMOTE_NAMESPACE}/viewWrite`;
|
|
51
|
+
const MNEMON_REMOTE_REVIEW_ENDPOINT = `${MNEMON_REMOTE_NAMESPACE}/review`;
|
|
43
52
|
const MNEMON_SETTINGS_NAMESPACE = "mnemon";
|
|
44
53
|
const MNEMON_UI_SETTINGS_NAMESPACE = "mnemon-ui";
|
|
45
54
|
function isWorkspaceStorageScope(scope) {
|
|
@@ -158,6 +167,8 @@ window.__ModuleLoader__.load({
|
|
|
158
167
|
[MNEMON_ACTIVATION_CHANNEL, MNEMON_REMOTE_ACTIVATION_ENDPOINT],
|
|
159
168
|
[MNEMON_WRITE_CHANNEL, MNEMON_REMOTE_WRITE_ENDPOINT],
|
|
160
169
|
[MNEMON_PACK_CHANNEL, MNEMON_REMOTE_PACK_ENDPOINT],
|
|
170
|
+
[MNEMON_SYNC_CHANNEL, MNEMON_REMOTE_SYNC_ENDPOINT],
|
|
171
|
+
[MNEMON_REVIEW_CHANNEL, MNEMON_REMOTE_REVIEW_ENDPOINT],
|
|
161
172
|
[MNEMON_SETTINGS_CHANNEL, MNEMON_REMOTE_SETTINGS_ENDPOINT],
|
|
162
173
|
[MNEMON_VIEW_CHANNEL, MNEMON_REMOTE_VIEW_ENDPOINT],
|
|
163
174
|
[MNEMON_VIEW_WRITE_CHANNEL, MNEMON_REMOTE_VIEW_WRITE_ENDPOINT]
|
|
@@ -364,6 +375,102 @@ window.__ModuleLoader__.load({
|
|
|
364
375
|
importPack(base64) {
|
|
365
376
|
return this.call(MNEMON_PACK_CHANNEL, "import", this.scoped({ base64 }));
|
|
366
377
|
}
|
|
378
|
+
/** Every reconciliation proposal this machine still holds. */
|
|
379
|
+
reviewLedger() {
|
|
380
|
+
return this.call(MNEMON_REVIEW_CHANNEL, "view", {});
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* One reconciliation run: it stages a proposal and writes no memory. Guidance is what
|
|
384
|
+
* the reviewer wants the plan to accomplish, in their own words; blank means the plan
|
|
385
|
+
* reads the memory and the branch with no instruction beyond its own rules.
|
|
386
|
+
*/
|
|
387
|
+
reconcile(guidance) {
|
|
388
|
+
const text = guidance?.trim() ?? "";
|
|
389
|
+
return this.call(MNEMON_REVIEW_CHANNEL, "reconcile", this.scoped(text === "" ? {} : { guidance: text }));
|
|
390
|
+
}
|
|
391
|
+
reviewOpinion(id, text, author = "user") {
|
|
392
|
+
return this.call(MNEMON_REVIEW_CHANNEL, "opinion", {
|
|
393
|
+
id,
|
|
394
|
+
text,
|
|
395
|
+
author
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
decideReview(id, status) {
|
|
399
|
+
return this.call(MNEMON_REVIEW_CHANNEL, "decide", {
|
|
400
|
+
id,
|
|
401
|
+
status
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
reopenReview(id) {
|
|
405
|
+
return this.call(MNEMON_REVIEW_CHANNEL, "reopen", { id });
|
|
406
|
+
}
|
|
407
|
+
/** Applying a subset leaves the rest in the entry, which stays accepted. */
|
|
408
|
+
applyReview(id, operations) {
|
|
409
|
+
return this.call(MNEMON_REVIEW_CHANNEL, "apply", this.scoped({
|
|
410
|
+
id,
|
|
411
|
+
...operations === void 0 ? {} : { operations }
|
|
412
|
+
}));
|
|
413
|
+
}
|
|
414
|
+
syncStatus() {
|
|
415
|
+
return this.call(MNEMON_SYNC_CHANNEL, "status", this.scoped());
|
|
416
|
+
}
|
|
417
|
+
/** Saves a patch; the answer never carries the token back. */
|
|
418
|
+
configureSync(patch) {
|
|
419
|
+
return this.call(MNEMON_SYNC_CHANNEL, "configure", this.scoped(patch));
|
|
420
|
+
}
|
|
421
|
+
pushSync(message) {
|
|
422
|
+
return this.call(MNEMON_SYNC_CHANNEL, "push", this.scoped({
|
|
423
|
+
...message === void 0 ? {} : { message },
|
|
424
|
+
confirmed: true
|
|
425
|
+
}));
|
|
426
|
+
}
|
|
427
|
+
previewSync() {
|
|
428
|
+
return this.call(MNEMON_SYNC_CHANNEL, "preview", this.scoped());
|
|
429
|
+
}
|
|
430
|
+
/** The commits on the branch that carry a payload, newest first. */
|
|
431
|
+
syncBackups(limit) {
|
|
432
|
+
return this.call(MNEMON_SYNC_CHANNEL, "backups", this.scoped(limit === void 0 ? {} : { limit }));
|
|
433
|
+
}
|
|
434
|
+
/** Which memories are only here and which are only on the branch. */
|
|
435
|
+
syncDiff() {
|
|
436
|
+
return this.call(MNEMON_SYNC_CHANNEL, "diff", this.scoped());
|
|
437
|
+
}
|
|
438
|
+
pullSync(components, revive) {
|
|
439
|
+
return this.call(MNEMON_SYNC_CHANNEL, "pull", this.scoped({
|
|
440
|
+
...components === void 0 ? {} : { components },
|
|
441
|
+
...revive === true ? { revive: true } : {},
|
|
442
|
+
confirmed: true
|
|
443
|
+
}));
|
|
444
|
+
}
|
|
445
|
+
/** Whether GitHub sign-in is possible here, and how far it has come. */
|
|
446
|
+
githubStatus() {
|
|
447
|
+
return this.call(MNEMON_SYNC_CHANNEL, "github-status", this.scoped());
|
|
448
|
+
}
|
|
449
|
+
/** Ask GitHub for the code the user types into the browser. */
|
|
450
|
+
githubStart() {
|
|
451
|
+
return this.call(MNEMON_SYNC_CHANNEL, "github-start", this.scoped());
|
|
452
|
+
}
|
|
453
|
+
/** Ask once whether the browser step happened; the Host keeps the cadence. */
|
|
454
|
+
githubPoll() {
|
|
455
|
+
return this.call(MNEMON_SYNC_CHANNEL, "github-poll", this.scoped());
|
|
456
|
+
}
|
|
457
|
+
githubCancel() {
|
|
458
|
+
return this.call(MNEMON_SYNC_CHANNEL, "github-cancel", this.scoped());
|
|
459
|
+
}
|
|
460
|
+
/** Forgets the stored grant; the next push asks for a sign-in again. */
|
|
461
|
+
githubSignOut() {
|
|
462
|
+
return this.call(MNEMON_SYNC_CHANNEL, "github-signout", this.scoped());
|
|
463
|
+
}
|
|
464
|
+
githubRepositories() {
|
|
465
|
+
return this.call(MNEMON_SYNC_CHANNEL, "github-repositories", this.scoped());
|
|
466
|
+
}
|
|
467
|
+
/** Creates a repository under the signed-in account and answers with it. */
|
|
468
|
+
githubCreateRepository(name, isPrivate) {
|
|
469
|
+
return this.call(MNEMON_SYNC_CHANNEL, "github-create", this.scoped({
|
|
470
|
+
name,
|
|
471
|
+
private: isPrivate
|
|
472
|
+
}));
|
|
473
|
+
}
|
|
367
474
|
};
|
|
368
475
|
//#endregion
|
|
369
476
|
//#region src/client/component-copy.ts
|
|
@@ -555,7 +662,7 @@ window.__ModuleLoader__.load({
|
|
|
555
662
|
}
|
|
556
663
|
//#endregion
|
|
557
664
|
//#region \0dsh-mnemon-css:/home/runner/work/dsh-mnemon/dsh-mnemon/src/client/MnemonSettingsCard.module.css.mjs
|
|
558
|
-
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_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_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}}";
|
|
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}}";
|
|
559
666
|
const tagId$13 = "dsh-mnemon/src/client/MnemonSettingsCard.module.css";
|
|
560
667
|
if (typeof document !== "undefined") {
|
|
561
668
|
let tag = document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$13) + "]");
|
|
@@ -674,6 +781,16 @@ window.__ModuleLoader__.load({
|
|
|
674
781
|
"providerToggle": "_v_wrq_providerToggle",
|
|
675
782
|
"providerToggleError": "_v_wrq_providerToggleError",
|
|
676
783
|
"readOnlyNotice": "_v_wrq_readOnlyNotice",
|
|
784
|
+
"reviewEntry": "_v_wrq_reviewEntry",
|
|
785
|
+
"reviewGuidance": "_v_wrq_reviewGuidance",
|
|
786
|
+
"reviewList": "_v_wrq_reviewList",
|
|
787
|
+
"reviewOperations": "_v_wrq_reviewOperations",
|
|
788
|
+
"reviewOpinionForm": "_v_wrq_reviewOpinionForm",
|
|
789
|
+
"reviewOpinions": "_v_wrq_reviewOpinions",
|
|
790
|
+
"reviewRules": "_v_wrq_reviewRules",
|
|
791
|
+
"reviewSelected": "_v_wrq_reviewSelected",
|
|
792
|
+
"reviewSelection": "_v_wrq_reviewSelection",
|
|
793
|
+
"reviewTitle": "_v_wrq_reviewTitle",
|
|
677
794
|
"rowActions": "_v_wrq_rowActions",
|
|
678
795
|
"rowDetail": "_v_wrq_rowDetail",
|
|
679
796
|
"rowNote": "_v_wrq_rowNote",
|
|
@@ -690,6 +807,31 @@ window.__ModuleLoader__.load({
|
|
|
690
807
|
"settings-spin": "_v_wrq_settings-spin",
|
|
691
808
|
"surface": "_v_wrq_surface",
|
|
692
809
|
"switch": "_v_wrq_switch",
|
|
810
|
+
"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",
|
|
818
|
+
"syncCode": "_v_wrq_syncCode",
|
|
819
|
+
"syncConflict": "_v_wrq_syncConflict",
|
|
820
|
+
"syncConflictList": "_v_wrq_syncConflictList",
|
|
821
|
+
"syncConflictSides": "_v_wrq_syncConflictSides",
|
|
822
|
+
"syncDialogBody": "_v_wrq_syncDialogBody",
|
|
823
|
+
"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
|
+
"syncRow": "_v_wrq_syncRow",
|
|
833
|
+
"syncState": "_v_wrq_syncState",
|
|
834
|
+
"syncSuccess": "_v_wrq_syncSuccess",
|
|
693
835
|
"toggleRow": "_v_wrq_toggleRow",
|
|
694
836
|
"visuallyHidden": "_v_wrq_visuallyHidden",
|
|
695
837
|
"warning": "_v_wrq_warning"
|
|
@@ -739,6 +881,7 @@ window.__ModuleLoader__.load({
|
|
|
739
881
|
"runtime.result.remove": "已从{target}移除 · 当前 {count} 条",
|
|
740
882
|
"runtime.result.maintenance": "容量整理完成:已先归档到记忆空间 {spaces},再更新{target} · 当前 {count} 条",
|
|
741
883
|
"runtime.result.localCompaction": "本地画像整理完成:未写入记忆空间,已更新{target} · 当前 {count} 条",
|
|
884
|
+
"runtime.result.localArchive": "容量整理完成:没有可写的记忆空间,已先把 {archived} 条移入本地归档,再更新{target} · 当前 {count} 条",
|
|
742
885
|
"runtime.readOnly": "当前为只读模式;运行时记忆仍会进入上下文,但不能在此修改。",
|
|
743
886
|
"runtime.footnote": "memories.json 是唯一事实源;两个 Markdown 文件由控制层生成,不应直接编辑。"
|
|
744
887
|
};
|
|
@@ -785,6 +928,7 @@ window.__ModuleLoader__.load({
|
|
|
785
928
|
"runtime.result.remove": "Removed from {target} · {count} entries",
|
|
786
929
|
"runtime.result.maintenance": "Capacity maintenance complete: archived to {spaces}, then updated {target} · {count} entries",
|
|
787
930
|
"runtime.result.localCompaction": "Local profile compaction complete: no Memory Space write; updated {target} · {count} entries",
|
|
931
|
+
"runtime.result.localArchive": "Capacity maintenance complete: with no Memory Space to write to, moved {archived} entries to the local archive, then updated {target} · {count} entries",
|
|
788
932
|
"runtime.readOnly": "Read only here: runtime memory still enters context but cannot be changed on this page.",
|
|
789
933
|
"runtime.footnote": "memories.json is the only source of truth. The control plane generates both Markdown files; do not edit them directly."
|
|
790
934
|
};
|
|
@@ -824,6 +968,7 @@ window.__ModuleLoader__.load({
|
|
|
824
968
|
"documents.updated": "已保存新的档案修订。",
|
|
825
969
|
"documents.updatedAfterArchive": "已先迁移 {count} 份旧档案,再保存修订。",
|
|
826
970
|
"documents.archived": "已建立 Mnemon 冷索引并归档;关联记忆空间:{spaces}",
|
|
971
|
+
"documents.archivedLocally": "已归档到本地:原文移入归档目录,没有建立 Mnemon 冷索引。",
|
|
827
972
|
"documents.list": "项目档案列表",
|
|
828
973
|
"documents.activeList": "活跃目录",
|
|
829
974
|
"documents.archiveList": "归档目录",
|
|
@@ -843,11 +988,12 @@ window.__ModuleLoader__.load({
|
|
|
843
988
|
"documents.hash": "内容哈希",
|
|
844
989
|
"documents.size": "文件大小",
|
|
845
990
|
"documents.archiveReceipt": "Mnemon 冷索引回执",
|
|
991
|
+
"documents.archiveNote": "归档说明",
|
|
846
992
|
"documents.archiveTitle": "迁入归档",
|
|
847
|
-
"documents.archiveDescription": "独立任务 Agent 先拟定摘要和目标空间;Host
|
|
993
|
+
"documents.archiveDescription": "独立任务 Agent 先拟定摘要和目标空间;Host 校验后写入冷索引,再移动原文。没有已启用且支持精确写入与删除的记忆空间时,原文直接移入本地归档,不建立索引。",
|
|
848
994
|
"documents.archive": "归档",
|
|
849
|
-
"documents.archiveConfirm": "
|
|
850
|
-
"documents.archiving": "
|
|
995
|
+
"documents.archiveConfirm": "确认归档这份档案?",
|
|
996
|
+
"documents.archiving": "归档中…",
|
|
851
997
|
"documents.archiveNow": "确认归档",
|
|
852
998
|
"documents.footnote": "`.mnemon/documents/index.json` 是控制面事实源;active 总量固定不超过 10 MB,archived 不计入上限,项目源文件不会被修改。"
|
|
853
999
|
};
|
|
@@ -885,6 +1031,7 @@ window.__ModuleLoader__.load({
|
|
|
885
1031
|
"documents.updated": "New document revision saved.",
|
|
886
1032
|
"documents.updatedAfterArchive": "Archived {count} older document(s), then saved the revision.",
|
|
887
1033
|
"documents.archived": "Mnemon cold index created and document archived; Memory Spaces: {spaces}",
|
|
1034
|
+
"documents.archivedLocally": "Archived locally: the original moved to the archive, without a Mnemon cold index.",
|
|
888
1035
|
"documents.list": "Project document list",
|
|
889
1036
|
"documents.activeList": "Active directory",
|
|
890
1037
|
"documents.archiveList": "Archive directory",
|
|
@@ -904,11 +1051,12 @@ window.__ModuleLoader__.load({
|
|
|
904
1051
|
"documents.hash": "Content hash",
|
|
905
1052
|
"documents.size": "File size",
|
|
906
1053
|
"documents.archiveReceipt": "Mnemon cold-index receipt",
|
|
1054
|
+
"documents.archiveNote": "Archive note",
|
|
907
1055
|
"documents.archiveTitle": "Move to archive",
|
|
908
|
-
"documents.archiveDescription": "An independent task Agent proposes a summary and destination. The Host validates and writes the cold index before moving the original.
|
|
1056
|
+
"documents.archiveDescription": "An independent task Agent proposes a summary and destination. The Host validates and writes the cold index before moving the original. Without an active Memory Space that has exact writes and safe deletion, the original moves to the local archive without an index.",
|
|
909
1057
|
"documents.archive": "Archive",
|
|
910
|
-
"documents.archiveConfirm": "
|
|
911
|
-
"documents.archiving": "
|
|
1058
|
+
"documents.archiveConfirm": "Archive this document?",
|
|
1059
|
+
"documents.archiving": "Archiving…",
|
|
912
1060
|
"documents.archiveNow": "Confirm archive",
|
|
913
1061
|
"documents.footnote": "`.mnemon/documents/index.json` is the control-plane source of truth. active stays at or below 10 MB, archived is excluded, and project source files are never modified."
|
|
914
1062
|
};
|
|
@@ -1739,6 +1887,7 @@ window.__ModuleLoader__.load({
|
|
|
1739
1887
|
"receipt.unfinished": "未完成",
|
|
1740
1888
|
"receipt.failed": "失败",
|
|
1741
1889
|
"receipt.view": "在记忆空间中查看",
|
|
1890
|
+
"receipt.viewRuntime": "在运行时记忆中查看",
|
|
1742
1891
|
"taskAgent.ready": "任务 Agent 就绪",
|
|
1743
1892
|
"taskAgent.unavailable": "任务 Agent 不可用",
|
|
1744
1893
|
"saveAction.button": "存入记忆",
|
|
@@ -1753,6 +1902,31 @@ window.__ModuleLoader__.load({
|
|
|
1753
1902
|
"saveAction.submitting": "任务 Agent 处理中…",
|
|
1754
1903
|
"saveAction.readOnly": "当前部署为只读模式,无法写入记忆。",
|
|
1755
1904
|
"saveAction.close": "关闭",
|
|
1905
|
+
"saveAction.hintDirect": "文本直接写入所选位置,不经过任务 Agent。",
|
|
1906
|
+
"saveAction.to": "保存到",
|
|
1907
|
+
"saveAction.to.agent": "由 Agent 决定",
|
|
1908
|
+
"saveAction.to.agentDetail": "任务 Agent 判断是否值得保存,并选择记忆空间",
|
|
1909
|
+
"saveAction.to.memory": "工作记忆(MEMORY.md)",
|
|
1910
|
+
"saveAction.to.user": "用户画像(USER.md)",
|
|
1911
|
+
"saveAction.to.space": "记忆空间 · {provider}",
|
|
1912
|
+
"saveAction.save": "保存",
|
|
1913
|
+
"saveAction.saving": "保存中…",
|
|
1914
|
+
"saveAction.saved.runtime": "已存入{target} · 当前 {count} 条",
|
|
1915
|
+
"saveAction.saved.runtimeMaintained": "已整理容量并存入{target} · 当前 {count} 条",
|
|
1916
|
+
"saveAction.saved.space": "已存入记忆空间“{space}”",
|
|
1917
|
+
"saveAction.saved.spacePending": "已提交到记忆空间“{space}”,由 Provider 稍后确认",
|
|
1918
|
+
"saveAction.saved.spaceOther": "记忆空间“{space}”返回:{action}",
|
|
1919
|
+
"saveAction.saved.duplicate": "内容已存在,没有重复写入。",
|
|
1920
|
+
"saveAction.unavailable": "这个位置当前不可写。",
|
|
1921
|
+
"saveAction.place.delimiter": "{target}的条目不能包含 §;删去后即可保存。",
|
|
1922
|
+
"saveAction.place.tooLong": "这段文本约 {size},超过{target}单条上限 {limit};请删减。",
|
|
1923
|
+
"saveAction.place.orAgent": "也可以交给 Agent 决定。",
|
|
1924
|
+
"saveAction.place.full": "{target}已用 {used} / {limit}。保存前需要先整理容量:已有条目只保留约 {keep},其余移出工作记忆。",
|
|
1925
|
+
"saveAction.place.fullAll": "{target}已用 {used} / {limit}。保存前需要先整理容量:已有条目将全部移出工作记忆。",
|
|
1926
|
+
"saveAction.place.userCondense": "用户画像已用 {used} / {limit}。保存前,任务 Agent 会把已有内容压缩到约 {keep} 以内,不留存档。",
|
|
1927
|
+
"saveAction.place.userTooLong": "这段文本约 {size},整理后的用户画像最多只能放下 {max};请删减。",
|
|
1928
|
+
"saveAction.place.userFull": "用户画像已满,整理它需要任务 Agent;请先在运行时记忆中删减条目,或换一个位置。",
|
|
1929
|
+
"saveAction.noPlace": "现在没有可以写入的位置。",
|
|
1756
1930
|
"readSources.all": "全部 Provider",
|
|
1757
1931
|
"readSources.mode.search": "原生检索",
|
|
1758
1932
|
"readSources.mode.graph": "真实关系图",
|
|
@@ -2212,7 +2386,7 @@ window.__ModuleLoader__.load({
|
|
|
2212
2386
|
"config.interactionTurnBar": "回合记忆栏",
|
|
2213
2387
|
"config.interactionTurnBarHint": "每轮回复下方显示本轮的召回与写入",
|
|
2214
2388
|
"config.interactionSaveAction": "存入记忆按钮",
|
|
2215
|
-
"config.interactionSaveActionHint": "
|
|
2389
|
+
"config.interactionSaveActionHint": "在回复旁手动存入,确认后写入你选择的位置",
|
|
2216
2390
|
"config.packTitle": "备份与迁移",
|
|
2217
2391
|
"config.packUnavailable": "当前 DSH 主机不支持 Mnemon ZIP 备份通道。",
|
|
2218
2392
|
"config.packExporting": "导出中…",
|
|
@@ -2227,7 +2401,187 @@ window.__ModuleLoader__.load({
|
|
|
2227
2401
|
"config.packUnnamedZip": "Mnemon 备份.zip",
|
|
2228
2402
|
"config.packZipReady": "校验通过 · {components} 个组件 · {items} 项 · {size}",
|
|
2229
2403
|
"config.packImportZipAction": "安全导入",
|
|
2230
|
-
"config.packImportedWhole": "已将 ZIP 安全合并到 {root}。"
|
|
2404
|
+
"config.packImportedWhole": "已将 ZIP 安全合并到 {root}。",
|
|
2405
|
+
"config.syncTitle": "Git 同步",
|
|
2406
|
+
"config.syncSimpleDescription": "把上述组件的数据同步到 Git 仓库;不含第三方 Provider 与密钥",
|
|
2407
|
+
"config.syncLoading": "正在读取同步状态…",
|
|
2408
|
+
"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": "到“记忆整理”处理",
|
|
2467
|
+
"config.syncRepoUrl": "仓库地址",
|
|
2468
|
+
"config.syncRepoUrlHint": "HTTPS、SSH 或本机绝对路径;不要把令牌写进地址",
|
|
2469
|
+
"config.syncBranch": "分支",
|
|
2470
|
+
"config.syncBranchHint": "默认 {branch}",
|
|
2471
|
+
"config.syncSubdir": "远端目录",
|
|
2472
|
+
"config.syncSubdirHint": "仓库内存放 payload 的目录,默认 {subdir}",
|
|
2473
|
+
"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 主机没有可用的凭据存储,请改用访问令牌",
|
|
2496
|
+
"config.syncGitHubReadOnly": "当前凭据存储只读,登录无法保存",
|
|
2497
|
+
"config.syncGitHubSignIn": "使用 GitHub 登录",
|
|
2498
|
+
"config.syncGitHubStarting": "获取设备码…",
|
|
2499
|
+
"config.syncGitHubCode": "在 GitHub 输入此设备码:",
|
|
2500
|
+
"config.syncGitHubCopy": "复制",
|
|
2501
|
+
"config.syncGitHubCopied": "已复制",
|
|
2502
|
+
"config.syncGitHubOpen": "打开 GitHub 授权页",
|
|
2503
|
+
"config.syncGitHubWaiting": "等待授权…完成后会自动继续",
|
|
2504
|
+
"config.syncGitHubSignedIn": "已登录 @{login}",
|
|
2505
|
+
"config.syncGitHubSignOut": "退出登录",
|
|
2506
|
+
"config.syncGitHubFailed": "GitHub 登录失败:{error}",
|
|
2507
|
+
"config.syncGitHubExpired": "设备码已过期,请重新登录",
|
|
2508
|
+
"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": "新建并选用",
|
|
2524
|
+
"config.syncRepositoryCreating": "创建中…",
|
|
2525
|
+
"config.syncRepositoryCreated": "已新建 {name}。",
|
|
2526
|
+
"config.reconcileTitle": "记忆整理",
|
|
2527
|
+
"config.reconcileDescription": "模型读合并后的记忆,只提出建议,等你审查后才写入",
|
|
2528
|
+
"review.rulesTitle": "运行规则",
|
|
2529
|
+
"review.rulesPull": "后台拉取:后台只按「Git 同步」里「自动备份」的间隔推送一次,推送前先读取远端分支并与本机合并;这一步不产生任何建议。自动备份关闭时,只有你点「推送」才会读取远端。",
|
|
2530
|
+
"review.rulesDiff": "差异:只有点「检查远端」或推送前的合并才会读出远端与本机的差别;差别只显示出来,不会自动写入。",
|
|
2531
|
+
"review.rulesPlan": "方案:只有点「整理记忆」才会生成待办方案,每条方案都要你接受并应用之后才会真正写入记忆。",
|
|
2532
|
+
"review.reconcile": "整理记忆",
|
|
2533
|
+
"review.reconciling": "整理中…",
|
|
2534
|
+
"review.refresh": "刷新",
|
|
2535
|
+
"review.empty": "没有待审查的建议",
|
|
2536
|
+
"review.pending": "{count} 条待审查",
|
|
2537
|
+
"review.failed": "读取审查记录失败:{error}",
|
|
2538
|
+
"review.planned": "已生成 {operations} 条建议,接受后才会写入。",
|
|
2539
|
+
"review.none": "模型认为当前记忆无需改动。",
|
|
2540
|
+
"review.statusPending": "待审查",
|
|
2541
|
+
"review.statusAccepted": "已接受",
|
|
2542
|
+
"review.statusRejected": "已拒绝",
|
|
2543
|
+
"review.expand": "查看",
|
|
2544
|
+
"review.collapse": "收起",
|
|
2545
|
+
"review.accept": "接受",
|
|
2546
|
+
"review.reject": "拒绝",
|
|
2547
|
+
"review.apply": "执行",
|
|
2548
|
+
"review.applying": "执行中…",
|
|
2549
|
+
"review.reopen": "重新打开",
|
|
2550
|
+
"review.applied": "已执行 {count} 条改动。",
|
|
2551
|
+
"review.appliedAt": "执行于 {time}",
|
|
2552
|
+
"review.appliedCount": "已执行 {count}/{total} 条",
|
|
2553
|
+
"review.applyFailed": "执行失败:{error}",
|
|
2554
|
+
"review.meta": "{count} 条改动 · 来自 {machine} · {time}",
|
|
2555
|
+
"review.foreign": "涉及其他机器的记忆:{machines}",
|
|
2556
|
+
"review.opinions": "意见",
|
|
2557
|
+
"review.noOpinions": "还没有意见",
|
|
2558
|
+
"review.authorUser": "你",
|
|
2559
|
+
"review.authorAgent": "模型",
|
|
2560
|
+
"review.opinionPlaceholder": "写下你的意见,下次整理会读到",
|
|
2561
|
+
"review.opinionSend": "提交意见",
|
|
2562
|
+
"review.opinionAdded": "已记录你的意见。",
|
|
2563
|
+
"review.opAdd": "新增{target}记忆:{content}",
|
|
2564
|
+
"review.opReplace": "改写{target}记忆:由“{from}”改为“{to}”",
|
|
2565
|
+
"review.opRemove": "删除{target}记忆:{text}",
|
|
2566
|
+
"review.opArchive": "归档文档 {id}",
|
|
2567
|
+
"review.targetMemory": "项目",
|
|
2568
|
+
"review.targetUser": "用户",
|
|
2569
|
+
"review.guidanceLabel": "整理要求",
|
|
2570
|
+
"review.guidanceHint": "可选:写下你希望这次整理达成的目标,模型会读到,但不会因此获得额外权限",
|
|
2571
|
+
"review.guidancePlaceholder": "例如:两条偏好其实是一回事,合并成一条",
|
|
2572
|
+
"review.guided": "已按你的要求整理",
|
|
2573
|
+
"review.remoteEntries": "参考了远端 {count} 条本机没有的记忆",
|
|
2574
|
+
"review.selectAll": "全选",
|
|
2575
|
+
"review.selectNone": "全不选",
|
|
2576
|
+
"review.selectHint": "勾选要执行的改动,未勾选的保留到下次",
|
|
2577
|
+
"review.selected": "已选 {count}/{total} 条",
|
|
2578
|
+
"review.applyCount": "执行选中 {count} 条",
|
|
2579
|
+
"review.noSelection": "请至少选择一条改动。",
|
|
2580
|
+
"review.history": "已执行的历史方案({count})",
|
|
2581
|
+
"review.historyTitle": "已执行的历史方案",
|
|
2582
|
+
"review.historyHint": "这些方案已经执行过,只供回看;重新打开不会撤销已经写入的改动。",
|
|
2583
|
+
"review.historyEmpty": "还没有执行过的方案。",
|
|
2584
|
+
"review.rejectedHint": "这份方案已被拒绝;写下意见后重新打开,或直接让 AI 重新整理。"
|
|
2231
2585
|
};
|
|
2232
2586
|
const en = {
|
|
2233
2587
|
...en$3,
|
|
@@ -2335,6 +2689,7 @@ window.__ModuleLoader__.load({
|
|
|
2335
2689
|
"receipt.unfinished": "Not finished",
|
|
2336
2690
|
"receipt.failed": "Failed",
|
|
2337
2691
|
"receipt.view": "View in Memory Spaces",
|
|
2692
|
+
"receipt.viewRuntime": "View in Runtime Memory",
|
|
2338
2693
|
"taskAgent.ready": "Task Agent ready",
|
|
2339
2694
|
"taskAgent.unavailable": "Task Agent unavailable",
|
|
2340
2695
|
"saveAction.button": "Save to memory",
|
|
@@ -2349,6 +2704,31 @@ window.__ModuleLoader__.load({
|
|
|
2349
2704
|
"saveAction.submitting": "Task Agent working…",
|
|
2350
2705
|
"saveAction.readOnly": "This deployment is read only; memory writes are disabled.",
|
|
2351
2706
|
"saveAction.close": "Close",
|
|
2707
|
+
"saveAction.hintDirect": "The text goes straight to the chosen place, without a task Agent.",
|
|
2708
|
+
"saveAction.to": "Save to",
|
|
2709
|
+
"saveAction.to.agent": "Let the Agent decide",
|
|
2710
|
+
"saveAction.to.agentDetail": "A task Agent decides whether to keep it and picks a Memory Space",
|
|
2711
|
+
"saveAction.to.memory": "Working memory (MEMORY.md)",
|
|
2712
|
+
"saveAction.to.user": "User profile (USER.md)",
|
|
2713
|
+
"saveAction.to.space": "Memory Space · {provider}",
|
|
2714
|
+
"saveAction.save": "Save",
|
|
2715
|
+
"saveAction.saving": "Saving…",
|
|
2716
|
+
"saveAction.saved.runtime": "Saved to {target} · {count} entries",
|
|
2717
|
+
"saveAction.saved.runtimeMaintained": "Made room and saved to {target} · {count} entries",
|
|
2718
|
+
"saveAction.saved.space": "Saved to the Memory Space {space}",
|
|
2719
|
+
"saveAction.saved.spacePending": "Submitted to the Memory Space {space}; the Provider confirms it later",
|
|
2720
|
+
"saveAction.saved.spaceOther": "The Memory Space {space} answered: {action}",
|
|
2721
|
+
"saveAction.saved.duplicate": "Already saved; nothing was written twice.",
|
|
2722
|
+
"saveAction.unavailable": "This place cannot take writes now.",
|
|
2723
|
+
"saveAction.place.delimiter": "Entries in {target} cannot contain §; remove it to save.",
|
|
2724
|
+
"saveAction.place.tooLong": "This text is about {size}, more than one entry in {target} holds ({limit}); shorten it.",
|
|
2725
|
+
"saveAction.place.orAgent": " Or let the Agent decide.",
|
|
2726
|
+
"saveAction.place.full": "{target} holds {used} of {limit}. Saving first makes room: about {keep} of the existing entries stay, and the rest move out of working memory.",
|
|
2727
|
+
"saveAction.place.fullAll": "{target} holds {used} of {limit}. Saving first makes room: every existing entry moves out of working memory.",
|
|
2728
|
+
"saveAction.place.userCondense": "The user profile holds {used} of {limit}. Before saving, a task Agent condenses it to about {keep}, keeping no archive.",
|
|
2729
|
+
"saveAction.place.userTooLong": "This text is about {size}, more than the user profile can take after making room ({max}); shorten it.",
|
|
2730
|
+
"saveAction.place.userFull": "The user profile is full, and making room in it needs a task Agent; remove entries in Runtime Memory first, or choose another place.",
|
|
2731
|
+
"saveAction.noPlace": "No place can take this text now.",
|
|
2352
2732
|
"readSources.all": "All providers",
|
|
2353
2733
|
"readSources.mode.search": "Native search",
|
|
2354
2734
|
"readSources.mode.graph": "True relation graph",
|
|
@@ -2808,7 +3188,7 @@ window.__ModuleLoader__.load({
|
|
|
2808
3188
|
"config.interactionTurnBar": "Turn memory bar",
|
|
2809
3189
|
"config.interactionTurnBarHint": "Shows each turn's recall and writes below the reply",
|
|
2810
3190
|
"config.interactionSaveAction": "Save to memory action",
|
|
2811
|
-
"config.interactionSaveActionHint": "Save a reply by hand; it goes
|
|
3191
|
+
"config.interactionSaveActionHint": "Save a reply by hand; it goes where you choose after you confirm",
|
|
2812
3192
|
"config.packTitle": "Backup and migration",
|
|
2813
3193
|
"config.packUnavailable": "This DSH host does not provide the Mnemon ZIP backup channel.",
|
|
2814
3194
|
"config.packExporting": "Exporting…",
|
|
@@ -2823,7 +3203,187 @@ window.__ModuleLoader__.load({
|
|
|
2823
3203
|
"config.packUnnamedZip": "Mnemon backup.zip",
|
|
2824
3204
|
"config.packZipReady": "Verified · {components} components · {items} items · {size}",
|
|
2825
3205
|
"config.packImportZipAction": "Safe import",
|
|
2826
|
-
"config.packImportedWhole": "Safely merged the ZIP into {root}."
|
|
3206
|
+
"config.packImportedWhole": "Safely merged the ZIP into {root}.",
|
|
3207
|
+
"config.syncTitle": "Git sync",
|
|
3208
|
+
"config.syncSimpleDescription": "Syncs the components above to a Git repository, without third-party providers or credentials",
|
|
3209
|
+
"config.syncLoading": "Reading the sync status…",
|
|
3210
|
+
"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}",
|
|
3275
|
+
"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",
|
|
3298
|
+
"config.syncGitHubReadOnly": "The credentials store is read-only, so a sign-in cannot be saved",
|
|
3299
|
+
"config.syncGitHubSignIn": "Sign in with GitHub",
|
|
3300
|
+
"config.syncGitHubStarting": "Requesting a device code…",
|
|
3301
|
+
"config.syncGitHubCode": "Enter this device code on GitHub:",
|
|
3302
|
+
"config.syncGitHubCopy": "Copy",
|
|
3303
|
+
"config.syncGitHubCopied": "Copied",
|
|
3304
|
+
"config.syncGitHubOpen": "Open the GitHub authorization page",
|
|
3305
|
+
"config.syncGitHubWaiting": "Waiting for authorization… this continues on its own",
|
|
3306
|
+
"config.syncGitHubSignedIn": "Signed in as @{login}",
|
|
3307
|
+
"config.syncGitHubSignOut": "Sign out",
|
|
3308
|
+
"config.syncGitHubFailed": "GitHub sign-in failed: {error}",
|
|
3309
|
+
"config.syncGitHubExpired": "The device code expired; start the sign-in again",
|
|
3310
|
+
"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",
|
|
3317
|
+
"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",
|
|
3326
|
+
"config.syncRepositoryCreating": "Creating…",
|
|
3327
|
+
"config.syncRepositoryCreated": "Created {name}.",
|
|
3328
|
+
"config.reconcileTitle": "Memory reconciliation",
|
|
3329
|
+
"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
|
+
"review.reconcile": "Reconcile",
|
|
3335
|
+
"review.reconciling": "Reconciling…",
|
|
3336
|
+
"review.refresh": "Refresh",
|
|
3337
|
+
"review.empty": "Nothing to review",
|
|
3338
|
+
"review.pending": "{count} awaiting review",
|
|
3339
|
+
"review.failed": "Reading the review ledger failed: {error}",
|
|
3340
|
+
"review.planned": "Prepared {operations} proposals; nothing is written until you accept them.",
|
|
3341
|
+
"review.none": "The model found nothing to change in the merged memory.",
|
|
3342
|
+
"review.statusPending": "Pending",
|
|
3343
|
+
"review.statusAccepted": "Accepted",
|
|
3344
|
+
"review.statusRejected": "Rejected",
|
|
3345
|
+
"review.expand": "Open",
|
|
3346
|
+
"review.collapse": "Close",
|
|
3347
|
+
"review.accept": "Accept",
|
|
3348
|
+
"review.reject": "Reject",
|
|
3349
|
+
"review.apply": "Apply",
|
|
3350
|
+
"review.applying": "Applying…",
|
|
3351
|
+
"review.reopen": "Reopen",
|
|
3352
|
+
"review.applied": "Applied {count} changes.",
|
|
3353
|
+
"review.appliedAt": "Applied at {time}",
|
|
3354
|
+
"review.appliedCount": "{count} of {total} operations have run",
|
|
3355
|
+
"review.applyFailed": "Applying failed: {error}",
|
|
3356
|
+
"review.meta": "{count} changes · from {machine} · {time}",
|
|
3357
|
+
"review.foreign": "Touches memory from: {machines}",
|
|
3358
|
+
"review.opinions": "Opinions",
|
|
3359
|
+
"review.noOpinions": "No opinion yet",
|
|
3360
|
+
"review.authorUser": "You",
|
|
3361
|
+
"review.authorAgent": "Model",
|
|
3362
|
+
"review.opinionPlaceholder": "Leave an opinion for the next reconciliation",
|
|
3363
|
+
"review.opinionSend": "Add opinion",
|
|
3364
|
+
"review.opinionAdded": "Your opinion was recorded.",
|
|
3365
|
+
"review.opAdd": "Add {target} memory: {content}",
|
|
3366
|
+
"review.opReplace": "Rewrite {target} memory: “{from}” becomes “{to}”",
|
|
3367
|
+
"review.opRemove": "Remove {target} memory: {text}",
|
|
3368
|
+
"review.opArchive": "Archive document {id}",
|
|
3369
|
+
"review.targetMemory": "project",
|
|
3370
|
+
"review.targetUser": "user",
|
|
3371
|
+
"review.guidanceLabel": "What to accomplish",
|
|
3372
|
+
"review.guidanceHint": "Optional: state what you want this reconciliation to do; the model reads it without gaining any authority from it",
|
|
3373
|
+
"review.guidancePlaceholder": "For example: two preferences say the same thing, merge them into one",
|
|
3374
|
+
"review.guided": "Planned with your guidance",
|
|
3375
|
+
"review.remoteEntries": "Read {count} entries from the branch this installation lacks",
|
|
3376
|
+
"review.selectAll": "All",
|
|
3377
|
+
"review.selectNone": "None",
|
|
3378
|
+
"review.selectHint": "Check the changes to apply; unchecked ones stay for the next round",
|
|
3379
|
+
"review.selected": "{count} of {total} selected",
|
|
3380
|
+
"review.applyCount": "Apply {count}",
|
|
3381
|
+
"review.noSelection": "Select at least one change.",
|
|
3382
|
+
"review.history": "Applied plans ({count})",
|
|
3383
|
+
"review.historyTitle": "Applied plans",
|
|
3384
|
+
"review.historyHint": "These plans already ran; they are kept for reading. Reopening one does not undo what it wrote.",
|
|
3385
|
+
"review.historyEmpty": "No plan has run yet.",
|
|
3386
|
+
"review.rejectedHint": "This plan was rejected; leave an opinion and reopen it, or ask the AI to plan again."
|
|
2827
3387
|
};
|
|
2828
3388
|
function interpolate(dictionary, key, params) {
|
|
2829
3389
|
const template = dictionary[key];
|
|
@@ -2847,7 +3407,7 @@ window.__ModuleLoader__.load({
|
|
|
2847
3407
|
const IconChevronLeftOutline14 = _deepseek_ai_dsh_client_ui_primitives.IconChevronLeftOutlineRegular;
|
|
2848
3408
|
//#endregion
|
|
2849
3409
|
//#region \0dsh-mnemon-css:/home/runner/work/dsh-mnemon/dsh-mnemon/src/client/MnemonView.module.css.mjs
|
|
2850
|
-
const css$12 = ".IIa07q_shell{--mn-bg:var(--dsw-alias-bg-base);--mn-backdrop:var(--dsw-alias-bg-overlay,var(--mn-bg));--mn-surface:linear-gradient(var(--mn-bg), var(--mn-bg)), linear-gradient(var(--mn-backdrop), var(--mn-backdrop)) var(--mn-bg);--mn-layer-1:var(--dsw-alias-bg-layer-1);--mn-layer-2:var(--dsw-alias-bg-layer-2);--mn-fill:var(--dsw-alias-bg-module-platform);--mn-input:var(--dsw-alias-bg-layer-1);--mn-text:var(--dsw-alias-label-primary);--mn-muted:var(--dsw-alias-label-secondary);--mn-faint:var(--dsw-alias-label-tertiary);--mn-caption:var(--dsw-alias-label-caption);--mn-line:var(--dsw-alias-border-l2);--mn-line-strong:var(--dsw-alias-border-l3);--mn-field-line:var(--dsw-alias-border-l4);--mn-card-line:var(--dsw-alias-settings-card-stroke);--mn-accent:var(--dsw-alias-state-business-primary);--mn-hover:var(--dsw-alias-interactive-bg-hover);--mn-pressed:var(--dsw-alias-interactive-bg-active);--mn-danger:var(--dsw-alias-state-error-primary);--mn-success:var(--dsw-alias-state-success-primary);--mn-warn:var(--dsw-alias-state-warn-primary);--mn-idle:var(--dsw-alias-state-idle-primary);--mn-priority:var(--dsw-alias-state-warn-primary);--mn-focus:var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));--mn-code:var(--ds-font-family-code,\"SFMono-Regular\", Consolas, monospace);--mn-sans:var(--dsw-font-family,-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif);box-sizing:border-box;min-width:0;height:100%;min-height:0;color:var(--mn-text);background:var(--mn-surface);font:13px/20px var(--mn-sans);-webkit-tap-highlight-color:transparent;flex-direction:column;display:flex;overflow:hidden}:has(>[data-conversation-scroll]>[data-slot=conversation\\.session]>*>[data-slot=conversation\\.view]>.IIa07q_shell[data-mnemon-surface=builtin])>[data-width-handle]{visibility:hidden;pointer-events:none}.IIa07q_shell *,.IIa07q_shell :before,.IIa07q_shell :after{box-sizing:border-box}.IIa07q_shell :where(button,input,select,textarea){color:inherit;font:inherit}.IIa07q_shell :where(button,select){touch-action:manipulation}.IIa07q_shell button:focus-visible,.IIa07q_shell input:focus-visible,.IIa07q_shell select:focus-visible,.IIa07q_shell textarea:focus-visible,.IIa07q_shell summary:focus-visible,.IIa07q_shell [role=button]:focus-visible{outline:var(--dsw-focus-ring-width,2px) solid var(--mn-focus);outline-offset:2px}.IIa07q_shell :is(textarea,input:not([type=checkbox],[type=radio],[type=file])):focus-visible{outline:none}.IIa07q_shell code{font-family:var(--mn-code);font-size:.92em}.IIa07q_masthead{background:var(--mn-surface);flex:none;align-items:center;gap:12px;min-height:48px;padding:10px 24px 4px;display:flex}.IIa07q_backButton{flex:none;align-items:center;gap:4px;min-width:max-content;display:inline-flex}.IIa07q_backButton>svg{flex:none}.IIa07q_brand{flex-wrap:wrap;flex:auto;align-items:center;gap:4px 10px;min-width:0;display:flex}.IIa07q_brand h1{flex:none;margin:0;font-size:16px;font-weight:500;line-height:24px}.IIa07q_storageMode{color:var(--mn-faint);background:var(--mn-fill);white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:4px;padding:1px 8px;font-size:11px;line-height:17px;display:inline-flex}.IIa07q_storageMode>strong{color:var(--mn-muted);font-weight:500}.IIa07q_statusCluster{color:var(--mn-faint);white-space:nowrap;flex:none;align-items:center;gap:6px;font-size:13px;line-height:20px;display:inline-flex}.IIa07q_statusDot{background:var(--mn-idle);border-radius:50%;flex:none;width:6px;height:6px}.IIa07q_online{background:var(--mn-success)}.IIa07q_offline{background:var(--mn-danger)}.IIa07q_checking{background:var(--mn-idle)}.IIa07q_iconButton{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--mn-caption);cursor:pointer;background:0 0;border:0;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.IIa07q_iconButton:hover:not(:disabled){color:var(--mn-muted);background:var(--mn-hover)}.IIa07q_iconButton>svg{flex:none}.IIa07q_headerActions{flex:none;justify-content:flex-end;align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_workspacePicker{min-width:0;color:var(--mn-faint);align-items:center;gap:6px;font-size:12px;line-height:18px;display:inline-flex}.IIa07q_workspacePicker>[data-part=label]{white-space:nowrap}.IIa07q_workspacePicker button{width:min(200px,22vw);min-width:112px}.IIa07q_alert,.IIa07q_inlineError{border-radius:var(--dsw-radius-md);color:var(--mn-danger);background:color-mix(in srgb, var(--mn-danger) 8%, transparent);padding:8px 12px;font-size:12px;line-height:18px}.IIa07q_alert{flex-direction:column;flex:none;gap:2px;margin:8px 24px 0;display:flex}.IIa07q_alert ul{margin:4px 0 0;padding-left:18px}.IIa07q_alert[role=status]{color:var(--dsw-alias-state-warn-label,var(--mn-text));background:var(--dsw-alias-state-warn-tertiary,color-mix(in srgb, var(--mn-warn) 12%, transparent))}.IIa07q_notice{flex:none;margin:8px 24px 0}.IIa07q_compositionStatus{border-radius:var(--dsw-radius-sm);min-width:0;color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:2px 6px;display:inline-flex}.IIa07q_compositionStatus:hover:not(:disabled){background:var(--mn-hover)}.IIa07q_compositionStatus:disabled{cursor:default}.IIa07q_compositionStrategy{color:var(--mn-muted)}.IIa07q_compositionStrategy:before{content:\"·\";color:var(--mn-faint);margin-right:6px}.IIa07q_compositionStatusWrap{min-width:0;display:inline-flex;position:relative}.IIa07q_compositionSummary{z-index:20;border:.5px solid var(--dsw-alias-border-l2);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-2);width:max-content;max-width:min(320px,100vw - 32px);box-shadow:var(--dsw-elevation-prominent);color:var(--mn-muted);white-space:normal;opacity:0;pointer-events:none;flex-direction:column;align-items:flex-start;gap:8px;padding:12px;font-size:12px;line-height:18px;transition:opacity .14s ease-out,transform .14s ease-out;display:flex;position:absolute;top:calc(100% + 6px);right:0;transform:translateY(-4px)}.IIa07q_compositionStatusWrap:hover .IIa07q_compositionSummary,.IIa07q_compositionStatusWrap:focus-within .IIa07q_compositionSummary{opacity:1;transition-delay:.2s;transform:none}.IIa07q_compositionSummary>strong{color:var(--mn-text);font-size:13px;font-weight:500;line-height:20px}.IIa07q_compositionLayers{flex-wrap:wrap;gap:6px;display:flex}.IIa07q_compositionHint{color:var(--mn-faint)}@media (prefers-reduced-motion:reduce){.IIa07q_compositionSummary{transition:none}}.IIa07q_workspaceMismatch{border:.5px solid color-mix(in srgb, var(--dsw-alias-state-warn-label,var(--mn-warn)) 20%, transparent);border-radius:var(--dsw-radius-sm);min-width:0;min-height:28px;color:var(--dsw-alias-state-warn-label,var(--mn-text));background:var(--dsw-alias-state-warn-tertiary,color-mix(in srgb, var(--mn-warn) 12%, transparent));white-space:nowrap;flex:none;align-items:center;gap:6px;padding:0 3px 0 10px;font-size:12px;font-weight:500;line-height:18px;display:inline-flex}.IIa07q_workspaceMismatch>button{border-radius:var(--dsw-radius-xs);min-height:22px;color:inherit;background:color-mix(in srgb, currentColor 10%, transparent);cursor:pointer;border:0;padding:0 8px;font-size:12px}.IIa07q_workspaceMismatch>button:hover{background:color-mix(in srgb, currentColor 16%, transparent)}.IIa07q_workspace{flex-direction:column;flex:1;min-height:0;display:flex}.IIa07q_topNavigation{border-bottom:.5px solid var(--mn-line-strong);background:var(--mn-surface);flex:none;align-items:flex-end;min-width:0;padding:0 24px;display:flex}.IIa07q_nav{overscroll-behavior-inline:contain;scrollbar-width:none;flex:1;align-items:flex-end;gap:28px;min-width:0;display:flex;overflow-x:auto}.IIa07q_nav::-webkit-scrollbar{display:none}.IIa07q_nav button{min-width:max-content;color:var(--mn-faint);text-align:left;cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:6px;margin-bottom:-.5px;padding:10px 0 9px;font-size:13px;font-weight:500;line-height:16px;display:flex;position:relative}.IIa07q_nav button:hover{color:var(--mn-muted)}.IIa07q_nav button[data-active]{color:var(--mn-accent)}.IIa07q_nav button[data-layer-disabled]:not([data-active]){color:var(--mn-caption)}.IIa07q_nav .IIa07q_layerDisabledBadge{border:.5px solid var(--mn-field-line);color:var(--mn-faint);border-radius:999px;align-items:center;padding:0 6px;font-size:11px;font-style:normal;font-weight:500;line-height:15px;display:inline-flex}.IIa07q_canvas{overscroll-behavior-x:contain;overscroll-behavior-y:auto;scroll-behavior:auto;-webkit-overflow-scrolling:touch;background:var(--mn-surface);flex:1;min-width:0;overflow:auto}.IIa07q_page{width:100%;min-height:100%;margin:0 auto;padding:20px 24px clamp(96px,14vh,150px)}.IIa07q_pageHeader{justify-content:space-between;align-items:flex-start;gap:16px 24px;margin-bottom:16px;display:flex}.IIa07q_pageHeader>div:first-child{min-width:0}.IIa07q_pageHeader h2{margin:0;font-size:16px;font-weight:500;line-height:24px}.IIa07q_pageHeader p{max-width:72ch;color:var(--mn-muted);margin:2px 0 0;font-size:13px;line-height:20px}.IIa07q_pageHeaderMeta{flex-wrap:wrap;flex:none;justify-content:flex-end;align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_pageHeaderMeta>code{border:.5px solid var(--mn-field-line);color:var(--mn-faint);font:500 11px/17px var(--mn-sans);font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;padding:1px 8px}.IIa07q_pageSpinner{width:20px;height:20px;color:var(--mn-faint);flex:none;place-items:center;display:inline-grid}.IIa07q_pageSpinner>i{border:2px solid color-mix(in srgb, currentColor 25%, transparent);border-top-color:currentColor;border-radius:50%;width:14px;height:14px;animation:.9s linear infinite IIa07q_mnemon-spin}.IIa07q_primaryButton,.IIa07q_secondaryButton,.IIa07q_ghostButton,.IIa07q_dangerButton,.IIa07q_dangerSolidButton{border-radius:var(--dsw-radius-md);min-height:32px;color:var(--mn-text);white-space:nowrap;cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;gap:4px;padding:0 12px;font-size:13px;font-weight:400;line-height:20px;transition:background-color .12s,color .12s,border-color .12s;display:inline-flex}.IIa07q_primaryButton{color:var(--dsw-alias-label-primary-foreground);background:var(--dsw-alias-button-primary-fill)}.IIa07q_primaryButton:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)}.IIa07q_secondaryButton{border:.5px solid var(--mn-line-strong)}.IIa07q_secondaryButton:hover:not(:disabled),.IIa07q_ghostButton:hover:not(:disabled){background:var(--mn-hover)}.IIa07q_secondaryButton:active:not(:disabled),.IIa07q_ghostButton:active:not(:disabled){background:var(--mn-pressed)}.IIa07q_dangerButton{color:var(--mn-danger)}.IIa07q_dangerButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-danger,color-mix(in srgb, var(--mn-danger) 8%, transparent))}.IIa07q_dangerSolidButton{color:var(--dsw-static-neutral-00,#fff);background:var(--mn-danger)}.IIa07q_dangerSolidButton:hover:not(:disabled){background:color-mix(in srgb, var(--mn-danger), black 8%)}.IIa07q_shell :where(button:disabled){cursor:not-allowed;opacity:.4}.IIa07q_emptyState{text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:12px;min-height:200px;padding:32px 24px;display:flex}.IIa07q_emptyGlyph{border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-lg);width:48px;height:48px;color:var(--mn-faint);flex:none;place-items:center;font-size:20px;line-height:1;display:grid}.IIa07q_emptyState h3{margin:0 0 4px;font-size:14px;font-weight:500;line-height:22px}.IIa07q_emptyState p{max-width:480px;color:var(--mn-faint);margin:0;font-size:13px;line-height:20px}.IIa07q_sourceManagementSummary{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);grid-template-columns:minmax(220px,1.2fr) minmax(260px,1fr) minmax(220px,1fr);gap:16px;margin-top:12px;padding:16px;display:grid}.IIa07q_sourceManagementIdentity{grid-template-columns:6px minmax(0,1fr);align-items:center;gap:10px;min-width:0;display:grid}.IIa07q_sourceManagementIdentity>span{background:var(--mn-success);border-radius:50%;width:6px;height:6px}.IIa07q_sourceManagementSummary[data-availability=degraded] .IIa07q_sourceManagementIdentity>span{background:var(--mn-warn)}.IIa07q_sourceManagementSummary[data-availability=unavailable] .IIa07q_sourceManagementIdentity>span{background:var(--mn-danger)}.IIa07q_sourceManagementIdentity>div{gap:2px;min-width:0;display:grid}.IIa07q_sourceManagementIdentity small,.IIa07q_sourceManagementCapabilities>small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_sourceManagementIdentity strong{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:500;line-height:20px;overflow:hidden}.IIa07q_sourceManagementIdentity code{color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.IIa07q_sourceManagementSummary dl{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:0;display:grid}.IIa07q_sourceManagementSummary dl>div{border-radius:var(--dsw-radius-sm);background:var(--mn-fill);align-content:center;gap:2px;min-width:0;padding:8px 10px;display:grid}.IIa07q_sourceManagementSummary dt{color:var(--mn-faint);font-size:11px;line-height:14px}.IIa07q_sourceManagementSummary dd{text-overflow:ellipsis;white-space:nowrap;margin:0;font-size:13px;line-height:20px;overflow:hidden}.IIa07q_sourceManagementSummary dd code{font-size:12px}.IIa07q_sourceManagementCapabilities{align-content:center;gap:6px;min-width:0;display:grid}.IIa07q_sourceManagementCapabilities>div{flex-wrap:wrap;gap:4px;display:flex}.IIa07q_sourceManagementCapabilities span{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_sourceManagementDiagnostics,.IIa07q_sourceManagementForm{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-top:12px;padding:16px}.IIa07q_sourceManagementDiagnostics h3,.IIa07q_sourceManagementForm h3{margin:0;font-size:14px;font-weight:500;line-height:22px}.IIa07q_sourceManagementDiagnostics ul{color:var(--mn-muted);gap:4px;margin:8px 0 0;padding-left:18px;font-size:12px;line-height:18px;display:grid}.IIa07q_sourceManagementForm>div:first-child p{color:var(--mn-faint);margin:2px 0 0;font-size:12px;line-height:18px}.IIa07q_sourceManagementForm .IIa07q_formGrid label>small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_sourceManagementForm .IIa07q_formGrid input[type=checkbox]{width:16px;min-width:0;height:16px;min-height:0;accent-color:var(--dsw-alias-brand-primary)}.IIa07q_sectionSpinner{z-index:6;width:20px;height:20px;color:var(--mn-faint);place-items:center;display:grid;position:absolute;top:10px;right:10px}.IIa07q_sectionSpinner>i{border:2px solid color-mix(in srgb, currentColor 25%, transparent);border-top-color:currentColor;border-radius:50%;width:14px;height:14px;animation:.9s linear infinite IIa07q_mnemon-spin}@keyframes IIa07q_mnemon-spin{to{transform:rotate(360deg)}}.IIa07q_inlineError{margin:0 0 12px}.IIa07q_loading{color:var(--mn-faint);padding:16px 0;font-size:13px}.IIa07q_bodyEdit{gap:12px;padding-top:2px;display:grid}.IIa07q_bodyEdit label,.IIa07q_formGrid label{color:var(--mn-muted);gap:6px;font-size:12px;font-weight:500;line-height:18px;display:grid}.IIa07q_bodyEdit input,.IIa07q_bodyEdit select,.IIa07q_bodyEdit textarea,.IIa07q_formGrid select,.IIa07q_formGrid input{border:.5px solid var(--mn-field-line);border-radius:var(--dsw-radius-md);width:100%;min-width:0;min-height:32px;color:var(--mn-text);background:var(--mn-input);outline:0;padding:5px 10px;font-size:13px;font-weight:400;line-height:20px}.IIa07q_bodyEdit textarea{resize:vertical}.IIa07q_bodyEdit input::placeholder,.IIa07q_bodyEdit textarea::placeholder,.IIa07q_formGrid input::placeholder{color:var(--dsw-alias-label-dimmed)}.IIa07q_bodyEdit input:focus,.IIa07q_bodyEdit select:focus,.IIa07q_bodyEdit textarea:focus,.IIa07q_formGrid select:focus,.IIa07q_formGrid input:focus{border-color:var(--mn-accent)}.IIa07q_providerFieldControl{gap:4px;min-width:0;display:grid}.IIa07q_providerFieldControl input[type=checkbox]{width:16px;height:16px;min-height:0;accent-color:var(--dsw-alias-brand-primary);margin:2px 0;padding:0}.IIa07q_bodyDeleteConfirm{gap:16px;display:grid}.IIa07q_bodyDeleteConfirm>p{color:var(--mn-muted);margin:0;font-size:13px;line-height:20px}.IIa07q_bodyDeleteSummary{border-radius:var(--dsw-radius-md);background:color-mix(in srgb, var(--mn-danger) 6%, transparent);gap:4px;padding:12px;display:grid}.IIa07q_bodyDeleteSummary strong{font-size:13px;font-weight:500}.IIa07q_bodyDeleteContent{white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:13px;font-weight:400;line-height:20px}.IIa07q_bodyDeleteSummary span{color:var(--mn-muted);font-size:12px;line-height:18px}.IIa07q_sectionHeading{justify-content:space-between;align-items:center;gap:16px;min-height:36px;margin-bottom:8px;display:flex}.IIa07q_sectionHeading h3{margin:0;font-size:14px;font-weight:500;line-height:22px}.IIa07q_sectionHeading>div>span{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_sectionHeading>strong{color:var(--mn-muted);background:var(--mn-fill);font-variant-numeric:tabular-nums;border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_sectionHeading button{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--mn-caption);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.IIa07q_sectionHeading button:hover:not(:disabled){color:var(--mn-muted);background:var(--mn-hover)}.IIa07q_runtimeNotice{border-radius:var(--dsw-radius-md);color:var(--mn-success);background:color-mix(in srgb, var(--mn-success) 8%, transparent);margin-bottom:12px;padding:8px 12px;font-size:12px;line-height:18px}.IIa07q_runtimeFootnote{color:var(--mn-faint);margin:12px 2px 0;font-size:12px;line-height:18px}.IIa07q_formGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:12px;display:grid}.IIa07q_listProgress{border-top:.5px solid var(--mn-line);min-height:56px;color:var(--mn-faint);justify-content:center;align-items:center;gap:12px;margin-top:12px;padding:10px;font-size:12px;line-height:18px;display:flex}.IIa07q_compactListProgress{border-top:.5px solid var(--mn-line);color:var(--mn-faint);text-align:center;justify-items:stretch;gap:8px;margin-top:8px;padding:10px 2px 2px;font-size:12px;line-height:18px;display:grid}.IIa07q_compactListProgress button{width:100%}.IIa07q_modalPortal{z-index:1000;isolation:isolate;pointer-events:none;position:fixed;inset:0}.IIa07q_modalTheme.IIa07q_modalTheme.IIa07q_modalTheme{width:auto;min-width:0;height:auto;min-height:0;color:var(--mn-text);pointer-events:none;background:0 0;display:block;position:absolute;inset:0;overflow:visible}.IIa07q_modalBackdrop{z-index:0;overscroll-behavior:contain;padding:max(24px, var(--dsh-frame-top-clearance,24px)) 24px;background:var(--dsw-alias-bg-mask-1);backdrop-filter:var(--dsw-mask-blur);touch-action:none;pointer-events:auto;justify-content:center;align-items:center;animation:.18s ease-out both IIa07q_mnemon-dialog-backdrop-enter;display:flex;position:fixed;inset:0;overflow:hidden}.IIa07q_modal{box-sizing:border-box;border-radius:var(--dsw-radius-panel);background:linear-gradient(var(--mn-layer-2), var(--mn-layer-2)), var(--mn-surface);width:min(640px,100%);min-height:0;max-height:100%;box-shadow:var(--dsw-elevation-prominent);touch-action:auto;transform-origin:50% 100%;backface-visibility:hidden;will-change:transform, opacity;border:0;flex-direction:column;animation:.2s cubic-bezier(.2,.75,.2,1) both IIa07q_mnemon-dialog-enter;display:flex;overflow:hidden}.IIa07q_modalBackdrop[data-closing],.IIa07q_modal[data-closing]{pointer-events:none}.IIa07q_modalDragHandle{display:none}.IIa07q_modalWide{width:min(760px,100%)}.IIa07q_modal>header{flex:none;justify-content:space-between;align-items:flex-start;gap:8px;padding:22px 14px 12px 24px;display:flex}.IIa07q_modal>header>div{min-width:0;padding-top:2px}.IIa07q_modal>header h2{margin:0;font-size:16px;font-weight:500;line-height:24px}.IIa07q_modal>header p{overflow-wrap:anywhere;max-width:64ch;color:var(--mn-muted);margin:4px 0 0;font-size:13px;line-height:20px}.IIa07q_modal>header .IIa07q_iconButton{color:var(--mn-muted);flex:none}.IIa07q_modalBody{overscroll-behavior:contain;scrollbar-gutter:stable;touch-action:pan-y;-webkit-overflow-scrolling:touch;min-height:0;padding:8px 24px 20px;overflow:hidden auto}.IIa07q_modalFooter{background:0 0;flex:none;justify-content:flex-end;align-items:center;gap:12px;padding:4px 24px 24px;display:flex}.IIa07q_modalFooter button{min-height:36px;padding-inline:14px}.IIa07q_modalFooterMeta{color:var(--mn-faint);margin-right:auto;font-size:12px;line-height:18px}.IIa07q_modalFooterActions{justify-content:flex-end;align-items:center;gap:8px;min-width:0;margin-left:auto;display:flex}@keyframes IIa07q_mnemon-dialog-backdrop-enter{0%{opacity:0}}@keyframes IIa07q_mnemon-dialog-enter{0%{opacity:0;transform:translateY(8px)scale(.985)}}@keyframes IIa07q_mnemon-sheet-enter{0%{transform:translateY(calc(100% + 32px))}to{transform:translate3d(0, var(--mn-modal-drag-y,0px), 0)}}@keyframes IIa07q_mnemon-metadata-sweep{to{transform:translate(120%)}}@keyframes IIa07q_mnemon-metadata-refreshed{0%{border-color:color-mix(in srgb, var(--mn-accent) 60%, var(--mn-card-line));box-shadow:0 0 0 2px color-mix(in srgb, var(--mn-accent) 14%, transparent)}to{border-color:var(--mn-card-line);box-shadow:0 0 #0000}}.IIa07q_healthStrip{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);flex-wrap:wrap;margin-bottom:16px;display:flex;position:relative;overflow:hidden}.IIa07q_asyncStatusBlock{min-width:0;min-height:36px;position:relative}.IIa07q_healthStrip article{box-sizing:border-box;border-top:.5px solid var(--mn-line);border-left:.5px solid var(--mn-line);flex:150px;align-items:flex-start;gap:10px;min-width:0;min-height:76px;margin:-.5px 0 0 -.5px;padding:14px 16px;display:flex}.IIa07q_healthStrip article>div{min-width:0}.IIa07q_healthStrip small{color:var(--mn-faint);margin-bottom:2px;font-size:12px;line-height:18px;display:block}.IIa07q_healthStrip strong{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:500;line-height:22px;display:block;overflow:hidden}.IIa07q_healthStrip p{color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;margin:2px 0 0;font-size:12px;line-height:18px;overflow:hidden}.IIa07q_healthIndicator{border-radius:50%;flex:none;width:6px;height:6px;margin-top:6px}.IIa07q_healthGood{background:var(--mn-success)}.IIa07q_healthBad{background:var(--mn-danger)}.IIa07q_healthMuted{background:var(--mn-idle)}.IIa07q_providerHealth{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-bottom:16px;padding:16px}.IIa07q_providerHealthList{margin-top:8px}.IIa07q_providerHealthList article{align-items:center;gap:12px;min-width:0;min-height:56px;padding:8px 0;display:flex}.IIa07q_providerHealthList article+article{border-top:.5px solid var(--mn-line)}.IIa07q_providerHealthOff{border-top:.5px solid var(--mn-line);min-width:0;color:var(--mn-faint);justify-content:space-between;align-items:center;gap:12px;margin-top:4px;padding-top:10px;font-size:12px;line-height:18px;display:flex}.IIa07q_providerHealthMark{box-sizing:border-box;border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-md);flex:none;place-items:center;width:36px;height:36px;padding:6px;display:grid;overflow:hidden}.IIa07q_providerHealthMark>img,.IIa07q_providerHealthMark>svg{object-fit:contain;border-radius:4px;width:100%;height:100%;display:block}.IIa07q_providerHealthCopy{flex:1;gap:0;min-width:0;display:grid}.IIa07q_providerHealthCopy strong{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:500;line-height:20px;overflow:hidden}.IIa07q_providerHealthCopy small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_providerHealthCopy p{color:var(--mn-danger);text-overflow:ellipsis;white-space:nowrap;margin:2px 0 0;font-size:12px;line-height:18px;overflow:hidden}.IIa07q_providerHealthMeta{flex:none;align-items:center;gap:6px;display:flex}.IIa07q_providerHealthMeta small{color:var(--mn-faint);font-variant-numeric:tabular-nums;font-size:12px;line-height:18px}.IIa07q_providerHealthSignal{background:var(--mn-idle);border-radius:50%;width:6px;height:6px}.IIa07q_providerHealthList article[data-status=healthy] .IIa07q_providerHealthSignal{background:var(--mn-success)}.IIa07q_providerHealthList article[data-status=unhealthy] .IIa07q_providerHealthSignal{background:var(--mn-danger)}.IIa07q_providerHealthList article[data-status=idle] .IIa07q_providerHealthSignal{background:var(--mn-idle)}.IIa07q_storageDomains{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-bottom:16px;padding:16px}.IIa07q_storageRoot{border-radius:var(--dsw-radius-md);background:var(--mn-fill);justify-content:space-between;align-items:center;gap:16px;min-width:0;margin-top:12px;padding:10px 12px;display:flex}.IIa07q_storageRoot>div:first-child{gap:2px;min-width:0;display:grid}.IIa07q_storageRoot span,.IIa07q_storageRoot small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_storageRoot code{color:var(--mn-muted);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.IIa07q_storageRoot>div:last-child{flex:none;justify-items:end;gap:2px;display:grid}.IIa07q_storageRoot strong{font-variant-numeric:tabular-nums;font-size:13px;font-weight:500}.IIa07q_storageAreaGrid{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:8px;display:grid}.IIa07q_storageAreaGrid article{box-sizing:border-box;border:.5px solid var(--mn-line);border-radius:var(--dsw-radius-md);flex-direction:column;min-width:0;min-height:148px;padding:12px 14px;display:flex}.IIa07q_storageAreaGrid article>header{justify-content:space-between;align-items:center;gap:8px;display:flex}.IIa07q_storageAreaGrid article>header>div{align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_storageAreaGrid article>header span{background:var(--mn-idle);border-radius:50%;flex:none;width:6px;height:6px}.IIa07q_storageAreaGrid article[data-status=ready]>header span{background:var(--mn-success)}.IIa07q_storageAreaGrid article[data-status=invalid]>header span{background:var(--mn-danger)}.IIa07q_storageAreaGrid article>header strong{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;overflow:hidden}.IIa07q_storageAreaGrid article>header em{color:var(--mn-faint);white-space:nowrap;font-size:11px;font-style:normal;line-height:14px}.IIa07q_storageAreaMetric{align-items:baseline;gap:6px;margin-top:12px;display:flex}.IIa07q_storageAreaMetric strong{font-variant-numeric:tabular-nums;font-size:20px;font-weight:500;line-height:28px}.IIa07q_storageAreaMetric span{color:var(--mn-faint);font-size:12px}.IIa07q_storageAreaMetric code{color:var(--mn-faint);margin-left:auto;font-size:11px}.IIa07q_storageAreaGrid article>p{min-height:36px;color:var(--mn-faint);margin:6px 0 8px;font-size:12px;line-height:18px}.IIa07q_storagePath{border-top:.5px solid var(--mn-line);color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;margin-top:auto;padding-top:8px;font-size:11px;line-height:16px;display:block;overflow:hidden}.IIa07q_storageAreaGrid article>small{color:var(--mn-danger);margin-top:6px;font-size:12px;line-height:18px;display:block}.IIa07q_storageUnavailable{border-radius:var(--dsw-radius-md);min-height:120px;color:var(--mn-muted);background:var(--mn-fill);text-align:center;place-content:center;gap:4px;margin-top:12px;display:grid}.IIa07q_storageUnavailable strong{font-size:13px;font-weight:500}.IIa07q_storageUnavailable p{max-width:520px;color:var(--mn-faint);margin:0;font-size:12px;line-height:18px}.IIa07q_storageFootnote{color:var(--mn-faint);margin:12px 0 0;font-size:12px;line-height:18px}.IIa07q_statusSectionHeader{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.IIa07q_statusSectionHeader h3{margin:0;font-size:14px;font-weight:500;line-height:22px}.IIa07q_statusSectionHeader p{max-width:640px;color:var(--mn-faint);margin:2px 0 0;font-size:12px;line-height:18px}.IIa07q_phaseBadge{color:var(--mn-muted);background:var(--mn-fill);font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;flex:none;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_statusHeaderActions{align-items:center;gap:8px;display:flex}.IIa07q_versionDialogBody{grid-template-columns:minmax(0,1fr);gap:12px;display:grid}.IIa07q_versionChecking{min-height:112px;color:var(--mn-muted);justify-content:center;align-items:center;gap:10px;font-size:13px;display:flex}.IIa07q_versionChecking span{border:2px solid color-mix(in srgb, currentColor 25%, transparent);border-top-color:currentColor;border-radius:50%;width:14px;height:14px;animation:.9s linear infinite IIa07q_mnemon-spin}.IIa07q_versionError,.IIa07q_versionResult{border-radius:var(--dsw-radius-md);color:var(--mn-danger);background:color-mix(in srgb, var(--mn-danger) 8%, transparent);padding:10px 12px}.IIa07q_versionResult{color:var(--mn-success);background:color-mix(in srgb, var(--mn-success) 8%, transparent)}.IIa07q_versionError strong,.IIa07q_versionResult strong{font-size:13px;font-weight:500}.IIa07q_versionError p,.IIa07q_versionResult p{color:var(--mn-muted);margin:2px 0 0;font-size:12px;line-height:18px}.IIa07q_versionList{grid-template-columns:minmax(0,1fr);gap:8px;display:grid}.IIa07q_versionList article{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);padding:12px 14px}.IIa07q_versionList article>header{justify-content:space-between;align-items:center;gap:12px;display:flex}.IIa07q_versionList article>header>div{align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_versionList article>header strong{font-size:14px;font-weight:500;line-height:22px}.IIa07q_versionList article>header span{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_versionList article>header em{color:var(--mn-success);white-space:nowrap;font-size:12px;font-style:normal;line-height:18px}.IIa07q_versionList article[data-outdated]>header em{color:var(--mn-accent)}.IIa07q_versionNumbers{grid-template-columns:1fr auto 1fr;align-items:end;gap:10px;margin-top:10px;display:grid}.IIa07q_versionNumbers>div{gap:2px;display:grid}.IIa07q_versionNumbers small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_versionNumbers code{font-size:13px}.IIa07q_versionNumbers>span{color:var(--mn-faint);padding-bottom:1px}.IIa07q_versionLocation{min-width:0;color:var(--mn-faint);gap:6px;margin-top:8px;font-size:12px;line-height:18px;display:flex}.IIa07q_versionLocation>span{flex:none}.IIa07q_versionLocation>code{min-width:0;color:inherit;text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.IIa07q_versionList article>footer{border-top:.5px solid var(--mn-line);justify-content:space-between;align-items:flex-end;gap:16px;margin-top:10px;padding-top:10px;display:flex}.IIa07q_versionList article>footer p{max-width:470px;color:var(--mn-muted);margin:0;font-size:12px;line-height:18px}.IIa07q_versionList article>footer button{flex:none}.IIa07q_versionList article>header em[data-state=unknown],.IIa07q_versionList article>header em[data-state=local],.IIa07q_versionList article>header em[data-state=missing]{color:var(--mn-faint)}.IIa07q_versionList article>header em[data-state=restart]{color:var(--mn-accent)}.IIa07q_versionNotice{color:var(--mn-muted);margin:8px 0 0;font-size:12px;line-height:18px}.IIa07q_versionGuidance{border-radius:var(--dsw-radius-md);background:var(--mn-fill);gap:6px;min-width:0;margin-top:10px;padding:10px 12px;display:grid}.IIa07q_versionGuidance>strong{font-size:13px;font-weight:500}.IIa07q_versionGuidance>p{color:var(--mn-muted);margin:0;font-size:12px;line-height:18px}.IIa07q_versionGuidance>a{color:var(--dsw-alias-link,var(--mn-accent));justify-self:start;font-size:12px}.IIa07q_versionGuidanceDetails{min-width:0;color:var(--mn-muted);font-size:12px;line-height:18px}.IIa07q_versionGuidanceDetails>summary{cursor:pointer}.IIa07q_versionGuidanceDetails>p{margin:8px 0}.IIa07q_versionGuidanceDetails>a{color:var(--dsw-alias-link,var(--mn-accent))}.IIa07q_versionCommand{border-radius:var(--dsw-radius-sm);background:var(--mn-layer-1);flex-wrap:wrap;align-items:center;gap:8px;min-width:0;padding:8px 10px;display:flex}.IIa07q_versionCommand>code{overflow-wrap:anywhere;white-space:pre-wrap;user-select:text;flex:1;min-width:0;font-size:12px}.IIa07q_versionCommand>button{flex:none}.IIa07q_versionCommand>small{color:var(--mn-faint);flex-basis:100%;font-size:12px}.IIa07q_versionPackages{border-top:.5px solid var(--mn-line);min-width:0;margin-top:12px}.IIa07q_versionPackagesToggle{width:100%;min-height:44px;color:var(--mn-text);text-align:start;cursor:pointer;background:0 0;border:0;flex-wrap:wrap;align-items:center;gap:8px;padding:10px 0 0;display:flex}.IIa07q_versionPackagesToggle>strong{font-size:13px;font-weight:500}.IIa07q_versionPackagesToggle>small{color:var(--mn-faint);margin-left:auto;font-size:12px}.IIa07q_versionPackages h4{color:var(--mn-faint);margin:16px 0 8px;font-size:12px;font-weight:500;line-height:18px}.IIa07q_versionPackages ul{gap:8px;margin:0;padding:0;list-style:none;display:grid}.IIa07q_versionPackage{border:.5px solid var(--mn-line);border-radius:var(--dsw-radius-md);min-width:0;padding:10px 12px}.IIa07q_versionPackageHeader{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:6px 12px;display:flex}.IIa07q_versionPackageHeader strong{overflow-wrap:anywhere;min-width:0;font-size:13px;font-weight:500}.IIa07q_versionPackageHeader em{color:var(--mn-faint);font-size:12px;font-style:normal}.IIa07q_versionPackageHeader em[data-state=available],.IIa07q_versionPackageHeader em[data-state=restart]{color:var(--mn-accent)}.IIa07q_versionPackageHeader em[data-state=current]{color:var(--mn-success)}.IIa07q_versionPackageMeta,.IIa07q_versionPackageNumbers{color:var(--mn-faint);flex-wrap:wrap;gap:6px 14px;margin-top:6px;font-size:12px;line-height:18px;display:flex}.IIa07q_versionPackageNumbers code{color:var(--mn-text)}.IIa07q_versionPackageAction{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin-top:8px;display:flex}.IIa07q_versionPackageAction p{min-width:150px;color:var(--mn-muted);flex:1;margin:0;font-size:12px;line-height:18px}.IIa07q_versionPackageAction button{flex:none}@media (width<=1000px){.IIa07q_sourceManagementSummary{grid-template-columns:1fr 1fr}.IIa07q_sourceManagementCapabilities{grid-column:1/-1}.IIa07q_storageAreaGrid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=760px){.IIa07q_shell{min-height:0;overflow:hidden}.IIa07q_sourceManagementSummary{grid-template-columns:1fr}.IIa07q_sourceManagementSummary dl,.IIa07q_sourceManagementCapabilities{grid-column:auto}.IIa07q_masthead{padding:8px 16px 2px}.IIa07q_alert,.IIa07q_notice{margin-inline:16px}.IIa07q_topNavigation{padding:0 16px}.IIa07q_workspacePicker>[data-part=label]{display:none}.IIa07q_workspacePicker button{width:min(170px,32vw)}.IIa07q_modalBackdrop{padding:max(10px, env(safe-area-inset-top,0px)) 0 0;align-items:flex-end}.IIa07q_modal,.IIa07q_modalWide{width:100vw;max-height:calc(100vh - max(10px, env(safe-area-inset-top,0px)));border-radius:var(--dsw-radius-xl) var(--dsw-radius-xl) 0 0;transform:translate3d(0, var(--mn-modal-drag-y,0px), 0);animation-name:IIa07q_mnemon-sheet-enter;animation-duration:.34s;animation-timing-function:cubic-bezier(.2,.82,.2,1)}.IIa07q_modalDragHandle{cursor:grab;touch-action:none;user-select:none;flex:none;place-items:center;width:100%;height:28px;display:grid}.IIa07q_modalDragHandle span{background:var(--mn-line-strong);border-radius:999px;width:36px;height:4px;transition:width .14s,background-color .14s}.IIa07q_modal[data-dragging] .IIa07q_modalDragHandle{cursor:grabbing}.IIa07q_modal[data-dragging] .IIa07q_modalDragHandle span{background:var(--dsw-alias-border-l4);width:44px}.IIa07q_modal>header{padding:10px max(14px, env(safe-area-inset-right,0px)) 12px max(14px, env(safe-area-inset-left,0px));gap:12px}.IIa07q_modal>header p{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.IIa07q_modal>header .IIa07q_iconButton{width:44px;height:44px;margin:-4px -5px -4px 0}.IIa07q_modalBody{padding:14px max(14px, env(safe-area-inset-right,0px)) 18px max(14px, env(safe-area-inset-left,0px));scrollbar-gutter:auto;scroll-padding-bottom:12px}.IIa07q_modalBody button{min-height:44px}.IIa07q_modalFooter{padding:10px max(14px, env(safe-area-inset-right,0px)) calc(10px + env(safe-area-inset-bottom,0px)) max(14px, env(safe-area-inset-left,0px));flex-direction:column;align-items:stretch;gap:8px}.IIa07q_modalFooterMeta{max-width:none;margin:0}.IIa07q_modalFooterActions{grid-template-columns:minmax(82px,.55fr) minmax(0,1.45fr);gap:8px;width:100%;margin:0;display:grid}.IIa07q_modalFooterActions button{white-space:normal;min-width:0;min-height:44px;padding-block:8px}.IIa07q_versionList article>footer{flex-direction:column;align-items:stretch}.IIa07q_nav{gap:22px}.IIa07q_page{padding:16px 16px calc(170px + env(safe-area-inset-bottom,0px))}.IIa07q_pageHeader{gap:10px;display:grid}.IIa07q_pageHeaderMeta{justify-content:flex-start}.IIa07q_healthStrip article{flex-basis:100%}.IIa07q_providerHealthMeta{flex-direction:column;align-items:flex-end;gap:4px}.IIa07q_storageRoot{flex-direction:column;align-items:flex-start}.IIa07q_storageRoot>div:last-child{justify-items:start}.IIa07q_storageAreaGrid{grid-template-columns:1fr}}@media (width<=520px){.IIa07q_workspacePicker select{width:min(150px,39vw)}.IIa07q_nav{scroll-snap-type:x proximity;gap:18px}.IIa07q_nav button{scroll-snap-align:start}.IIa07q_pageHeaderMeta{align-items:stretch}.IIa07q_pageHeaderMeta>code{align-items:center;display:inline-flex}.IIa07q_pageHeaderMeta>button{flex:1}.IIa07q_emptyState{min-height:180px;padding:24px 16px}.IIa07q_formGrid{grid-template-columns:1fr}}@media (width<=360px){.IIa07q_modalFooterActions{grid-template-columns:1fr}}@media (height<=420px){.IIa07q_modal>header p{white-space:nowrap;text-overflow:ellipsis;display:block;overflow:hidden}}@media (width>=761px) and (height<=560px){.IIa07q_modalBackdrop{padding:8px}}@supports (height:100dvh){@media (width<=760px){.IIa07q_modal,.IIa07q_modalWide{max-height:calc(100dvh - max(10px, env(safe-area-inset-top,0px)))}}}@media (width<=1000px) and (height<=760px){.IIa07q_shell{min-height:0}.IIa07q_masthead{min-height:44px}}@media (width<=760px) and (pointer:coarse){.IIa07q_shell input,.IIa07q_shell select,.IIa07q_shell textarea{font-size:16px!important}}@media (pointer:coarse){.IIa07q_modal>header .IIa07q_iconButton{width:44px;min-width:44px;height:44px;min-height:44px}.IIa07q_modalBody button,.IIa07q_modalFooter button{min-height:44px}}@media (prefers-reduced-motion:reduce){.IIa07q_shell *,.IIa07q_shell :before,.IIa07q_shell :after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}.IIa07q_modalBackdrop,.IIa07q_modal{animation:none!important}}.IIa07q_page[data-source-page]>.IIa07q_workspacePicker{margin-bottom:16px}.IIa07q_page[data-source-page] .IIa07q_page{width:100%;min-height:0;margin:0;padding:0}";
|
|
3410
|
+
const css$12 = ".IIa07q_shell{--mn-bg:var(--dsw-alias-bg-base);--mn-backdrop:var(--dsw-alias-bg-overlay,var(--mn-bg));--mn-surface:linear-gradient(var(--mn-bg), var(--mn-bg)), linear-gradient(var(--mn-backdrop), var(--mn-backdrop)) var(--mn-bg);--mn-layer-1:var(--dsw-alias-bg-layer-1);--mn-layer-2:var(--dsw-alias-bg-layer-2);--mn-fill:var(--dsw-alias-bg-module-platform);--mn-input:var(--dsw-alias-bg-layer-1);--mn-text:var(--dsw-alias-label-primary);--mn-muted:var(--dsw-alias-label-secondary);--mn-faint:var(--dsw-alias-label-tertiary);--mn-caption:var(--dsw-alias-label-caption);--mn-line:var(--dsw-alias-border-l2);--mn-line-strong:var(--dsw-alias-border-l3);--mn-field-line:var(--dsw-alias-border-l4);--mn-card-line:var(--dsw-alias-settings-card-stroke);--mn-accent:var(--dsw-alias-state-business-primary);--mn-hover:var(--dsw-alias-interactive-bg-hover);--mn-pressed:var(--dsw-alias-interactive-bg-active);--mn-danger:var(--dsw-alias-state-error-primary);--mn-success:var(--dsw-alias-state-success-primary);--mn-warn:var(--dsw-alias-state-warn-primary);--mn-idle:var(--dsw-alias-state-idle-primary);--mn-priority:var(--dsw-alias-state-warn-primary);--mn-focus:var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));--mn-code:var(--ds-font-family-code,\"SFMono-Regular\", Consolas, monospace);--mn-sans:var(--dsw-font-family,-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif);box-sizing:border-box;min-width:0;height:100%;min-height:0;color:var(--mn-text);background:var(--mn-surface);font:13px/20px var(--mn-sans);-webkit-tap-highlight-color:transparent;flex-direction:column;display:flex;overflow:hidden}:has(>[data-conversation-scroll]>[data-slot=conversation\\.session]>*>[data-slot=conversation\\.view]>.IIa07q_shell[data-mnemon-surface=builtin])>[data-width-handle]{visibility:hidden;pointer-events:none}.IIa07q_shell *,.IIa07q_shell :before,.IIa07q_shell :after{box-sizing:border-box}:where(.IIa07q_shell) :where(button,input,select,textarea){color:inherit;font:inherit}:where(.IIa07q_shell) :where(button,select){touch-action:manipulation}.IIa07q_shell button:focus-visible,.IIa07q_shell input:focus-visible,.IIa07q_shell select:focus-visible,.IIa07q_shell textarea:focus-visible,.IIa07q_shell summary:focus-visible,.IIa07q_shell [role=button]:focus-visible{outline:var(--dsw-focus-ring-width,2px) solid var(--mn-focus);outline-offset:2px}.IIa07q_shell :is(textarea,input:not([type=checkbox],[type=radio],[type=file])):focus-visible{outline:none}.IIa07q_shell code{font-family:var(--mn-code);font-size:.92em}.IIa07q_masthead{background:var(--mn-surface);flex:none;align-items:center;gap:12px;min-height:48px;padding:10px 24px 4px;display:flex}.IIa07q_backButton{flex:none;align-items:center;gap:4px;min-width:max-content;display:inline-flex}.IIa07q_backButton>svg{flex:none}.IIa07q_brand{flex-wrap:wrap;flex:auto;align-items:center;gap:4px 10px;min-width:0;display:flex}.IIa07q_brand h1{flex:none;margin:0;font-size:16px;font-weight:500;line-height:24px}.IIa07q_storageMode{color:var(--mn-faint);background:var(--mn-fill);white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:4px;padding:1px 8px;font-size:11px;line-height:17px;display:inline-flex}.IIa07q_storageMode>strong{color:var(--mn-muted);font-weight:500}.IIa07q_statusCluster{color:var(--mn-faint);white-space:nowrap;flex:none;align-items:center;gap:6px;font-size:13px;line-height:20px;display:inline-flex}.IIa07q_statusDot{background:var(--mn-idle);border-radius:50%;flex:none;width:6px;height:6px}.IIa07q_online{background:var(--mn-success)}.IIa07q_offline{background:var(--mn-danger)}.IIa07q_checking{background:var(--mn-idle)}.IIa07q_iconButton{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--mn-caption);cursor:pointer;background:0 0;border:0;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.IIa07q_iconButton:hover:not(:disabled){color:var(--mn-muted);background:var(--mn-hover)}.IIa07q_iconButton>svg{flex:none}.IIa07q_headerActions{flex:none;justify-content:flex-end;align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_workspacePicker{min-width:0;color:var(--mn-faint);align-items:center;gap:6px;font-size:12px;line-height:18px;display:inline-flex}.IIa07q_workspacePicker>[data-part=label]{white-space:nowrap}.IIa07q_workspacePicker button{width:min(200px,22vw);min-width:112px}.IIa07q_alert,.IIa07q_inlineError{border-radius:var(--dsw-radius-md);color:var(--mn-danger);background:color-mix(in srgb, var(--mn-danger) 8%, transparent);padding:8px 12px;font-size:12px;line-height:18px}.IIa07q_alert{flex-direction:column;flex:none;gap:2px;margin:8px 24px 0;display:flex}.IIa07q_alert ul{margin:4px 0 0;padding-left:18px}.IIa07q_alert[role=status]{color:var(--dsw-alias-state-warn-label,var(--mn-text));background:var(--dsw-alias-state-warn-tertiary,color-mix(in srgb, var(--mn-warn) 12%, transparent))}.IIa07q_notice{flex:none;margin:8px 24px 0}.IIa07q_compositionStatus{border-radius:var(--dsw-radius-sm);min-width:0;color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:2px 6px;display:inline-flex}.IIa07q_compositionStatus:hover:not(:disabled){background:var(--mn-hover)}.IIa07q_compositionStatus:disabled{cursor:default}.IIa07q_compositionStrategy{color:var(--mn-muted)}.IIa07q_compositionStrategy:before{content:\"·\";color:var(--mn-faint);margin-right:6px}.IIa07q_compositionStatusWrap{min-width:0;display:inline-flex;position:relative}.IIa07q_compositionSummary{z-index:20;border:.5px solid var(--dsw-alias-border-l2);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-2);width:max-content;max-width:min(320px,100vw - 32px);box-shadow:var(--dsw-elevation-prominent);color:var(--mn-muted);white-space:normal;opacity:0;pointer-events:none;flex-direction:column;align-items:flex-start;gap:8px;padding:12px;font-size:12px;line-height:18px;transition:opacity .14s ease-out,transform .14s ease-out;display:flex;position:absolute;top:calc(100% + 6px);right:0;transform:translateY(-4px)}.IIa07q_compositionStatusWrap:hover .IIa07q_compositionSummary,.IIa07q_compositionStatusWrap:focus-within .IIa07q_compositionSummary{opacity:1;transition-delay:.2s;transform:none}.IIa07q_compositionSummary>strong{color:var(--mn-text);font-size:13px;font-weight:500;line-height:20px}.IIa07q_compositionLayers{flex-wrap:wrap;gap:6px;display:flex}.IIa07q_compositionHint{color:var(--mn-faint)}@media (prefers-reduced-motion:reduce){.IIa07q_compositionSummary{transition:none}}.IIa07q_workspaceMismatch{border:.5px solid color-mix(in srgb, var(--dsw-alias-state-warn-label,var(--mn-warn)) 20%, transparent);border-radius:var(--dsw-radius-sm);min-width:0;min-height:28px;color:var(--dsw-alias-state-warn-label,var(--mn-text));background:var(--dsw-alias-state-warn-tertiary,color-mix(in srgb, var(--mn-warn) 12%, transparent));white-space:nowrap;flex:none;align-items:center;gap:6px;padding:0 3px 0 10px;font-size:12px;font-weight:500;line-height:18px;display:inline-flex}.IIa07q_workspaceMismatch>button{border-radius:var(--dsw-radius-xs);min-height:22px;color:inherit;background:color-mix(in srgb, currentColor 10%, transparent);cursor:pointer;border:0;padding:0 8px;font-size:12px}.IIa07q_workspaceMismatch>button:hover{background:color-mix(in srgb, currentColor 16%, transparent)}.IIa07q_workspace{flex-direction:column;flex:1;min-height:0;display:flex}.IIa07q_topNavigation{border-bottom:.5px solid var(--mn-line-strong);background:var(--mn-surface);flex:none;align-items:flex-end;min-width:0;padding:0 24px;display:flex}.IIa07q_nav{overscroll-behavior-inline:contain;scrollbar-width:none;flex:1;align-items:flex-end;gap:28px;min-width:0;display:flex;overflow-x:auto}.IIa07q_nav::-webkit-scrollbar{display:none}.IIa07q_nav button{min-width:max-content;color:var(--mn-faint);text-align:left;cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:6px;margin-bottom:-.5px;padding:10px 0 9px;font-size:13px;font-weight:500;line-height:16px;display:flex;position:relative}.IIa07q_nav button:hover{color:var(--mn-muted)}.IIa07q_nav button[data-active]{color:var(--mn-accent)}.IIa07q_nav button[data-layer-disabled]:not([data-active]){color:var(--mn-caption)}.IIa07q_nav .IIa07q_layerDisabledBadge{border:.5px solid var(--mn-field-line);color:var(--mn-faint);border-radius:999px;align-items:center;padding:0 6px;font-size:11px;font-style:normal;font-weight:500;line-height:15px;display:inline-flex}.IIa07q_canvas{overscroll-behavior-x:contain;overscroll-behavior-y:auto;scroll-behavior:auto;-webkit-overflow-scrolling:touch;background:var(--mn-surface);flex:1;min-width:0;overflow:auto}.IIa07q_page{width:100%;min-height:100%;margin:0 auto;padding:20px 24px clamp(96px,14vh,150px)}.IIa07q_pageHeader{justify-content:space-between;align-items:flex-start;gap:16px 24px;margin-bottom:16px;display:flex}.IIa07q_pageHeader>div:first-child{min-width:0}.IIa07q_pageHeader h2{margin:0;font-size:16px;font-weight:500;line-height:24px}.IIa07q_pageHeader p{max-width:72ch;color:var(--mn-muted);margin:2px 0 0;font-size:13px;line-height:20px}.IIa07q_pageHeaderMeta{flex-wrap:wrap;flex:none;justify-content:flex-end;align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_pageHeaderMeta>code{border:.5px solid var(--mn-field-line);color:var(--mn-faint);font:500 11px/17px var(--mn-sans);font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;padding:1px 8px}.IIa07q_pageSpinner{width:20px;height:20px;color:var(--mn-faint);flex:none;place-items:center;display:inline-grid}.IIa07q_pageSpinner>i{border:2px solid color-mix(in srgb, currentColor 25%, transparent);border-top-color:currentColor;border-radius:50%;width:14px;height:14px;animation:.9s linear infinite IIa07q_mnemon-spin}.IIa07q_primaryButton,.IIa07q_secondaryButton,.IIa07q_ghostButton,.IIa07q_dangerButton,.IIa07q_dangerSolidButton{border-radius:var(--dsw-radius-md);min-height:32px;color:var(--mn-text);white-space:nowrap;cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;gap:4px;padding:0 12px;font-size:13px;font-weight:400;line-height:20px;transition:background-color .12s,color .12s,border-color .12s;display:inline-flex}.IIa07q_primaryButton{color:var(--dsw-alias-label-primary-foreground);background:var(--dsw-alias-button-primary-fill)}.IIa07q_primaryButton:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)}.IIa07q_secondaryButton{border:.5px solid var(--mn-line-strong)}.IIa07q_secondaryButton:hover:not(:disabled),.IIa07q_ghostButton:hover:not(:disabled){background:var(--mn-hover)}.IIa07q_secondaryButton:active:not(:disabled),.IIa07q_ghostButton:active:not(:disabled){background:var(--mn-pressed)}.IIa07q_dangerButton{color:var(--mn-danger)}.IIa07q_dangerButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-danger,color-mix(in srgb, var(--mn-danger) 8%, transparent))}.IIa07q_dangerSolidButton{color:var(--dsw-static-neutral-00,#fff);background:var(--mn-danger)}.IIa07q_dangerSolidButton:hover:not(:disabled){background:color-mix(in srgb, var(--mn-danger), black 8%)}.IIa07q_shell :where(button:disabled){cursor:not-allowed;opacity:.4}.IIa07q_emptyState{text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:12px;min-height:200px;padding:32px 24px;display:flex}.IIa07q_emptyGlyph{border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-lg);width:48px;height:48px;color:var(--mn-faint);flex:none;place-items:center;font-size:20px;line-height:1;display:grid}.IIa07q_emptyState h3{margin:0 0 4px;font-size:14px;font-weight:500;line-height:22px}.IIa07q_emptyState p{max-width:480px;color:var(--mn-faint);margin:0;font-size:13px;line-height:20px}.IIa07q_sourceManagementSummary{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);grid-template-columns:minmax(220px,1.2fr) minmax(260px,1fr) minmax(220px,1fr);gap:16px;margin-top:12px;padding:16px;display:grid}.IIa07q_sourceManagementIdentity{grid-template-columns:6px minmax(0,1fr);align-items:center;gap:10px;min-width:0;display:grid}.IIa07q_sourceManagementIdentity>span{background:var(--mn-success);border-radius:50%;width:6px;height:6px}.IIa07q_sourceManagementSummary[data-availability=degraded] .IIa07q_sourceManagementIdentity>span{background:var(--mn-warn)}.IIa07q_sourceManagementSummary[data-availability=unavailable] .IIa07q_sourceManagementIdentity>span{background:var(--mn-danger)}.IIa07q_sourceManagementIdentity>div{gap:2px;min-width:0;display:grid}.IIa07q_sourceManagementIdentity small,.IIa07q_sourceManagementCapabilities>small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_sourceManagementIdentity strong{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:500;line-height:20px;overflow:hidden}.IIa07q_sourceManagementIdentity code{color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.IIa07q_sourceManagementSummary dl{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:0;display:grid}.IIa07q_sourceManagementSummary dl>div{border-radius:var(--dsw-radius-sm);background:var(--mn-fill);align-content:center;gap:2px;min-width:0;padding:8px 10px;display:grid}.IIa07q_sourceManagementSummary dt{color:var(--mn-faint);font-size:11px;line-height:14px}.IIa07q_sourceManagementSummary dd{text-overflow:ellipsis;white-space:nowrap;margin:0;font-size:13px;line-height:20px;overflow:hidden}.IIa07q_sourceManagementSummary dd code{font-size:12px}.IIa07q_sourceManagementCapabilities{align-content:center;gap:6px;min-width:0;display:grid}.IIa07q_sourceManagementCapabilities>div{flex-wrap:wrap;gap:4px;display:flex}.IIa07q_sourceManagementCapabilities span{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_sourceManagementDiagnostics,.IIa07q_sourceManagementForm{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-top:12px;padding:16px}.IIa07q_sourceManagementDiagnostics h3,.IIa07q_sourceManagementForm h3{margin:0;font-size:14px;font-weight:500;line-height:22px}.IIa07q_sourceManagementDiagnostics ul{color:var(--mn-muted);gap:4px;margin:8px 0 0;padding-left:18px;font-size:12px;line-height:18px;display:grid}.IIa07q_sourceManagementForm>div:first-child p{color:var(--mn-faint);margin:2px 0 0;font-size:12px;line-height:18px}.IIa07q_sourceManagementForm .IIa07q_formGrid label>small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_sourceManagementForm .IIa07q_formGrid input[type=checkbox]{width:16px;min-width:0;height:16px;min-height:0;accent-color:var(--dsw-alias-brand-primary)}.IIa07q_sectionSpinner{z-index:6;width:20px;height:20px;color:var(--mn-faint);place-items:center;display:grid;position:absolute;top:10px;right:10px}.IIa07q_sectionSpinner>i{border:2px solid color-mix(in srgb, currentColor 25%, transparent);border-top-color:currentColor;border-radius:50%;width:14px;height:14px;animation:.9s linear infinite IIa07q_mnemon-spin}@keyframes IIa07q_mnemon-spin{to{transform:rotate(360deg)}}.IIa07q_inlineError{margin:0 0 12px}.IIa07q_loading{color:var(--mn-faint);padding:16px 0;font-size:13px}.IIa07q_bodyEdit{gap:12px;padding-top:2px;display:grid}.IIa07q_bodyEdit label,.IIa07q_formGrid label{color:var(--mn-muted);gap:6px;font-size:12px;font-weight:500;line-height:18px;display:grid}.IIa07q_bodyEdit input,.IIa07q_bodyEdit select,.IIa07q_bodyEdit textarea,.IIa07q_formGrid select,.IIa07q_formGrid input{border:.5px solid var(--mn-field-line);border-radius:var(--dsw-radius-md);width:100%;min-width:0;min-height:32px;color:var(--mn-text);background:var(--mn-input);outline:0;padding:5px 10px;font-size:13px;font-weight:400;line-height:20px}.IIa07q_bodyEdit textarea{resize:vertical}.IIa07q_bodyEdit input::placeholder,.IIa07q_bodyEdit textarea::placeholder,.IIa07q_formGrid input::placeholder{color:var(--dsw-alias-label-dimmed)}.IIa07q_bodyEdit input:focus,.IIa07q_bodyEdit select:focus,.IIa07q_bodyEdit textarea:focus,.IIa07q_formGrid select:focus,.IIa07q_formGrid input:focus{border-color:var(--mn-accent)}.IIa07q_providerFieldControl{gap:4px;min-width:0;display:grid}.IIa07q_providerFieldControl input[type=checkbox]{width:16px;height:16px;min-height:0;accent-color:var(--dsw-alias-brand-primary);margin:2px 0;padding:0}.IIa07q_bodyDeleteConfirm{gap:16px;display:grid}.IIa07q_bodyDeleteConfirm>p{color:var(--mn-muted);margin:0;font-size:13px;line-height:20px}.IIa07q_bodyDeleteSummary{border-radius:var(--dsw-radius-md);background:color-mix(in srgb, var(--mn-danger) 6%, transparent);gap:4px;padding:12px;display:grid}.IIa07q_bodyDeleteSummary strong{font-size:13px;font-weight:500}.IIa07q_bodyDeleteContent{white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:13px;font-weight:400;line-height:20px}.IIa07q_bodyDeleteSummary span{color:var(--mn-muted);font-size:12px;line-height:18px}.IIa07q_sectionHeading{justify-content:space-between;align-items:center;gap:16px;min-height:36px;margin-bottom:8px;display:flex}.IIa07q_sectionHeading h3{margin:0;font-size:14px;font-weight:500;line-height:22px}.IIa07q_sectionHeading>div>span{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_sectionHeading>strong{color:var(--mn-muted);background:var(--mn-fill);font-variant-numeric:tabular-nums;border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_sectionHeading button{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--mn-caption);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.IIa07q_sectionHeading button:hover:not(:disabled){color:var(--mn-muted);background:var(--mn-hover)}.IIa07q_runtimeNotice{border-radius:var(--dsw-radius-md);color:var(--mn-success);background:color-mix(in srgb, var(--mn-success) 8%, transparent);margin-bottom:12px;padding:8px 12px;font-size:12px;line-height:18px}.IIa07q_runtimeFootnote{color:var(--mn-faint);margin:12px 2px 0;font-size:12px;line-height:18px}.IIa07q_formGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:12px;display:grid}.IIa07q_listProgress{border-top:.5px solid var(--mn-line);min-height:56px;color:var(--mn-faint);justify-content:center;align-items:center;gap:12px;margin-top:12px;padding:10px;font-size:12px;line-height:18px;display:flex}.IIa07q_compactListProgress{border-top:.5px solid var(--mn-line);color:var(--mn-faint);text-align:center;justify-items:stretch;gap:8px;margin-top:8px;padding:10px 2px 2px;font-size:12px;line-height:18px;display:grid}.IIa07q_compactListProgress button{width:100%}.IIa07q_modalPortal{z-index:1000;isolation:isolate;pointer-events:none;position:fixed;inset:0}.IIa07q_modalTheme.IIa07q_modalTheme.IIa07q_modalTheme{width:auto;min-width:0;height:auto;min-height:0;color:var(--mn-text);pointer-events:none;background:0 0;display:block;position:absolute;inset:0;overflow:visible}.IIa07q_modalBackdrop{z-index:0;overscroll-behavior:contain;padding:max(24px, var(--dsh-frame-top-clearance,24px)) 24px;background:var(--dsw-alias-bg-mask-1);backdrop-filter:var(--dsw-mask-blur);touch-action:none;pointer-events:auto;justify-content:center;align-items:center;animation:.18s ease-out both IIa07q_mnemon-dialog-backdrop-enter;display:flex;position:fixed;inset:0;overflow:hidden}.IIa07q_modal{box-sizing:border-box;border-radius:var(--dsw-radius-panel);background:linear-gradient(var(--mn-layer-2), var(--mn-layer-2)), var(--mn-surface);width:min(640px,100%);min-height:0;max-height:100%;box-shadow:var(--dsw-elevation-prominent);touch-action:auto;transform-origin:50% 100%;backface-visibility:hidden;will-change:transform, opacity;border:0;flex-direction:column;animation:.2s cubic-bezier(.2,.75,.2,1) both IIa07q_mnemon-dialog-enter;display:flex;overflow:hidden}.IIa07q_modalBackdrop[data-closing],.IIa07q_modal[data-closing]{pointer-events:none}.IIa07q_modalDragHandle{display:none}.IIa07q_modalWide{width:min(760px,100%)}.IIa07q_modal>header{flex:none;justify-content:space-between;align-items:flex-start;gap:8px;padding:22px 14px 12px 24px;display:flex}.IIa07q_modal>header>div{min-width:0;padding-top:2px}.IIa07q_modal>header h2{margin:0;font-size:16px;font-weight:500;line-height:24px}.IIa07q_modal>header p{overflow-wrap:anywhere;max-width:64ch;color:var(--mn-muted);margin:4px 0 0;font-size:13px;line-height:20px}.IIa07q_modal>header .IIa07q_iconButton{color:var(--mn-muted);flex:none}.IIa07q_modalBody{overscroll-behavior:contain;scrollbar-gutter:stable;touch-action:pan-y;-webkit-overflow-scrolling:touch;min-height:0;padding:8px 24px 20px;overflow:hidden auto}.IIa07q_modalFooter{background:0 0;flex:none;justify-content:flex-end;align-items:center;gap:12px;padding:4px 24px 24px;display:flex}.IIa07q_modalFooter button{min-height:36px;padding-inline:14px}.IIa07q_modalFooterMeta{color:var(--mn-faint);margin-right:auto;font-size:12px;line-height:18px}.IIa07q_modalFooterActions{justify-content:flex-end;align-items:center;gap:8px;min-width:0;margin-left:auto;display:flex}@keyframes IIa07q_mnemon-dialog-backdrop-enter{0%{opacity:0}}@keyframes IIa07q_mnemon-dialog-enter{0%{opacity:0;transform:translateY(8px)scale(.985)}}@keyframes IIa07q_mnemon-sheet-enter{0%{transform:translateY(calc(100% + 32px))}to{transform:translate3d(0, var(--mn-modal-drag-y,0px), 0)}}@keyframes IIa07q_mnemon-metadata-sweep{to{transform:translate(120%)}}@keyframes IIa07q_mnemon-metadata-refreshed{0%{border-color:color-mix(in srgb, var(--mn-accent) 60%, var(--mn-card-line));box-shadow:0 0 0 2px color-mix(in srgb, var(--mn-accent) 14%, transparent)}to{border-color:var(--mn-card-line);box-shadow:0 0 #0000}}.IIa07q_healthStrip{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);flex-wrap:wrap;margin-bottom:16px;display:flex;position:relative;overflow:hidden}.IIa07q_asyncStatusBlock{min-width:0;min-height:36px;position:relative}.IIa07q_healthStrip article{box-sizing:border-box;border-top:.5px solid var(--mn-line);border-left:.5px solid var(--mn-line);flex:150px;align-items:flex-start;gap:10px;min-width:0;min-height:76px;margin:-.5px 0 0 -.5px;padding:14px 16px;display:flex}.IIa07q_healthStrip article>div{min-width:0}.IIa07q_healthStrip small{color:var(--mn-faint);margin-bottom:2px;font-size:12px;line-height:18px;display:block}.IIa07q_healthStrip strong{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:500;line-height:22px;display:block;overflow:hidden}.IIa07q_healthStrip p{color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;margin:2px 0 0;font-size:12px;line-height:18px;overflow:hidden}.IIa07q_healthIndicator{border-radius:50%;flex:none;width:6px;height:6px;margin-top:6px}.IIa07q_healthGood{background:var(--mn-success)}.IIa07q_healthBad{background:var(--mn-danger)}.IIa07q_healthMuted{background:var(--mn-idle)}.IIa07q_providerHealth{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-bottom:16px;padding:16px}.IIa07q_providerHealthList{margin-top:8px}.IIa07q_providerHealthList article{align-items:center;gap:12px;min-width:0;min-height:56px;padding:8px 0;display:flex}.IIa07q_providerHealthList article+article{border-top:.5px solid var(--mn-line)}.IIa07q_providerHealthOff{border-top:.5px solid var(--mn-line);min-width:0;color:var(--mn-faint);justify-content:space-between;align-items:center;gap:12px;margin-top:4px;padding-top:10px;font-size:12px;line-height:18px;display:flex}.IIa07q_providerHealthMark{box-sizing:border-box;border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-md);flex:none;place-items:center;width:36px;height:36px;padding:6px;display:grid;overflow:hidden}.IIa07q_providerHealthMark>img,.IIa07q_providerHealthMark>svg{object-fit:contain;border-radius:4px;width:100%;height:100%;display:block}.IIa07q_providerHealthCopy{flex:1;gap:0;min-width:0;display:grid}.IIa07q_providerHealthCopy strong{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:500;line-height:20px;overflow:hidden}.IIa07q_providerHealthCopy small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_providerHealthCopy p{color:var(--mn-danger);text-overflow:ellipsis;white-space:nowrap;margin:2px 0 0;font-size:12px;line-height:18px;overflow:hidden}.IIa07q_providerHealthMeta{flex:none;align-items:center;gap:6px;display:flex}.IIa07q_providerHealthMeta small{color:var(--mn-faint);font-variant-numeric:tabular-nums;font-size:12px;line-height:18px}.IIa07q_providerHealthSignal{background:var(--mn-idle);border-radius:50%;width:6px;height:6px}.IIa07q_providerHealthList article[data-status=healthy] .IIa07q_providerHealthSignal{background:var(--mn-success)}.IIa07q_providerHealthList article[data-status=unhealthy] .IIa07q_providerHealthSignal{background:var(--mn-danger)}.IIa07q_providerHealthList article[data-status=idle] .IIa07q_providerHealthSignal{background:var(--mn-idle)}.IIa07q_storageDomains{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-bottom:16px;padding:16px}.IIa07q_storageRoot{border-radius:var(--dsw-radius-md);background:var(--mn-fill);justify-content:space-between;align-items:center;gap:16px;min-width:0;margin-top:12px;padding:10px 12px;display:flex}.IIa07q_storageRoot>div:first-child{gap:2px;min-width:0;display:grid}.IIa07q_storageRoot span,.IIa07q_storageRoot small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_storageRoot code{color:var(--mn-muted);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.IIa07q_storageRoot>div:last-child{flex:none;justify-items:end;gap:2px;display:grid}.IIa07q_storageRoot strong{font-variant-numeric:tabular-nums;font-size:13px;font-weight:500}.IIa07q_storageAreaGrid{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:8px;display:grid}.IIa07q_storageAreaGrid article{box-sizing:border-box;border:.5px solid var(--mn-line);border-radius:var(--dsw-radius-md);flex-direction:column;min-width:0;min-height:148px;padding:12px 14px;display:flex}.IIa07q_storageAreaGrid article>header{justify-content:space-between;align-items:center;gap:8px;display:flex}.IIa07q_storageAreaGrid article>header>div{align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_storageAreaGrid article>header span{background:var(--mn-idle);border-radius:50%;flex:none;width:6px;height:6px}.IIa07q_storageAreaGrid article[data-status=ready]>header span{background:var(--mn-success)}.IIa07q_storageAreaGrid article[data-status=invalid]>header span{background:var(--mn-danger)}.IIa07q_storageAreaGrid article>header strong{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;overflow:hidden}.IIa07q_storageAreaGrid article>header em{color:var(--mn-faint);white-space:nowrap;font-size:11px;font-style:normal;line-height:14px}.IIa07q_storageAreaMetric{align-items:baseline;gap:6px;margin-top:12px;display:flex}.IIa07q_storageAreaMetric strong{font-variant-numeric:tabular-nums;font-size:20px;font-weight:500;line-height:28px}.IIa07q_storageAreaMetric span{color:var(--mn-faint);font-size:12px}.IIa07q_storageAreaMetric code{color:var(--mn-faint);margin-left:auto;font-size:11px}.IIa07q_storageAreaGrid article>p{min-height:36px;color:var(--mn-faint);margin:6px 0 8px;font-size:12px;line-height:18px}.IIa07q_storagePath{border-top:.5px solid var(--mn-line);color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;margin-top:auto;padding-top:8px;font-size:11px;line-height:16px;display:block;overflow:hidden}.IIa07q_storageAreaGrid article>small{color:var(--mn-danger);margin-top:6px;font-size:12px;line-height:18px;display:block}.IIa07q_storageUnavailable{border-radius:var(--dsw-radius-md);min-height:120px;color:var(--mn-muted);background:var(--mn-fill);text-align:center;place-content:center;gap:4px;margin-top:12px;display:grid}.IIa07q_storageUnavailable strong{font-size:13px;font-weight:500}.IIa07q_storageUnavailable p{max-width:520px;color:var(--mn-faint);margin:0;font-size:12px;line-height:18px}.IIa07q_storageFootnote{color:var(--mn-faint);margin:12px 0 0;font-size:12px;line-height:18px}.IIa07q_statusSectionHeader{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.IIa07q_statusSectionHeader h3{margin:0;font-size:14px;font-weight:500;line-height:22px}.IIa07q_statusSectionHeader p{max-width:640px;color:var(--mn-faint);margin:2px 0 0;font-size:12px;line-height:18px}.IIa07q_phaseBadge{color:var(--mn-muted);background:var(--mn-fill);font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;flex:none;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_statusHeaderActions{align-items:center;gap:8px;display:flex}.IIa07q_versionDialogBody{grid-template-columns:minmax(0,1fr);gap:12px;display:grid}.IIa07q_versionChecking{min-height:112px;color:var(--mn-muted);justify-content:center;align-items:center;gap:10px;font-size:13px;display:flex}.IIa07q_versionChecking span{border:2px solid color-mix(in srgb, currentColor 25%, transparent);border-top-color:currentColor;border-radius:50%;width:14px;height:14px;animation:.9s linear infinite IIa07q_mnemon-spin}.IIa07q_versionError,.IIa07q_versionResult{border-radius:var(--dsw-radius-md);color:var(--mn-danger);background:color-mix(in srgb, var(--mn-danger) 8%, transparent);padding:10px 12px}.IIa07q_versionResult{color:var(--mn-success);background:color-mix(in srgb, var(--mn-success) 8%, transparent)}.IIa07q_versionError strong,.IIa07q_versionResult strong{font-size:13px;font-weight:500}.IIa07q_versionError p,.IIa07q_versionResult p{color:var(--mn-muted);margin:2px 0 0;font-size:12px;line-height:18px}.IIa07q_versionList{grid-template-columns:minmax(0,1fr);gap:8px;display:grid}.IIa07q_versionList article{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);padding:12px 14px}.IIa07q_versionList article>header{justify-content:space-between;align-items:center;gap:12px;display:flex}.IIa07q_versionList article>header>div{align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_versionList article>header strong{font-size:14px;font-weight:500;line-height:22px}.IIa07q_versionList article>header span{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_versionList article>header em{color:var(--mn-success);white-space:nowrap;font-size:12px;font-style:normal;line-height:18px}.IIa07q_versionList article[data-outdated]>header em{color:var(--mn-accent)}.IIa07q_versionNumbers{grid-template-columns:1fr auto 1fr;align-items:end;gap:10px;margin-top:10px;display:grid}.IIa07q_versionNumbers>div{gap:2px;display:grid}.IIa07q_versionNumbers small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_versionNumbers code{font-size:13px}.IIa07q_versionNumbers>span{color:var(--mn-faint);padding-bottom:1px}.IIa07q_versionLocation{min-width:0;color:var(--mn-faint);gap:6px;margin-top:8px;font-size:12px;line-height:18px;display:flex}.IIa07q_versionLocation>span{flex:none}.IIa07q_versionLocation>code{min-width:0;color:inherit;text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.IIa07q_versionList article>footer{border-top:.5px solid var(--mn-line);justify-content:space-between;align-items:flex-end;gap:16px;margin-top:10px;padding-top:10px;display:flex}.IIa07q_versionList article>footer p{max-width:470px;color:var(--mn-muted);margin:0;font-size:12px;line-height:18px}.IIa07q_versionList article>footer button{flex:none}.IIa07q_versionList article>header em[data-state=unknown],.IIa07q_versionList article>header em[data-state=local],.IIa07q_versionList article>header em[data-state=missing]{color:var(--mn-faint)}.IIa07q_versionList article>header em[data-state=restart]{color:var(--mn-accent)}.IIa07q_versionNotice{color:var(--mn-muted);margin:8px 0 0;font-size:12px;line-height:18px}.IIa07q_versionGuidance{border-radius:var(--dsw-radius-md);background:var(--mn-fill);gap:6px;min-width:0;margin-top:10px;padding:10px 12px;display:grid}.IIa07q_versionGuidance>strong{font-size:13px;font-weight:500}.IIa07q_versionGuidance>p{color:var(--mn-muted);margin:0;font-size:12px;line-height:18px}.IIa07q_versionGuidance>a{color:var(--dsw-alias-link,var(--mn-accent));justify-self:start;font-size:12px}.IIa07q_versionGuidanceDetails{min-width:0;color:var(--mn-muted);font-size:12px;line-height:18px}.IIa07q_versionGuidanceDetails>summary{cursor:pointer}.IIa07q_versionGuidanceDetails>p{margin:8px 0}.IIa07q_versionGuidanceDetails>a{color:var(--dsw-alias-link,var(--mn-accent))}.IIa07q_versionCommand{border-radius:var(--dsw-radius-sm);background:var(--mn-layer-1);flex-wrap:wrap;align-items:center;gap:8px;min-width:0;padding:8px 10px;display:flex}.IIa07q_versionCommand>code{overflow-wrap:anywhere;white-space:pre-wrap;user-select:text;flex:1;min-width:0;font-size:12px}.IIa07q_versionCommand>button{flex:none}.IIa07q_versionCommand>small{color:var(--mn-faint);flex-basis:100%;font-size:12px}.IIa07q_versionPackages{border-top:.5px solid var(--mn-line);min-width:0;margin-top:12px}.IIa07q_versionPackagesToggle{width:100%;min-height:44px;color:var(--mn-text);text-align:start;cursor:pointer;background:0 0;border:0;flex-wrap:wrap;align-items:center;gap:8px;padding:10px 0 0;display:flex}.IIa07q_versionPackagesToggle>strong{font-size:13px;font-weight:500}.IIa07q_versionPackagesToggle>small{color:var(--mn-faint);margin-left:auto;font-size:12px}.IIa07q_versionPackages h4{color:var(--mn-faint);margin:16px 0 8px;font-size:12px;font-weight:500;line-height:18px}.IIa07q_versionPackages ul{gap:8px;margin:0;padding:0;list-style:none;display:grid}.IIa07q_versionPackage{border:.5px solid var(--mn-line);border-radius:var(--dsw-radius-md);min-width:0;padding:10px 12px}.IIa07q_versionPackageHeader{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:6px 12px;display:flex}.IIa07q_versionPackageHeader strong{overflow-wrap:anywhere;min-width:0;font-size:13px;font-weight:500}.IIa07q_versionPackageHeader em{color:var(--mn-faint);font-size:12px;font-style:normal}.IIa07q_versionPackageHeader em[data-state=available],.IIa07q_versionPackageHeader em[data-state=restart]{color:var(--mn-accent)}.IIa07q_versionPackageHeader em[data-state=current]{color:var(--mn-success)}.IIa07q_versionPackageMeta,.IIa07q_versionPackageNumbers{color:var(--mn-faint);flex-wrap:wrap;gap:6px 14px;margin-top:6px;font-size:12px;line-height:18px;display:flex}.IIa07q_versionPackageNumbers code{color:var(--mn-text)}.IIa07q_versionPackageAction{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin-top:8px;display:flex}.IIa07q_versionPackageAction p{min-width:150px;color:var(--mn-muted);flex:1;margin:0;font-size:12px;line-height:18px}.IIa07q_versionPackageAction button{flex:none}@media (width<=1000px){.IIa07q_sourceManagementSummary{grid-template-columns:1fr 1fr}.IIa07q_sourceManagementCapabilities{grid-column:1/-1}.IIa07q_storageAreaGrid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=760px){.IIa07q_shell{min-height:0;overflow:hidden}.IIa07q_sourceManagementSummary{grid-template-columns:1fr}.IIa07q_sourceManagementSummary dl,.IIa07q_sourceManagementCapabilities{grid-column:auto}.IIa07q_masthead{padding:8px 16px 2px}.IIa07q_alert,.IIa07q_notice{margin-inline:16px}.IIa07q_topNavigation{padding:0 16px}.IIa07q_workspacePicker>[data-part=label]{display:none}.IIa07q_workspacePicker button{width:min(170px,32vw)}.IIa07q_modalBackdrop{padding:max(10px, env(safe-area-inset-top,0px)) 0 0;align-items:flex-end}.IIa07q_modal,.IIa07q_modalWide{width:100vw;max-height:calc(100vh - max(10px, env(safe-area-inset-top,0px)));border-radius:var(--dsw-radius-xl) var(--dsw-radius-xl) 0 0;transform:translate3d(0, var(--mn-modal-drag-y,0px), 0);animation-name:IIa07q_mnemon-sheet-enter;animation-duration:.34s;animation-timing-function:cubic-bezier(.2,.82,.2,1)}.IIa07q_modalDragHandle{cursor:grab;touch-action:none;user-select:none;flex:none;place-items:center;width:100%;height:28px;display:grid}.IIa07q_modalDragHandle span{background:var(--mn-line-strong);border-radius:999px;width:36px;height:4px;transition:width .14s,background-color .14s}.IIa07q_modal[data-dragging] .IIa07q_modalDragHandle{cursor:grabbing}.IIa07q_modal[data-dragging] .IIa07q_modalDragHandle span{background:var(--dsw-alias-border-l4);width:44px}.IIa07q_modal>header{padding:10px max(14px, env(safe-area-inset-right,0px)) 12px max(14px, env(safe-area-inset-left,0px));gap:12px}.IIa07q_modal>header p{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.IIa07q_modal>header .IIa07q_iconButton{width:44px;height:44px;margin:-4px -5px -4px 0}.IIa07q_modalBody{padding:14px max(14px, env(safe-area-inset-right,0px)) 18px max(14px, env(safe-area-inset-left,0px));scrollbar-gutter:auto;scroll-padding-bottom:12px}.IIa07q_modalBody button{min-height:44px}.IIa07q_modalFooter{padding:10px max(14px, env(safe-area-inset-right,0px)) calc(10px + env(safe-area-inset-bottom,0px)) max(14px, env(safe-area-inset-left,0px));flex-direction:column;align-items:stretch;gap:8px}.IIa07q_modalFooterMeta{max-width:none;margin:0}.IIa07q_modalFooterActions{grid-template-columns:minmax(82px,.55fr) minmax(0,1.45fr);gap:8px;width:100%;margin:0;display:grid}.IIa07q_modalFooterActions button{white-space:normal;min-width:0;min-height:44px;padding-block:8px}.IIa07q_versionList article>footer{flex-direction:column;align-items:stretch}.IIa07q_nav{gap:22px}.IIa07q_page{padding:16px 16px calc(170px + env(safe-area-inset-bottom,0px))}.IIa07q_pageHeader{gap:10px;display:grid}.IIa07q_pageHeaderMeta{justify-content:flex-start}.IIa07q_healthStrip article{flex-basis:100%}.IIa07q_providerHealthMeta{flex-direction:column;align-items:flex-end;gap:4px}.IIa07q_storageRoot{flex-direction:column;align-items:flex-start}.IIa07q_storageRoot>div:last-child{justify-items:start}.IIa07q_storageAreaGrid{grid-template-columns:1fr}}@media (width<=520px){.IIa07q_workspacePicker select{width:min(150px,39vw)}.IIa07q_nav{scroll-snap-type:x proximity;gap:18px}.IIa07q_nav button{scroll-snap-align:start}.IIa07q_pageHeaderMeta{align-items:stretch}.IIa07q_pageHeaderMeta>code{align-items:center;display:inline-flex}.IIa07q_pageHeaderMeta>button{flex:1}.IIa07q_emptyState{min-height:180px;padding:24px 16px}.IIa07q_formGrid{grid-template-columns:1fr}}@media (width<=360px){.IIa07q_modalFooterActions{grid-template-columns:1fr}}@media (height<=420px){.IIa07q_modal>header p{white-space:nowrap;text-overflow:ellipsis;display:block;overflow:hidden}}@media (width>=761px) and (height<=560px){.IIa07q_modalBackdrop{padding:8px}}@supports (height:100dvh){@media (width<=760px){.IIa07q_modal,.IIa07q_modalWide{max-height:calc(100dvh - max(10px, env(safe-area-inset-top,0px)))}}}@media (width<=1000px) and (height<=760px){.IIa07q_shell{min-height:0}.IIa07q_masthead{min-height:44px}}@media (width<=760px) and (pointer:coarse){.IIa07q_shell input,.IIa07q_shell select,.IIa07q_shell textarea{font-size:16px!important}}@media (pointer:coarse){.IIa07q_modal>header .IIa07q_iconButton{width:44px;min-width:44px;height:44px;min-height:44px}.IIa07q_modalBody button,.IIa07q_modalFooter button{min-height:44px}}@media (prefers-reduced-motion:reduce){.IIa07q_shell *,.IIa07q_shell :before,.IIa07q_shell :after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}.IIa07q_modalBackdrop,.IIa07q_modal{animation:none!important}}.IIa07q_page[data-source-page]>.IIa07q_workspacePicker{margin-bottom:16px}.IIa07q_page[data-source-page] .IIa07q_page{width:100%;min-height:0;margin:0;padding:0}";
|
|
2851
3411
|
const tagId$12 = "dsh-mnemon/src/client/MnemonView.module.css";
|
|
2852
3412
|
if (typeof document !== "undefined") {
|
|
2853
3413
|
let tag = document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$12) + "]");
|
|
@@ -4497,7 +5057,10 @@ window.__ModuleLoader__.load({
|
|
|
4497
5057
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
4498
5058
|
className: MnemonSettingsCard_module_css_default.settingCopy,
|
|
4499
5059
|
children: [
|
|
4500
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", {
|
|
5060
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", {
|
|
5061
|
+
id: props.titleId,
|
|
5062
|
+
children: props.label
|
|
5063
|
+
}),
|
|
4501
5064
|
props.hint !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: props.hint }),
|
|
4502
5065
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Reveal, { children: props.note === void 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
4503
5066
|
className: MnemonSettingsCard_module_css_default.rowNote,
|
|
@@ -5864,34 +6427,1530 @@ window.__ModuleLoader__.load({
|
|
|
5864
6427
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
5865
6428
|
variant: "outline",
|
|
5866
6429
|
size: "sm",
|
|
5867
|
-
disabled: client === null || busy !== null,
|
|
5868
|
-
onClick: () => input.current?.click(),
|
|
5869
|
-
children: busy === "inspect" ? t("config.packInspecting") : t("config.packImportZip")
|
|
5870
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
5871
|
-
variant: "outline",
|
|
6430
|
+
disabled: client === null || busy !== null,
|
|
6431
|
+
onClick: () => input.current?.click(),
|
|
6432
|
+
children: busy === "inspect" ? t("config.packInspecting") : t("config.packImportZip")
|
|
6433
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
6434
|
+
variant: "outline",
|
|
6435
|
+
size: "sm",
|
|
6436
|
+
disabled: client === null || busy !== null || target === null,
|
|
6437
|
+
onClick: () => void exportZip(),
|
|
6438
|
+
children: busy === "export" ? t("config.packExporting") : t("config.packExportZip")
|
|
6439
|
+
})]
|
|
6440
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
6441
|
+
ref: input,
|
|
6442
|
+
className: MnemonSettingsCard_module_css_default.visuallyHidden,
|
|
6443
|
+
type: "file",
|
|
6444
|
+
accept: ZIP_ACCEPT,
|
|
6445
|
+
"aria-label": t("config.packChooseZip"),
|
|
6446
|
+
onChange: chooseFile
|
|
6447
|
+
})]
|
|
6448
|
+
}),
|
|
6449
|
+
pending !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6450
|
+
className: MnemonSettingsCard_module_css_default.importBar,
|
|
6451
|
+
role: "status",
|
|
6452
|
+
children: [
|
|
6453
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: pending.preview.fileName ?? t("config.packUnnamedZip") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.packZipReady", {
|
|
6454
|
+
components: pending.preview.manifest.components.length,
|
|
6455
|
+
items,
|
|
6456
|
+
size: humanBytes(pending.preview.archiveBytes)
|
|
6457
|
+
}) })] }),
|
|
6458
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
6459
|
+
variant: "ghost",
|
|
6460
|
+
size: "sm",
|
|
6461
|
+
disabled: busy !== null,
|
|
6462
|
+
onClick: () => setPending(null),
|
|
6463
|
+
children: t("common.cancel")
|
|
6464
|
+
}),
|
|
6465
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
6466
|
+
variant: "primary",
|
|
6467
|
+
size: "sm",
|
|
6468
|
+
disabled: busy !== null,
|
|
6469
|
+
onClick: () => void importZip(),
|
|
6470
|
+
children: busy === "import" ? t("config.packImporting") : t("config.packImportZipAction")
|
|
6471
|
+
})
|
|
6472
|
+
]
|
|
6473
|
+
}),
|
|
6474
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6475
|
+
className: MnemonSettingsCard_module_css_default.packFeedback,
|
|
6476
|
+
"aria-live": "polite",
|
|
6477
|
+
children: [
|
|
6478
|
+
failed !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6479
|
+
className: MnemonSettingsCard_module_css_default.error,
|
|
6480
|
+
role: "alert",
|
|
6481
|
+
children: t("config.packFailed", { error: failed })
|
|
6482
|
+
}),
|
|
6483
|
+
notice !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6484
|
+
className: MnemonSettingsCard_module_css_default.packSuccess,
|
|
6485
|
+
children: notice
|
|
6486
|
+
}),
|
|
6487
|
+
client === null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6488
|
+
className: MnemonSettingsCard_module_css_default.readOnly,
|
|
6489
|
+
children: t("config.packUnavailable")
|
|
6490
|
+
})
|
|
6491
|
+
]
|
|
6492
|
+
})
|
|
6493
|
+
]
|
|
6494
|
+
});
|
|
6495
|
+
}
|
|
6496
|
+
//#endregion
|
|
6497
|
+
//#region src/client/GlobalLocationSetting.tsx
|
|
6498
|
+
/** The default or custom location control: the storage directory, Native and workspace-aware providers. */
|
|
6499
|
+
function GlobalLocationSetting(props) {
|
|
6500
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6501
|
+
className: `${MnemonSettingsCard_module_css_default.globalLocationSetting}${props.className === void 0 ? "" : ` ${props.className}`}`,
|
|
6502
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6503
|
+
className: MnemonSettingsCard_module_css_default.nativeLocation,
|
|
6504
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6505
|
+
className: MnemonSettingsCard_module_css_default.settingCopy,
|
|
6506
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: props.label }), props.hint !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: props.hint })]
|
|
6507
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6508
|
+
className: MnemonSettingsCard_module_css_default.inlineChoices,
|
|
6509
|
+
role: "radiogroup",
|
|
6510
|
+
"aria-label": props.ariaLabel,
|
|
6511
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
6512
|
+
type: "radio",
|
|
6513
|
+
name: props.name,
|
|
6514
|
+
checked: props.workspace || !props.custom,
|
|
6515
|
+
disabled: props.disabled || props.workspace,
|
|
6516
|
+
onClick: props.onInteract,
|
|
6517
|
+
onChange: () => props.onChange(false)
|
|
6518
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: props.defaultLabel })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
6519
|
+
type: "radio",
|
|
6520
|
+
name: props.name,
|
|
6521
|
+
checked: !props.workspace && props.custom,
|
|
6522
|
+
disabled: props.disabled || props.workspace,
|
|
6523
|
+
onClick: props.onInteract,
|
|
6524
|
+
onChange: () => props.onChange(true)
|
|
6525
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: props.customLabel })] })]
|
|
6526
|
+
})]
|
|
6527
|
+
}), !props.workspace && props.custom ? props.children : null]
|
|
6528
|
+
});
|
|
6529
|
+
}
|
|
6530
|
+
//#endregion
|
|
6531
|
+
//#region src/client/MnemonReviewSection.tsx
|
|
6532
|
+
const STATUS_KEY = {
|
|
6533
|
+
pending: "review.statusPending",
|
|
6534
|
+
accepted: "review.statusAccepted",
|
|
6535
|
+
rejected: "review.statusRejected"
|
|
6536
|
+
};
|
|
6537
|
+
const STATUS_TONE = {
|
|
6538
|
+
pending: "warning",
|
|
6539
|
+
accepted: "success",
|
|
6540
|
+
rejected: "quiet"
|
|
6541
|
+
};
|
|
6542
|
+
function brief(value, max) {
|
|
6543
|
+
const text = value.replace(/\s+/gu, " ").trim();
|
|
6544
|
+
return text.length <= max ? text : text.slice(0, max - 1) + "…";
|
|
6545
|
+
}
|
|
6546
|
+
function targetName(t, target) {
|
|
6547
|
+
return target === "user" ? t("review.targetUser") : t("review.targetMemory");
|
|
6548
|
+
}
|
|
6549
|
+
/** One operation as a reviewer reads it: what changes, and to which entry. */
|
|
6550
|
+
function operationText(t, operation) {
|
|
6551
|
+
switch (operation.kind) {
|
|
6552
|
+
case "runtime-add": return t("review.opAdd", {
|
|
6553
|
+
target: targetName(t, operation.target),
|
|
6554
|
+
content: brief(operation.content, 160)
|
|
6555
|
+
});
|
|
6556
|
+
case "runtime-replace": return t("review.opReplace", {
|
|
6557
|
+
target: targetName(t, operation.target),
|
|
6558
|
+
from: brief(operation.oldText, 80),
|
|
6559
|
+
to: brief(operation.content, 160)
|
|
6560
|
+
});
|
|
6561
|
+
case "runtime-remove": return t("review.opRemove", {
|
|
6562
|
+
target: targetName(t, operation.target),
|
|
6563
|
+
text: brief(operation.oldText, 160)
|
|
6564
|
+
});
|
|
6565
|
+
case "document-archive": return t("review.opArchive", { id: operation.documentId });
|
|
6566
|
+
}
|
|
6567
|
+
}
|
|
6568
|
+
function stamp$1(value) {
|
|
6569
|
+
const parsed = new Date(value);
|
|
6570
|
+
return Number.isNaN(parsed.getTime()) ? value : parsed.toLocaleString();
|
|
6571
|
+
}
|
|
6572
|
+
/**
|
|
6573
|
+
* What an agent proposes to do with memory that arrived from another machine.
|
|
6574
|
+
* The proposal is evidence, not an instruction: it changes nothing until the
|
|
6575
|
+
* user accepts it, and the user can leave an opinion on it either way, which
|
|
6576
|
+
* the next reconciliation run reads back as part of its own evidence.
|
|
6577
|
+
*
|
|
6578
|
+
* The reviewer also states what the run should accomplish, and picks which of
|
|
6579
|
+
* the proposed changes are actually applied; the rest stay in the ledger.
|
|
6580
|
+
*/
|
|
6581
|
+
function MnemonReviewSection(props) {
|
|
6582
|
+
const { t } = props;
|
|
6583
|
+
const client = (0, react.useMemo)(() => props.connection === void 0 ? null : new MnemonClient(props.connection, props.sessionId, props.workspaceId), [
|
|
6584
|
+
props.connection,
|
|
6585
|
+
props.sessionId,
|
|
6586
|
+
props.workspaceId
|
|
6587
|
+
]);
|
|
6588
|
+
const [ledger, setLedger] = (0, react.useState)(null);
|
|
6589
|
+
const [openId, setOpenId] = (0, react.useState)(null);
|
|
6590
|
+
const [busy, setBusy] = (0, react.useState)(null);
|
|
6591
|
+
const [failed, setFailed] = (0, react.useState)(null);
|
|
6592
|
+
const [complaint, setComplaint] = (0, react.useState)(null);
|
|
6593
|
+
const [notice, setNotice] = (0, react.useState)(null);
|
|
6594
|
+
const [opinion, setOpinion] = (0, react.useState)("");
|
|
6595
|
+
const [guidance, setGuidance] = (0, react.useState)("");
|
|
6596
|
+
const [chosen, setChosen] = (0, react.useState)({});
|
|
6597
|
+
const [historyOpen, setHistoryOpen] = (0, react.useState)(false);
|
|
6598
|
+
const refresh = (0, react.useCallback)(async () => {
|
|
6599
|
+
if (client === null) return;
|
|
6600
|
+
setLedger(await client.reviewLedger());
|
|
6601
|
+
}, [client]);
|
|
6602
|
+
(0, react.useEffect)(() => {
|
|
6603
|
+
if (client === null) return;
|
|
6604
|
+
let active = true;
|
|
6605
|
+
client.reviewLedger().then((value) => {
|
|
6606
|
+
if (active) setLedger(value);
|
|
6607
|
+
}).catch((reason) => {
|
|
6608
|
+
if (active) setFailed(message(reason));
|
|
6609
|
+
});
|
|
6610
|
+
return () => {
|
|
6611
|
+
active = false;
|
|
6612
|
+
};
|
|
6613
|
+
}, [client]);
|
|
6614
|
+
const submit = (id, work) => {
|
|
6615
|
+
if (client === null) return;
|
|
6616
|
+
setBusy(id);
|
|
6617
|
+
setFailed(null);
|
|
6618
|
+
setComplaint(null);
|
|
6619
|
+
setNotice(null);
|
|
6620
|
+
work(client).then(refresh).catch((reason) => setFailed(message(reason))).finally(() => setBusy(null));
|
|
6621
|
+
};
|
|
6622
|
+
/**
|
|
6623
|
+
* Every position the plan holds that has not run yet. An untouched review applies all of
|
|
6624
|
+
* them, and the ones already written are never offered again: running them a second time
|
|
6625
|
+
* would address text the first run replaced.
|
|
6626
|
+
*/
|
|
6627
|
+
const restOf = (entry) => {
|
|
6628
|
+
const done = entry.appliedOperations ?? [];
|
|
6629
|
+
return entry.operations.map((_operation, index) => index).filter((index) => !done.includes(index));
|
|
6630
|
+
};
|
|
6631
|
+
const selectionOf = (entry) => chosen[entry.id] ?? restOf(entry);
|
|
6632
|
+
const keep = (entry, next) => {
|
|
6633
|
+
setChosen((previous) => ({
|
|
6634
|
+
...previous,
|
|
6635
|
+
[entry.id]: next.sort((left, right) => left - right)
|
|
6636
|
+
}));
|
|
6637
|
+
};
|
|
6638
|
+
const toggle = (entry, index) => {
|
|
6639
|
+
const current = selectionOf(entry);
|
|
6640
|
+
keep(entry, current.includes(index) ? current.filter((item) => item !== index) : [...current, index]);
|
|
6641
|
+
};
|
|
6642
|
+
const runReconcile = () => {
|
|
6643
|
+
if (client === null) return;
|
|
6644
|
+
setBusy("reconcile");
|
|
6645
|
+
setFailed(null);
|
|
6646
|
+
setComplaint(null);
|
|
6647
|
+
setNotice(null);
|
|
6648
|
+
client.reconcile(guidance).then(async (result) => {
|
|
6649
|
+
const parts = [result.action === "planned" ? t("review.planned", { operations: result.operations }) : t("review.none")];
|
|
6650
|
+
if (result.guided === true) parts.push(t("review.guided"));
|
|
6651
|
+
if (result.remoteEntries !== void 0 && result.remoteEntries > 0) parts.push(t("review.remoteEntries", { count: result.remoteEntries }));
|
|
6652
|
+
setNotice(parts.join(" "));
|
|
6653
|
+
setLedger(await client.reviewLedger());
|
|
6654
|
+
}).catch((reason) => setFailed(message(reason))).finally(() => setBusy(null));
|
|
6655
|
+
};
|
|
6656
|
+
const leaveOpinion = (id) => {
|
|
6657
|
+
const text = opinion.trim();
|
|
6658
|
+
if (text === "") return;
|
|
6659
|
+
submit(id, (api) => api.reviewOpinion(id, text).then(() => {
|
|
6660
|
+
setOpinion("");
|
|
6661
|
+
setNotice(t("review.opinionAdded"));
|
|
6662
|
+
}));
|
|
6663
|
+
};
|
|
6664
|
+
const apply = (entry) => {
|
|
6665
|
+
const selection = selectionOf(entry);
|
|
6666
|
+
if (selection.length === 0) {
|
|
6667
|
+
setComplaint(t("review.noSelection"));
|
|
6668
|
+
return;
|
|
6669
|
+
}
|
|
6670
|
+
submit(entry.id, (api) => api.applyReview(entry.id, selection).then((result) => {
|
|
6671
|
+
setNotice(t("review.applied", { count: result.applied }));
|
|
6672
|
+
setChosen((previous) => {
|
|
6673
|
+
const next = { ...previous };
|
|
6674
|
+
delete next[entry.id];
|
|
6675
|
+
return next;
|
|
6676
|
+
});
|
|
6677
|
+
}));
|
|
6678
|
+
};
|
|
6679
|
+
const entries = ledger?.entries ?? [];
|
|
6680
|
+
const pending = ledger?.pending ?? 0;
|
|
6681
|
+
const finished = (entry) => (entry.appliedOperations ?? []).length >= entry.operations.length;
|
|
6682
|
+
const history = entries.filter((entry) => entry.status === "accepted" && (finished(entry) || entry.appliedAt !== void 0 && entry.appliedOperations === void 0));
|
|
6683
|
+
const current = entries.filter((entry) => !history.includes(entry));
|
|
6684
|
+
/** One plan, as it reads in the open list and in the history popup alike. */
|
|
6685
|
+
const renderEntry = (entry) => {
|
|
6686
|
+
const open = openId === entry.id;
|
|
6687
|
+
const selection = selectionOf(entry);
|
|
6688
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6689
|
+
className: MnemonSettingsCard_module_css_default.reviewEntry,
|
|
6690
|
+
"data-status": entry.status,
|
|
6691
|
+
children: [
|
|
6692
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6693
|
+
className: MnemonSettingsCard_module_css_default.reviewTitle,
|
|
6694
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: entry.title }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tag, {
|
|
6695
|
+
tone: STATUS_TONE[entry.status],
|
|
6696
|
+
children: t(STATUS_KEY[entry.status])
|
|
6697
|
+
})]
|
|
6698
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6699
|
+
className: MnemonSettingsCard_module_css_default.rowActions,
|
|
6700
|
+
children: [
|
|
6701
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
6702
|
+
variant: "ghost",
|
|
6703
|
+
size: "sm",
|
|
6704
|
+
onClick: () => {
|
|
6705
|
+
setOpenId(open ? null : entry.id);
|
|
6706
|
+
},
|
|
6707
|
+
children: open ? t("review.collapse") : t("review.expand")
|
|
6708
|
+
}),
|
|
6709
|
+
entry.status === "pending" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
6710
|
+
variant: "outline",
|
|
6711
|
+
size: "sm",
|
|
6712
|
+
disabled: busy !== null,
|
|
6713
|
+
onClick: () => {
|
|
6714
|
+
submit(entry.id, (api) => api.decideReview(entry.id, "accepted"));
|
|
6715
|
+
},
|
|
6716
|
+
children: t("review.accept")
|
|
6717
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
6718
|
+
variant: "ghost",
|
|
6719
|
+
size: "sm",
|
|
6720
|
+
disabled: busy !== null,
|
|
6721
|
+
onClick: () => {
|
|
6722
|
+
submit(entry.id, (api) => api.decideReview(entry.id, "rejected"));
|
|
6723
|
+
},
|
|
6724
|
+
children: t("review.reject")
|
|
6725
|
+
})] }),
|
|
6726
|
+
entry.status === "accepted" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
6727
|
+
variant: "primary",
|
|
6728
|
+
size: "sm",
|
|
6729
|
+
disabled: busy !== null || props.disabled,
|
|
6730
|
+
onClick: () => {
|
|
6731
|
+
apply(entry);
|
|
6732
|
+
},
|
|
6733
|
+
children: busy === entry.id ? t("review.applying") : selection.length > 0 && selection.length < restOf(entry).length ? t("review.applyCount", { count: selection.length }) : t("review.apply")
|
|
6734
|
+
}),
|
|
6735
|
+
entry.status !== "pending" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
6736
|
+
variant: "ghost",
|
|
6737
|
+
size: "sm",
|
|
6738
|
+
disabled: busy !== null,
|
|
6739
|
+
onClick: () => {
|
|
6740
|
+
submit(entry.id, (api) => api.reopenReview(entry.id));
|
|
6741
|
+
},
|
|
6742
|
+
children: t("review.reopen")
|
|
6743
|
+
})
|
|
6744
|
+
]
|
|
6745
|
+
})] }),
|
|
6746
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("review.meta", {
|
|
6747
|
+
count: entry.operations.length,
|
|
6748
|
+
machine: entry.machine.label,
|
|
6749
|
+
time: stamp$1(entry.createdAt)
|
|
6750
|
+
}) }),
|
|
6751
|
+
entry.foreignMachines.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("review.foreign", { machines: entry.foreignMachines.join(", ") }) }),
|
|
6752
|
+
entry.appliedAt !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
|
|
6753
|
+
className: MnemonSettingsCard_module_css_default.syncSuccess,
|
|
6754
|
+
children: t("review.appliedAt", { time: stamp$1(entry.appliedAt) })
|
|
6755
|
+
}),
|
|
6756
|
+
(entry.appliedOperations ?? []).length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("review.appliedCount", {
|
|
6757
|
+
count: (entry.appliedOperations ?? []).length,
|
|
6758
|
+
total: entry.operations.length
|
|
6759
|
+
}) }),
|
|
6760
|
+
entry.failure !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6761
|
+
className: MnemonSettingsCard_module_css_default.error,
|
|
6762
|
+
role: "alert",
|
|
6763
|
+
children: t("review.applyFailed", { error: entry.failure })
|
|
6764
|
+
}),
|
|
6765
|
+
entry.status === "rejected" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("review.rejectedHint") }),
|
|
6766
|
+
open && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
6767
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", { children: entry.summary }),
|
|
6768
|
+
entry.status === "accepted" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6769
|
+
className: MnemonSettingsCard_module_css_default.reviewSelection,
|
|
6770
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("review.selectHint") }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6771
|
+
className: MnemonSettingsCard_module_css_default.rowActions,
|
|
6772
|
+
children: [
|
|
6773
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
6774
|
+
className: MnemonSettingsCard_module_css_default.reviewSelected,
|
|
6775
|
+
children: t("review.selected", {
|
|
6776
|
+
count: selection.length,
|
|
6777
|
+
total: restOf(entry).length
|
|
6778
|
+
})
|
|
6779
|
+
}),
|
|
6780
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
6781
|
+
variant: "ghost",
|
|
6782
|
+
size: "sm",
|
|
6783
|
+
disabled: busy !== null,
|
|
6784
|
+
onClick: () => {
|
|
6785
|
+
keep(entry, restOf(entry));
|
|
6786
|
+
},
|
|
6787
|
+
children: t("review.selectAll")
|
|
6788
|
+
}),
|
|
6789
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
6790
|
+
variant: "ghost",
|
|
6791
|
+
size: "sm",
|
|
6792
|
+
disabled: busy !== null,
|
|
6793
|
+
onClick: () => {
|
|
6794
|
+
keep(entry, []);
|
|
6795
|
+
},
|
|
6796
|
+
children: t("review.selectNone")
|
|
6797
|
+
})
|
|
6798
|
+
]
|
|
6799
|
+
})]
|
|
6800
|
+
}),
|
|
6801
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("ol", {
|
|
6802
|
+
className: MnemonSettingsCard_module_css_default.reviewOperations,
|
|
6803
|
+
children: entry.operations.map((operation, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
|
|
6804
|
+
"data-applied": (entry.appliedOperations ?? []).includes(index),
|
|
6805
|
+
children: [(entry.appliedOperations ?? []).includes(index) ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: operationText(t, operation) }) : entry.status === "accepted" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
6806
|
+
type: "checkbox",
|
|
6807
|
+
checked: selection.includes(index),
|
|
6808
|
+
disabled: busy !== null,
|
|
6809
|
+
onChange: () => {
|
|
6810
|
+
toggle(entry, index);
|
|
6811
|
+
}
|
|
6812
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: operationText(t, operation) })] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: operationText(t, operation) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: operation.reason })]
|
|
6813
|
+
}, index))
|
|
6814
|
+
}),
|
|
6815
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6816
|
+
className: MnemonSettingsCard_module_css_default.reviewOpinions,
|
|
6817
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("review.opinions") }), entry.opinions.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("review.noOpinions") }) : entry.opinions.map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: item.author === "agent" ? t("review.authorAgent") : t("review.authorUser") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: item.text })] }, item.id))]
|
|
6818
|
+
}),
|
|
6819
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6820
|
+
className: MnemonSettingsCard_module_css_default.reviewOpinionForm,
|
|
6821
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
6822
|
+
type: "text",
|
|
6823
|
+
value: opinion,
|
|
6824
|
+
placeholder: t("review.opinionPlaceholder"),
|
|
6825
|
+
"aria-label": t("review.opinions"),
|
|
6826
|
+
disabled: busy !== null,
|
|
6827
|
+
onChange: (event) => setOpinion(event.target.value)
|
|
6828
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
6829
|
+
variant: "outline",
|
|
6830
|
+
size: "sm",
|
|
6831
|
+
disabled: busy !== null || opinion.trim() === "",
|
|
6832
|
+
onClick: () => {
|
|
6833
|
+
leaveOpinion(entry.id);
|
|
6834
|
+
},
|
|
6835
|
+
children: t("review.opinionSend")
|
|
6836
|
+
})]
|
|
6837
|
+
})
|
|
6838
|
+
] })
|
|
6839
|
+
]
|
|
6840
|
+
}, entry.id);
|
|
6841
|
+
};
|
|
6842
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6843
|
+
className: MnemonSettingsCard_module_css_default.syncRow,
|
|
6844
|
+
role: "group",
|
|
6845
|
+
"aria-labelledby": "mnemon-review-heading",
|
|
6846
|
+
children: [
|
|
6847
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(SettingRow, {
|
|
6848
|
+
title: t("config.reconcileTitle"),
|
|
6849
|
+
titleId: "mnemon-review-heading",
|
|
6850
|
+
hint: t("config.reconcileDescription"),
|
|
6851
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6852
|
+
className: MnemonSettingsCard_module_css_default.rowActions,
|
|
6853
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
6854
|
+
variant: "outline",
|
|
6855
|
+
size: "sm",
|
|
6856
|
+
disabled: props.disabled || client === null || busy !== null,
|
|
6857
|
+
onClick: runReconcile,
|
|
6858
|
+
children: busy === "reconcile" ? t("review.reconciling") : t("review.reconcile")
|
|
6859
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
6860
|
+
variant: "ghost",
|
|
6861
|
+
size: "sm",
|
|
6862
|
+
disabled: client === null || busy !== null,
|
|
6863
|
+
onClick: () => {
|
|
6864
|
+
submit("load", refresh);
|
|
6865
|
+
},
|
|
6866
|
+
children: t("review.refresh")
|
|
6867
|
+
})]
|
|
6868
|
+
})
|
|
6869
|
+
}),
|
|
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
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6879
|
+
className: MnemonSettingsCard_module_css_default.reviewGuidance,
|
|
6880
|
+
children: [
|
|
6881
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
6882
|
+
htmlFor: "mnemon-review-guidance",
|
|
6883
|
+
children: t("review.guidanceLabel")
|
|
6884
|
+
}),
|
|
6885
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
6886
|
+
id: "mnemon-review-guidance",
|
|
6887
|
+
type: "text",
|
|
6888
|
+
value: guidance,
|
|
6889
|
+
placeholder: t("review.guidancePlaceholder"),
|
|
6890
|
+
disabled: busy !== null,
|
|
6891
|
+
onChange: (event) => setGuidance(event.target.value)
|
|
6892
|
+
}),
|
|
6893
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("review.guidanceHint") })
|
|
6894
|
+
]
|
|
6895
|
+
}),
|
|
6896
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
6897
|
+
className: MnemonSettingsCard_module_css_default.syncState,
|
|
6898
|
+
"aria-live": "polite",
|
|
6899
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: pending === 0 ? t("review.empty") : t("review.pending", { count: pending }) })
|
|
6900
|
+
}),
|
|
6901
|
+
complaint !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6902
|
+
className: MnemonSettingsCard_module_css_default.error,
|
|
6903
|
+
role: "alert",
|
|
6904
|
+
children: complaint
|
|
6905
|
+
}),
|
|
6906
|
+
failed !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6907
|
+
className: MnemonSettingsCard_module_css_default.error,
|
|
6908
|
+
role: "alert",
|
|
6909
|
+
children: t("review.failed", { error: failed })
|
|
6910
|
+
}),
|
|
6911
|
+
notice !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6912
|
+
className: MnemonSettingsCard_module_css_default.syncSuccess,
|
|
6913
|
+
role: "status",
|
|
6914
|
+
children: notice
|
|
6915
|
+
}),
|
|
6916
|
+
history.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
6917
|
+
className: MnemonSettingsCard_module_css_default.rowActions,
|
|
6918
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
6919
|
+
variant: "ghost",
|
|
6920
|
+
size: "sm",
|
|
6921
|
+
onClick: () => {
|
|
6922
|
+
setHistoryOpen(true);
|
|
6923
|
+
},
|
|
6924
|
+
children: t("review.history", { count: history.length })
|
|
6925
|
+
})
|
|
6926
|
+
}),
|
|
6927
|
+
current.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
6928
|
+
className: MnemonSettingsCard_module_css_default.reviewList,
|
|
6929
|
+
children: current.map(renderEntry)
|
|
6930
|
+
}),
|
|
6931
|
+
historyOpen && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MnemonDialog, {
|
|
6932
|
+
title: t("review.historyTitle"),
|
|
6933
|
+
closeLabel: t("common.close"),
|
|
6934
|
+
busy: busy !== null,
|
|
6935
|
+
onClose: () => {
|
|
6936
|
+
setHistoryOpen(false);
|
|
6937
|
+
},
|
|
6938
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6939
|
+
className: MnemonSettingsCard_module_css_default.syncDialogBody,
|
|
6940
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("review.historyHint") }), history.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("review.historyEmpty") }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
6941
|
+
className: MnemonSettingsCard_module_css_default.reviewList,
|
|
6942
|
+
children: history.map(renderEntry)
|
|
6943
|
+
})]
|
|
6944
|
+
})
|
|
6945
|
+
})
|
|
6946
|
+
]
|
|
6947
|
+
});
|
|
6948
|
+
}
|
|
6949
|
+
//#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 = [
|
|
6960
|
+
0,
|
|
6961
|
+
60,
|
|
6962
|
+
180,
|
|
6963
|
+
360,
|
|
6964
|
+
720,
|
|
6965
|
+
1440,
|
|
6966
|
+
4320,
|
|
6967
|
+
10080
|
|
6968
|
+
];
|
|
6969
|
+
/** One interval as the reader reads it: off, whole days, or whole hours. */
|
|
6970
|
+
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 });
|
|
6974
|
+
}
|
|
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
|
+
};
|
|
6986
|
+
}
|
|
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() !== "";
|
|
6990
|
+
}
|
|
6991
|
+
/**
|
|
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.
|
|
6995
|
+
*/
|
|
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(" ");
|
|
7007
|
+
}
|
|
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();
|
|
7012
|
+
}
|
|
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;
|
|
7017
|
+
}
|
|
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) + "…";
|
|
7022
|
+
}
|
|
7023
|
+
/**
|
|
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.
|
|
7029
|
+
*
|
|
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.
|
|
7033
|
+
*
|
|
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.
|
|
7037
|
+
*/
|
|
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 }) {
|
|
7042
|
+
const client = (0, react.useMemo)(() => connection === void 0 ? null : new MnemonClient(connection, sessionId, workspaceId), [
|
|
7043
|
+
connection,
|
|
7044
|
+
sessionId,
|
|
7045
|
+
workspaceId
|
|
7046
|
+
]);
|
|
7047
|
+
const [status, setStatus] = (0, react.useState)(null);
|
|
7048
|
+
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);
|
|
7054
|
+
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;
|
|
7070
|
+
try {
|
|
7071
|
+
setStatus(await client.syncStatus());
|
|
7072
|
+
} catch (reason) {
|
|
7073
|
+
setFailed(message(reason));
|
|
7074
|
+
} finally {
|
|
7075
|
+
setLoaded(true);
|
|
7076
|
+
}
|
|
7077
|
+
try {
|
|
7078
|
+
setGithub(await client.githubStatus());
|
|
7079
|
+
} catch {}
|
|
7080
|
+
}, [client, enabled]);
|
|
7081
|
+
(0, react.useEffect)(() => {
|
|
7082
|
+
if (client === null) {
|
|
7083
|
+
setLoaded(true);
|
|
7084
|
+
return;
|
|
7085
|
+
}
|
|
7086
|
+
if (!enabled) return;
|
|
7087
|
+
let active = true;
|
|
7088
|
+
setLoaded(false);
|
|
7089
|
+
(async () => {
|
|
7090
|
+
let next = await client.syncStatus();
|
|
7091
|
+
for (let attempt = 0; active && next.enabled === false && attempt < STATUS_SETTLE_ATTEMPTS; attempt += 1) {
|
|
7092
|
+
await new Promise((settle) => setTimeout(settle, STATUS_SETTLE_MS));
|
|
7093
|
+
next = await client.syncStatus();
|
|
7094
|
+
}
|
|
7095
|
+
return next;
|
|
7096
|
+
})().then((next) => {
|
|
7097
|
+
if (active) {
|
|
7098
|
+
setStatus(next);
|
|
7099
|
+
setLoaded(true);
|
|
7100
|
+
}
|
|
7101
|
+
}, (reason) => {
|
|
7102
|
+
if (active) {
|
|
7103
|
+
setFailed(message(reason));
|
|
7104
|
+
setLoaded(true);
|
|
7105
|
+
}
|
|
7106
|
+
});
|
|
7107
|
+
client.githubStatus().then((next) => {
|
|
7108
|
+
if (active) setGithub(next);
|
|
7109
|
+
}, () => {
|
|
7110
|
+
if (active) setGithub(null);
|
|
7111
|
+
});
|
|
7112
|
+
return () => {
|
|
7113
|
+
active = false;
|
|
7114
|
+
};
|
|
7115
|
+
}, [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);
|
|
7133
|
+
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();
|
|
7152
|
+
} catch (reason) {
|
|
7153
|
+
setFailed(message(reason));
|
|
7154
|
+
} finally {
|
|
7155
|
+
setBusy(null);
|
|
7156
|
+
}
|
|
7157
|
+
};
|
|
7158
|
+
const push = async () => {
|
|
7159
|
+
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);
|
|
7196
|
+
try {
|
|
7197
|
+
const next = await client.configureSync({ autoBackupMinutes: minutes });
|
|
7198
|
+
setStatus((current) => current === null ? current : {
|
|
7199
|
+
...current,
|
|
7200
|
+
config: next
|
|
7201
|
+
});
|
|
7202
|
+
setNotice(t("config.syncAutoBackupSaved", { interval: intervalLabel(t, minutes) }));
|
|
7203
|
+
} 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));
|
|
7247
|
+
} finally {
|
|
7248
|
+
setBusy(null);
|
|
7249
|
+
}
|
|
7250
|
+
};
|
|
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 () => {
|
|
7261
|
+
if (client === null || busy !== null) return;
|
|
7262
|
+
setBusy("backups");
|
|
7263
|
+
setFailed(null);
|
|
7264
|
+
setNotice(null);
|
|
7265
|
+
setDialog(true);
|
|
7266
|
+
try {
|
|
7267
|
+
setBackups(await client.syncBackups());
|
|
7268
|
+
} catch (reason) {
|
|
7269
|
+
setFailed(message(reason));
|
|
7270
|
+
} finally {
|
|
7271
|
+
setBusy(null);
|
|
7272
|
+
}
|
|
7273
|
+
try {
|
|
7274
|
+
setDifference(await client.syncDiff());
|
|
7275
|
+
} catch {
|
|
7276
|
+
setDifference(null);
|
|
7277
|
+
}
|
|
7278
|
+
};
|
|
7279
|
+
/**
|
|
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.
|
|
7283
|
+
*/
|
|
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
|
+
}
|
|
7300
|
+
};
|
|
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
|
+
}
|
|
7315
|
+
};
|
|
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
|
+
}
|
|
7341
|
+
};
|
|
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
|
+
});
|
|
7360
|
+
};
|
|
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);
|
|
7367
|
+
try {
|
|
7368
|
+
await client.configureSync({ repoUrl: repository.url });
|
|
7369
|
+
setNotice(t("config.syncSaved"));
|
|
7370
|
+
await refresh();
|
|
7371
|
+
} catch (reason) {
|
|
7372
|
+
setFailed(message(reason));
|
|
7373
|
+
} finally {
|
|
7374
|
+
setBusy(null);
|
|
7375
|
+
}
|
|
7376
|
+
};
|
|
7377
|
+
const loadRepositories = (0, react.useCallback)(async () => {
|
|
7378
|
+
if (client === null || busy !== null) return;
|
|
7379
|
+
setBusy("repos");
|
|
7380
|
+
setGithubFailed(null);
|
|
7381
|
+
try {
|
|
7382
|
+
const answer = await client.githubRepositories();
|
|
7383
|
+
setRepositories(answer.repositories);
|
|
7384
|
+
} catch (reason) {
|
|
7385
|
+
setGithubFailed(message(reason));
|
|
7386
|
+
} finally {
|
|
7387
|
+
setBusy(null);
|
|
7388
|
+
}
|
|
7389
|
+
}, [client, busy]);
|
|
7390
|
+
const signIn = async () => {
|
|
7391
|
+
if (client === null || busy !== null) return;
|
|
7392
|
+
setBusy("github");
|
|
7393
|
+
setGithubFailed(null);
|
|
7394
|
+
setNotice(null);
|
|
7395
|
+
try {
|
|
7396
|
+
const next = await client.githubStart();
|
|
7397
|
+
setGithub(next);
|
|
7398
|
+
setPollMs(next.flow?.intervalMs ?? 5e3);
|
|
7399
|
+
setPollTick(0);
|
|
7400
|
+
} catch (reason) {
|
|
7401
|
+
setGithubFailed(message(reason));
|
|
7402
|
+
} finally {
|
|
7403
|
+
setBusy(null);
|
|
7404
|
+
}
|
|
7405
|
+
};
|
|
7406
|
+
const cancelSignIn = async () => {
|
|
7407
|
+
if (client === null || busy !== null) return;
|
|
7408
|
+
setBusy("github");
|
|
7409
|
+
setGithubFailed(null);
|
|
7410
|
+
try {
|
|
7411
|
+
setGithub(await client.githubCancel());
|
|
7412
|
+
} catch (reason) {
|
|
7413
|
+
setGithubFailed(message(reason));
|
|
7414
|
+
} finally {
|
|
7415
|
+
setBusy(null);
|
|
7416
|
+
}
|
|
7417
|
+
};
|
|
7418
|
+
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");
|
|
7437
|
+
setFailed(null);
|
|
7438
|
+
setGithubFailed(null);
|
|
7439
|
+
setNotice(null);
|
|
7440
|
+
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);
|
|
7447
|
+
} catch (reason) {
|
|
7448
|
+
setGithubFailed(message(reason));
|
|
7449
|
+
} finally {
|
|
7450
|
+
setBusy(null);
|
|
7451
|
+
}
|
|
7452
|
+
};
|
|
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
|
+
}
|
|
7459
|
+
};
|
|
7460
|
+
const flow = github?.flow;
|
|
7461
|
+
const signedIn = github?.signedIn === true;
|
|
7462
|
+
(0, react.useEffect)(() => {
|
|
7463
|
+
if (client === null || !enabled || flow === void 0) return;
|
|
7464
|
+
let active = true;
|
|
7465
|
+
const timer = setTimeout(() => {
|
|
7466
|
+
(async () => {
|
|
7467
|
+
try {
|
|
7468
|
+
const answer = await client.githubPoll();
|
|
7469
|
+
if (!active) return;
|
|
7470
|
+
if (answer.status === "pending") {
|
|
7471
|
+
if (answer.intervalMs !== void 0) setPollMs(answer.intervalMs);
|
|
7472
|
+
setPollTick((current) => current + 1);
|
|
7473
|
+
return;
|
|
7474
|
+
}
|
|
7475
|
+
const next = await client.githubStatus();
|
|
7476
|
+
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);
|
|
7485
|
+
} catch (reason) {
|
|
7486
|
+
if (active) setGithubFailed(message(reason));
|
|
7487
|
+
}
|
|
7488
|
+
})();
|
|
7489
|
+
}, Math.max(pollMs, 1e3));
|
|
7490
|
+
return () => {
|
|
7491
|
+
active = false;
|
|
7492
|
+
clearTimeout(timer);
|
|
7493
|
+
};
|
|
7494
|
+
}, [
|
|
7495
|
+
client,
|
|
7496
|
+
enabled,
|
|
7497
|
+
flow?.userCode,
|
|
7498
|
+
pollMs,
|
|
7499
|
+
pollTick,
|
|
7500
|
+
t
|
|
7501
|
+
]);
|
|
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) }));
|
|
7523
|
+
}
|
|
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: [
|
|
7554
|
+
/* @__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",
|
|
5872
7573
|
size: "sm",
|
|
5873
|
-
disabled:
|
|
5874
|
-
onClick: () => void
|
|
5875
|
-
children: busy === "
|
|
5876
|
-
})
|
|
5877
|
-
|
|
5878
|
-
|
|
5879
|
-
|
|
5880
|
-
|
|
5881
|
-
|
|
5882
|
-
|
|
5883
|
-
|
|
5884
|
-
|
|
7574
|
+
disabled: !ready || disabled || busy !== null,
|
|
7575
|
+
onClick: () => void push(),
|
|
7576
|
+
children: busy === "push" ? t("config.syncPushing") : t("config.syncPush")
|
|
7577
|
+
})
|
|
7578
|
+
]
|
|
7579
|
+
}),
|
|
7580
|
+
/* @__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))
|
|
7584
|
+
}),
|
|
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,
|
|
7653
|
+
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
|
+
})]
|
|
7671
|
+
}),
|
|
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 })
|
|
7677
|
+
})
|
|
7678
|
+
]
|
|
7679
|
+
}),
|
|
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
|
+
]
|
|
7750
|
+
}),
|
|
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
|
+
})
|
|
7760
|
+
})
|
|
7761
|
+
] })
|
|
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",
|
|
7910
|
+
type: "text",
|
|
7911
|
+
value: draft.authorEmail,
|
|
7912
|
+
placeholder: t("config.syncAuthorOptional"),
|
|
7913
|
+
disabled: !editable,
|
|
7914
|
+
autoComplete: "off",
|
|
7915
|
+
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")
|
|
7930
|
+
})
|
|
7931
|
+
})
|
|
7932
|
+
]
|
|
5885
7933
|
}),
|
|
5886
7934
|
pending !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5887
|
-
className: MnemonSettingsCard_module_css_default.
|
|
7935
|
+
className: MnemonSettingsCard_module_css_default.syncBar,
|
|
5888
7936
|
role: "status",
|
|
5889
7937
|
children: [
|
|
5890
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
|
|
5891
|
-
|
|
5892
|
-
|
|
5893
|
-
|
|
5894
|
-
|
|
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
|
+
] }),
|
|
5895
7954
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
5896
7955
|
variant: "ghost",
|
|
5897
7956
|
size: "sm",
|
|
@@ -5902,66 +7961,185 @@ window.__ModuleLoader__.load({
|
|
|
5902
7961
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
5903
7962
|
variant: "primary",
|
|
5904
7963
|
size: "sm",
|
|
5905
|
-
disabled: busy !== null,
|
|
5906
|
-
onClick: () => void
|
|
5907
|
-
children: busy === "
|
|
7964
|
+
disabled: busy !== null || disabled,
|
|
7965
|
+
onClick: () => void pull(),
|
|
7966
|
+
children: busy === "pull" ? t("config.syncPulling") : t("config.syncPull")
|
|
5908
7967
|
})
|
|
5909
7968
|
]
|
|
5910
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
|
+
})]
|
|
8121
|
+
})
|
|
8122
|
+
}),
|
|
5911
8123
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5912
|
-
className: MnemonSettingsCard_module_css_default.
|
|
8124
|
+
className: MnemonSettingsCard_module_css_default.syncFeedback,
|
|
5913
8125
|
"aria-live": "polite",
|
|
5914
8126
|
children: [
|
|
5915
8127
|
failed !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5916
8128
|
className: MnemonSettingsCard_module_css_default.error,
|
|
5917
8129
|
role: "alert",
|
|
5918
|
-
children: t("config.
|
|
8130
|
+
children: t("config.syncFailed", { error: failed })
|
|
5919
8131
|
}),
|
|
5920
8132
|
notice !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5921
|
-
className: MnemonSettingsCard_module_css_default.
|
|
8133
|
+
className: MnemonSettingsCard_module_css_default.syncSuccess,
|
|
5922
8134
|
children: notice
|
|
5923
8135
|
}),
|
|
5924
8136
|
client === null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5925
8137
|
className: MnemonSettingsCard_module_css_default.readOnly,
|
|
5926
|
-
children: t("config.
|
|
8138
|
+
children: t("config.syncUnavailable")
|
|
5927
8139
|
})
|
|
5928
8140
|
]
|
|
5929
8141
|
})
|
|
5930
|
-
]
|
|
5931
|
-
});
|
|
5932
|
-
}
|
|
5933
|
-
//#endregion
|
|
5934
|
-
//#region src/client/GlobalLocationSetting.tsx
|
|
5935
|
-
/** The default or custom location control: the storage directory, Native and workspace-aware providers. */
|
|
5936
|
-
function GlobalLocationSetting(props) {
|
|
5937
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5938
|
-
className: `${MnemonSettingsCard_module_css_default.globalLocationSetting}${props.className === void 0 ? "" : ` ${props.className}`}`,
|
|
5939
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5940
|
-
className: MnemonSettingsCard_module_css_default.nativeLocation,
|
|
5941
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5942
|
-
className: MnemonSettingsCard_module_css_default.settingCopy,
|
|
5943
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: props.label }), props.hint !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: props.hint })]
|
|
5944
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5945
|
-
className: MnemonSettingsCard_module_css_default.inlineChoices,
|
|
5946
|
-
role: "radiogroup",
|
|
5947
|
-
"aria-label": props.ariaLabel,
|
|
5948
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
5949
|
-
type: "radio",
|
|
5950
|
-
name: props.name,
|
|
5951
|
-
checked: props.workspace || !props.custom,
|
|
5952
|
-
disabled: props.disabled || props.workspace,
|
|
5953
|
-
onClick: props.onInteract,
|
|
5954
|
-
onChange: () => props.onChange(false)
|
|
5955
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: props.defaultLabel })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
5956
|
-
type: "radio",
|
|
5957
|
-
name: props.name,
|
|
5958
|
-
checked: !props.workspace && props.custom,
|
|
5959
|
-
disabled: props.disabled || props.workspace,
|
|
5960
|
-
onClick: props.onInteract,
|
|
5961
|
-
onChange: () => props.onChange(true)
|
|
5962
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: props.customLabel })] })]
|
|
5963
|
-
})]
|
|
5964
|
-
}), !props.workspace && props.custom ? props.children : null]
|
|
8142
|
+
] })]
|
|
5965
8143
|
});
|
|
5966
8144
|
}
|
|
5967
8145
|
//#endregion
|
|
@@ -6014,9 +8192,9 @@ window.__ModuleLoader__.load({
|
|
|
6014
8192
|
}
|
|
6015
8193
|
/**
|
|
6016
8194
|
* Where memory lives: the scope and directory, applied together because a
|
|
6017
|
-
* change moves where every component below reads and writes,
|
|
6018
|
-
*
|
|
6019
|
-
*
|
|
8195
|
+
* change moves where every component below reads and writes, the ZIP backup
|
|
8196
|
+
* that carries the data from one place to another, and the git sync that
|
|
8197
|
+
* carries it between machines.
|
|
6020
8198
|
*
|
|
6021
8199
|
* The directory is Mnemon's default one or one the user types, chosen
|
|
6022
8200
|
* outright rather than implied by an empty field, and the row shows the one
|
|
@@ -6057,6 +8235,13 @@ window.__ModuleLoader__.load({
|
|
|
6057
8235
|
await props.scope.mutate(operations);
|
|
6058
8236
|
props.onSaved();
|
|
6059
8237
|
});
|
|
8238
|
+
const sync = useLive(props.value?.syncEnabled === true, async (value) => {
|
|
8239
|
+
await props.scope.mutate([{
|
|
8240
|
+
op: "set",
|
|
8241
|
+
path: ["syncEnabled"],
|
|
8242
|
+
value
|
|
8243
|
+
}]);
|
|
8244
|
+
});
|
|
6060
8245
|
const { draft } = storage;
|
|
6061
8246
|
const problem = storageProblem(t, draft);
|
|
6062
8247
|
const focusDirectory = (0, react.useRef)(false);
|
|
@@ -6180,6 +8365,26 @@ window.__ModuleLoader__.load({
|
|
|
6180
8365
|
...props.workspaceId === void 0 ? {} : { workspaceId: props.workspaceId },
|
|
6181
8366
|
target: props.target,
|
|
6182
8367
|
t
|
|
8368
|
+
}),
|
|
8369
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(MnemonSyncSection, {
|
|
8370
|
+
...props.connection === void 0 ? {} : { connection: props.connection },
|
|
8371
|
+
...props.sessionId === void 0 ? {} : { sessionId: props.sessionId },
|
|
8372
|
+
...props.workspaceId === void 0 ? {} : { workspaceId: props.workspaceId },
|
|
8373
|
+
disabled: props.disabled,
|
|
8374
|
+
enabled: sync.value,
|
|
8375
|
+
onEnabled: sync.set,
|
|
8376
|
+
t
|
|
8377
|
+
}),
|
|
8378
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(WriteFailure, {
|
|
8379
|
+
error: sync.failed,
|
|
8380
|
+
t
|
|
8381
|
+
}),
|
|
8382
|
+
sync.value && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MnemonReviewSection, {
|
|
8383
|
+
...props.connection === void 0 ? {} : { connection: props.connection },
|
|
8384
|
+
...props.sessionId === void 0 ? {} : { sessionId: props.sessionId },
|
|
8385
|
+
...props.workspaceId === void 0 ? {} : { workspaceId: props.workspaceId },
|
|
8386
|
+
disabled: props.disabled,
|
|
8387
|
+
t
|
|
6183
8388
|
})
|
|
6184
8389
|
]
|
|
6185
8390
|
})]
|
|
@@ -6804,7 +9009,7 @@ window.__ModuleLoader__.load({
|
|
|
6804
9009
|
size: "sm",
|
|
6805
9010
|
className: PageControls_module_css_default.receiptAction,
|
|
6806
9011
|
onClick: props.onView,
|
|
6807
|
-
children: t("receipt.view")
|
|
9012
|
+
children: props.viewLabel ?? t("receipt.view")
|
|
6808
9013
|
})
|
|
6809
9014
|
]
|
|
6810
9015
|
});
|
|
@@ -8726,7 +10931,7 @@ window.__ModuleLoader__.load({
|
|
|
8726
10931
|
}
|
|
8727
10932
|
//#endregion
|
|
8728
10933
|
//#region \0dsh-mnemon-css:/home/runner/work/dsh-mnemon/dsh-mnemon/src/client/MnemonSaveAction.module.css.mjs
|
|
8729
|
-
const css$1 = ".ypSjoa_wrap{display:inline-flex;position:relative}.ypSjoa_button{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:6px;display:inline-flex}.ypSjoa_button:hover,.ypSjoa_button[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}.ypSjoa_button:focus-visible{outline:var(--dsw-focus-ring-width,2px) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:2px}.ypSjoa_icon{flex:none;width:16px;height:16px;display:inline-flex}.ypSjoa_modal{width:min(640px, calc(100vw - max(12px, env(safe-area-inset-left,0px)) - max(12px, env(safe-area-inset-right,0px))));max-height:calc(100vh - 24px)}.ypSjoa_modalContent{overscroll-behavior:contain;-webkit-overflow-scrolling:touch;min-height:0;overflow-y:auto}.ypSjoa_modalAction{min-width:96px}.ypSjoa_status{color:var(--dsw-alias-label-tertiary);margin:0;font-size:13px;line-height:20px}.ypSjoa_readOnly{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-state-warn-tertiary);color:var(--dsw-alias-state-warn-label);margin-bottom:12px;padding:8px 12px;font-size:12px;line-height:18px}.ypSjoa_candidate{display:block}.ypSjoa_candidateHeading{justify-content:space-between;align-items:center;gap:8px;min-width:0;margin-bottom:6px;display:flex}.ypSjoa_candidateHeading>label{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:20px}.ypSjoa_candidate textarea{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);resize:vertical;background:var(--dsw-alias-bg-layer-3);width:100%;min-height:260px;max-height:50vh;color:var(--dsw-alias-label-primary);font:14px/22px var(--dsw-font-family);padding:10px 12px;display:block}.ypSjoa_candidate textarea:focus-visible{border-color:var(--dsw-alias-state-business-primary);outline:none}.ypSjoa_truncated{color:var(--dsw-alias-label-tertiary);margin-top:6px;font-size:12px;line-height:18px;display:block}@media (width<=640px),(height<=560px){.ypSjoa_modal{width:min(100%, calc(100vw - max(8px, env(safe-area-inset-left,0px)) - max(8px, env(safe-area-inset-right,0px))));max-height:calc(100vh - 16px)}.ypSjoa_modal .ypSjoa_modalAction{min-width:0;min-height:44px}.ypSjoa_candidate textarea{min-height:clamp(140px,32vh,220px);max-height:42vh}}@media (pointer:coarse) and (width<=640px),(pointer:coarse) and (height<=560px){.ypSjoa_candidate textarea{font-size:16px}}@supports (height:100dvh){.ypSjoa_modal{max-height:calc(100dvh - 24px)}@media (width<=640px),(height<=560px){.ypSjoa_modal{max-height:calc(100dvh - 16px)}.ypSjoa_candidate textarea{min-height:clamp(140px,32dvh,220px);max-height:42dvh}}}";
|
|
10934
|
+
const css$1 = ".ypSjoa_wrap{display:inline-flex;position:relative}.ypSjoa_button{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:6px;display:inline-flex}.ypSjoa_button:hover,.ypSjoa_button[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}.ypSjoa_button:focus-visible{outline:var(--dsw-focus-ring-width,2px) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:2px}.ypSjoa_icon{flex:none;width:16px;height:16px;display:inline-flex}.ypSjoa_modal{width:min(640px, calc(100vw - max(12px, env(safe-area-inset-left,0px)) - max(12px, env(safe-area-inset-right,0px))));max-height:calc(100vh - 24px)}.ypSjoa_modalContent{overscroll-behavior:contain;-webkit-overflow-scrolling:touch;min-height:0;overflow-y:auto}.ypSjoa_modalAction{min-width:96px}.ypSjoa_status{color:var(--dsw-alias-label-tertiary);margin:0;font-size:13px;line-height:20px}.ypSjoa_readOnly{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-state-warn-tertiary);color:var(--dsw-alias-state-warn-label);margin-bottom:12px;padding:8px 12px;font-size:12px;line-height:18px}.ypSjoa_candidate{display:block}.ypSjoa_candidateHeading{justify-content:space-between;align-items:center;gap:8px;min-width:0;margin-bottom:6px;display:flex}.ypSjoa_candidateHeading>label{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:20px}.ypSjoa_candidate textarea{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);resize:vertical;background:var(--dsw-alias-bg-layer-3);width:100%;min-height:260px;max-height:50vh;color:var(--dsw-alias-label-primary);font:14px/22px var(--dsw-font-family);padding:10px 12px;display:block}.ypSjoa_candidate textarea:focus-visible{border-color:var(--dsw-alias-state-business-primary);outline:none}.ypSjoa_destination{margin-top:12px}.ypSjoa_truncated,.ypSjoa_placeNote{color:var(--dsw-alias-label-tertiary);margin-top:6px;font-size:12px;line-height:18px;display:block}.ypSjoa_placeNote[data-tone=blocked]{color:var(--dsw-alias-state-warn-label)}@media (width<=640px),(height<=560px){.ypSjoa_modal{width:min(100%, calc(100vw - max(8px, env(safe-area-inset-left,0px)) - max(8px, env(safe-area-inset-right,0px))));max-height:calc(100vh - 16px)}.ypSjoa_modal .ypSjoa_modalAction{min-width:0;min-height:44px}.ypSjoa_candidate textarea{min-height:clamp(140px,32vh,220px);max-height:42vh}}@media (pointer:coarse) and (width<=640px),(pointer:coarse) and (height<=560px){.ypSjoa_candidate textarea{font-size:16px}}@supports (height:100dvh){.ypSjoa_modal{max-height:calc(100dvh - 24px)}@media (width<=640px),(height<=560px){.ypSjoa_modal{max-height:calc(100dvh - 16px)}.ypSjoa_candidate textarea{min-height:clamp(140px,32dvh,220px);max-height:42dvh}}}";
|
|
8730
10935
|
const tagId$1 = "dsh-mnemon/src/client/MnemonSaveAction.module.css";
|
|
8731
10936
|
if (typeof document !== "undefined") {
|
|
8732
10937
|
let tag = document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]");
|
|
@@ -8741,10 +10946,12 @@ window.__ModuleLoader__.load({
|
|
|
8741
10946
|
"button": "ypSjoa_button",
|
|
8742
10947
|
"candidate": "ypSjoa_candidate",
|
|
8743
10948
|
"candidateHeading": "ypSjoa_candidateHeading",
|
|
10949
|
+
"destination": "ypSjoa_destination",
|
|
8744
10950
|
"icon": "ypSjoa_icon",
|
|
8745
10951
|
"modal": "ypSjoa_modal",
|
|
8746
10952
|
"modalAction": "ypSjoa_modalAction",
|
|
8747
10953
|
"modalContent": "ypSjoa_modalContent",
|
|
10954
|
+
"placeNote": "ypSjoa_placeNote",
|
|
8748
10955
|
"readOnly": "ypSjoa_readOnly",
|
|
8749
10956
|
"status": "ypSjoa_status",
|
|
8750
10957
|
"truncated": "ypSjoa_truncated",
|
|
@@ -8753,10 +10960,167 @@ window.__ModuleLoader__.load({
|
|
|
8753
10960
|
//#endregion
|
|
8754
10961
|
//#region src/client/MnemonSaveAction.tsx
|
|
8755
10962
|
const PREVIEW_LIMIT = 8e3;
|
|
10963
|
+
/** One working-memory entry as Runtime Memory stores it: one line of at most 8 KiB, without the § delimiter. */
|
|
10964
|
+
const RUNTIME_ENTRY_BYTES = 8192;
|
|
10965
|
+
const RUNTIME_PLACES = {
|
|
10966
|
+
"runtime:memory": "saveAction.to.memory",
|
|
10967
|
+
"runtime:user": "saveAction.to.user"
|
|
10968
|
+
};
|
|
10969
|
+
function isRuntimePlace(destination) {
|
|
10970
|
+
return destination === "runtime:memory" || destination === "runtime:user";
|
|
10971
|
+
}
|
|
10972
|
+
/**
|
|
10973
|
+
* The places a candidate can go. A layer takes it while it is on, its Source
|
|
10974
|
+
* runs and its writes are not switched off. What the status does not say
|
|
10975
|
+
* counts as available, so a partial status never hides the task Agent.
|
|
10976
|
+
*/
|
|
10977
|
+
function saveDestinations(status, taskAgent, t) {
|
|
10978
|
+
const system = status?.memorySystem;
|
|
10979
|
+
const takes = (sourceTypeId) => {
|
|
10980
|
+
const layer = system?.configuration.layers[sourceTypeId];
|
|
10981
|
+
return layer?.enabled !== false && layer?.participation?.write !== "off" && (system?.sources === void 0 || system.sources.some((source) => source.sourceTypeId === sourceTypeId));
|
|
10982
|
+
};
|
|
10983
|
+
const runtimeOn = takes("runtime");
|
|
10984
|
+
const spacesOn = takes("memory-spaces");
|
|
10985
|
+
const spaces = spacesOn ? (status?.memoryBodies ?? []).filter((body) => body.active !== false && body.providerEnabled !== false && body.provider.capabilities.remember && ((body.provider.typeId ?? body.provider.id) !== "mnemon-native" || status?.commandFound !== false)) : [];
|
|
10986
|
+
const providerReady = spaces.length > 0 || status?.commandFound !== false || (status?.providerServices ?? []).some((provider) => provider.enabled && provider.configured);
|
|
10987
|
+
return [
|
|
10988
|
+
{
|
|
10989
|
+
value: "agent",
|
|
10990
|
+
label: t("saveAction.to.agent"),
|
|
10991
|
+
detail: t("saveAction.to.agentDetail"),
|
|
10992
|
+
disabled: taskAgent === false || !spacesOn || !providerReady
|
|
10993
|
+
},
|
|
10994
|
+
...runtimeOn ? Object.keys(RUNTIME_PLACES).map((value) => ({
|
|
10995
|
+
value,
|
|
10996
|
+
label: t(RUNTIME_PLACES[value])
|
|
10997
|
+
})) : [],
|
|
10998
|
+
...spaces.map((body) => ({
|
|
10999
|
+
value: `space:${body.id}`,
|
|
11000
|
+
label: body.name,
|
|
11001
|
+
detail: t("saveAction.to.space", { provider: body.provider.label })
|
|
11002
|
+
}))
|
|
11003
|
+
];
|
|
11004
|
+
}
|
|
11005
|
+
/** The default instance of a Source type, as the workbench picks it, else the first. */
|
|
11006
|
+
function placeSource(catalog, sourceTypeId) {
|
|
11007
|
+
const sources = catalog.sources.filter((source) => source.sourceTypeId === sourceTypeId);
|
|
11008
|
+
return sources.find((source) => isDefaultSourceInstance(source.sourceInstanceKey, sourceTypeId)) ?? sources[0];
|
|
11009
|
+
}
|
|
11010
|
+
/** Write the text to the place the user chose, through that Source's own operation, with a fresh revision. */
|
|
11011
|
+
async function saveDirectly(client, destination, place, content, t) {
|
|
11012
|
+
const source = placeSource(await client.sourceManagementCatalog(), isRuntimePlace(destination) ? "runtime" : "memory-spaces");
|
|
11013
|
+
if (source === void 0) throw new Error(t("saveAction.unavailable"));
|
|
11014
|
+
if (isRuntimePlace(destination)) {
|
|
11015
|
+
const input = {
|
|
11016
|
+
action: "add",
|
|
11017
|
+
target: destination === "runtime:user" ? "user" : "memory",
|
|
11018
|
+
content
|
|
11019
|
+
};
|
|
11020
|
+
const result = (source.assistance?.includes("mutate") === true ? await client.assistSource(source.sourceInstanceKey, "mutate", input, source.revision, true) : await client.mutateSourceManagement(source.sourceInstanceKey, "mutate", input, source.revision, true)).value;
|
|
11021
|
+
if (result.message?.startsWith("Entry already exists") === true) return {
|
|
11022
|
+
action: "skipped",
|
|
11023
|
+
note: { key: "saveAction.saved.duplicate" }
|
|
11024
|
+
};
|
|
11025
|
+
return {
|
|
11026
|
+
action: "added",
|
|
11027
|
+
note: {
|
|
11028
|
+
key: result.maintenance === void 0 ? "saveAction.saved.runtime" : "saveAction.saved.runtimeMaintained",
|
|
11029
|
+
params: { count: result.entryCount },
|
|
11030
|
+
place: RUNTIME_PLACES[destination]
|
|
11031
|
+
}
|
|
11032
|
+
};
|
|
11033
|
+
}
|
|
11034
|
+
const result = (await client.mutateSourceManagement(source.sourceInstanceKey, "remember", {
|
|
11035
|
+
content,
|
|
11036
|
+
memoryBodyId: destination.slice(6),
|
|
11037
|
+
source: "user"
|
|
11038
|
+
}, source.revision, true)).value;
|
|
11039
|
+
const answered = typeof result.action === "string" ? result.action : "stored";
|
|
11040
|
+
const action = answered === "queued" ? "accepted" : answered;
|
|
11041
|
+
const outcome = writeOutcome(action);
|
|
11042
|
+
return {
|
|
11043
|
+
action,
|
|
11044
|
+
note: {
|
|
11045
|
+
key: outcome === "skipped" ? "saveAction.saved.duplicate" : outcome === "pending" ? "saveAction.saved.spacePending" : outcome === "written" || outcome === "updated" ? "saveAction.saved.space" : "saveAction.saved.spaceOther",
|
|
11046
|
+
params: {
|
|
11047
|
+
space: place,
|
|
11048
|
+
action: answered
|
|
11049
|
+
}
|
|
11050
|
+
}
|
|
11051
|
+
};
|
|
11052
|
+
}
|
|
11053
|
+
/**
|
|
11054
|
+
* What a working-memory place says about this text before it is saved, and
|
|
11055
|
+
* whether it can take it at all, by the Runtime Source's own rules: one line of
|
|
11056
|
+
* at most 8 KiB and never more than its file, without the § delimiter. A full
|
|
11057
|
+
* file keeps its entries within 70% of its limit, less the new one.
|
|
11058
|
+
*/
|
|
11059
|
+
function runtimePlaceNote(destination, content, usage, taskAgent, agentOpen, t) {
|
|
11060
|
+
if (!isRuntimePlace(destination) || content === "") return void 0;
|
|
11061
|
+
const user = destination === "runtime:user";
|
|
11062
|
+
const target = t(RUNTIME_PLACES[destination]);
|
|
11063
|
+
const entry = content.replace(/\s+/gu, " ");
|
|
11064
|
+
if (entry.includes("§")) return {
|
|
11065
|
+
text: t("saveAction.place.delimiter", { target }),
|
|
11066
|
+
blocked: true
|
|
11067
|
+
};
|
|
11068
|
+
const bytes = new TextEncoder().encode(entry).length;
|
|
11069
|
+
const room = usage?.[user ? "user" : "memory"];
|
|
11070
|
+
const cap = Math.min(RUNTIME_ENTRY_BYTES, room?.limit ?? RUNTIME_ENTRY_BYTES);
|
|
11071
|
+
const orAgent = agentOpen ? t("saveAction.place.orAgent") : "";
|
|
11072
|
+
if (bytes > cap) {
|
|
11073
|
+
const exact = humanBytes(bytes) === humanBytes(cap);
|
|
11074
|
+
return {
|
|
11075
|
+
text: t("saveAction.place.tooLong", {
|
|
11076
|
+
target,
|
|
11077
|
+
size: exact ? `${bytes} B` : humanBytes(bytes),
|
|
11078
|
+
limit: exact ? `${cap} B` : humanBytes(cap)
|
|
11079
|
+
}) + orAgent,
|
|
11080
|
+
blocked: true
|
|
11081
|
+
};
|
|
11082
|
+
}
|
|
11083
|
+
if (room === void 0 || room.used + bytes + (room.used > 0 ? 4 : 0) <= room.limit) return void 0;
|
|
11084
|
+
const kept = Math.floor(room.limit * .7) - 4;
|
|
11085
|
+
const keep = Math.max(0, kept - bytes);
|
|
11086
|
+
const used = humanBytes(room.used);
|
|
11087
|
+
const limit = humanBytes(room.limit);
|
|
11088
|
+
if (user) {
|
|
11089
|
+
if (taskAgent === false) return {
|
|
11090
|
+
text: t("saveAction.place.userFull"),
|
|
11091
|
+
blocked: true
|
|
11092
|
+
};
|
|
11093
|
+
if (keep === 0) return {
|
|
11094
|
+
text: t("saveAction.place.userTooLong", {
|
|
11095
|
+
size: humanBytes(bytes),
|
|
11096
|
+
max: humanBytes(Math.max(0, kept))
|
|
11097
|
+
}) + orAgent,
|
|
11098
|
+
blocked: true
|
|
11099
|
+
};
|
|
11100
|
+
return {
|
|
11101
|
+
text: t("saveAction.place.userCondense", {
|
|
11102
|
+
used,
|
|
11103
|
+
limit,
|
|
11104
|
+
keep: humanBytes(keep)
|
|
11105
|
+
}),
|
|
11106
|
+
blocked: false
|
|
11107
|
+
};
|
|
11108
|
+
}
|
|
11109
|
+
return {
|
|
11110
|
+
text: t(keep === 0 ? "saveAction.place.fullAll" : "saveAction.place.full", {
|
|
11111
|
+
target,
|
|
11112
|
+
used,
|
|
11113
|
+
limit,
|
|
11114
|
+
keep: humanBytes(keep)
|
|
11115
|
+
}),
|
|
11116
|
+
blocked: false
|
|
11117
|
+
};
|
|
11118
|
+
}
|
|
8756
11119
|
/**
|
|
8757
11120
|
* Save-to-memory action on finalized assistant messages. A task Agent decides
|
|
8758
|
-
* whether the (editable) reply is worth keeping and
|
|
8759
|
-
*
|
|
11121
|
+
* whether the (editable) reply is worth keeping and where it goes, or the user
|
|
11122
|
+
* names the place and the text goes there through that place's own write. The
|
|
11123
|
+
* dialog shows the same receipt as Save to memory on the Memory Spaces page.
|
|
8760
11124
|
*/
|
|
8761
11125
|
const MnemonSaveAction = (0, react.memo)(function MnemonSaveAction({ messageId, sessionId, connection, settingsScope, localeRuntime, t }) {
|
|
8762
11126
|
const subscribeLocale = (0, react.useCallback)((listener) => localeRuntime.subscribe(listener), [localeRuntime]);
|
|
@@ -8769,15 +11133,19 @@ window.__ModuleLoader__.load({
|
|
|
8769
11133
|
const [open, setOpen] = (0, react.useState)(false);
|
|
8770
11134
|
const [writeEnabled, setWriteEnabled] = (0, react.useState)(void 0);
|
|
8771
11135
|
const [taskAgent, setTaskAgent] = (0, react.useState)(void 0);
|
|
11136
|
+
const [status, setStatus] = (0, react.useState)(void 0);
|
|
11137
|
+
const [chosen, setChosen] = (0, react.useState)(void 0);
|
|
8772
11138
|
const [candidate, setCandidate] = (0, react.useState)(void 0);
|
|
8773
11139
|
const [truncated, setTruncated] = (0, react.useState)(false);
|
|
8774
11140
|
const [missing, setMissing] = (0, react.useState)(false);
|
|
8775
11141
|
const [submitting, setSubmitting] = (0, react.useState)(false);
|
|
8776
11142
|
const [outcome, setOutcome] = (0, react.useState)(null);
|
|
11143
|
+
const [usage, setUsage] = (0, react.useState)(void 0);
|
|
8777
11144
|
const candidateId = (0, react.useId)();
|
|
8778
11145
|
const openRef = (0, react.useRef)(false);
|
|
8779
11146
|
const requestVersionRef = (0, react.useRef)(0);
|
|
8780
|
-
const
|
|
11147
|
+
const inFlightRef = (0, react.useRef)(void 0);
|
|
11148
|
+
const unseenRef = (0, react.useRef)(void 0);
|
|
8781
11149
|
const setPanelOpen = (next) => {
|
|
8782
11150
|
requestVersionRef.current += 1;
|
|
8783
11151
|
openRef.current = next;
|
|
@@ -8787,33 +11155,45 @@ window.__ModuleLoader__.load({
|
|
|
8787
11155
|
if (!open) {
|
|
8788
11156
|
setWriteEnabled(void 0);
|
|
8789
11157
|
setTaskAgent(void 0);
|
|
11158
|
+
setStatus(void 0);
|
|
11159
|
+
setChosen(void 0);
|
|
8790
11160
|
setCandidate(void 0);
|
|
8791
11161
|
setTruncated(false);
|
|
8792
11162
|
setMissing(false);
|
|
8793
|
-
setSubmitting(
|
|
11163
|
+
setSubmitting(inFlightRef.current !== void 0);
|
|
8794
11164
|
setOutcome(null);
|
|
11165
|
+
setUsage(void 0);
|
|
8795
11166
|
return;
|
|
8796
11167
|
}
|
|
8797
11168
|
const requestVersion = ++requestVersionRef.current;
|
|
8798
11169
|
let alive = true;
|
|
8799
|
-
setSubmitting(
|
|
11170
|
+
setSubmitting(inFlightRef.current !== void 0);
|
|
11171
|
+
const unseen = unseenRef.current;
|
|
11172
|
+
unseenRef.current = void 0;
|
|
11173
|
+
const restored = unseen ?? inFlightRef.current;
|
|
11174
|
+
if (restored !== void 0) setChosen(restored.destination);
|
|
11175
|
+
if (unseen !== void 0) setOutcome(unseen);
|
|
8800
11176
|
const client = new MnemonClient(connection, sessionId);
|
|
8801
11177
|
client.status().then((status) => {
|
|
8802
11178
|
if (!alive || requestVersionRef.current !== requestVersion) return;
|
|
8803
11179
|
setWriteEnabled(status.writeEnabled && managementWritable);
|
|
8804
11180
|
setTaskAgent(status.lifecycle?.taskAgentAvailable);
|
|
11181
|
+
setStatus(status);
|
|
8805
11182
|
}).catch(() => {
|
|
8806
11183
|
if (alive && requestVersionRef.current === requestVersion) setWriteEnabled(false);
|
|
8807
11184
|
});
|
|
8808
11185
|
client.assistantMessageText(messageId).then((result) => {
|
|
8809
11186
|
if (!alive || requestVersionRef.current !== requestVersion) return;
|
|
8810
|
-
if (
|
|
11187
|
+
if (restored !== void 0) setCandidate(restored.content);
|
|
11188
|
+
else if (result === null || result.text === "") setMissing(true);
|
|
8811
11189
|
else {
|
|
8812
11190
|
setTruncated(result.text.length > PREVIEW_LIMIT);
|
|
8813
11191
|
setCandidate(result.text.slice(0, PREVIEW_LIMIT));
|
|
8814
11192
|
}
|
|
8815
11193
|
}).catch(() => {
|
|
8816
|
-
if (alive
|
|
11194
|
+
if (!alive || requestVersionRef.current !== requestVersion) return;
|
|
11195
|
+
if (restored !== void 0) setCandidate(restored.content);
|
|
11196
|
+
else setMissing(true);
|
|
8817
11197
|
});
|
|
8818
11198
|
return () => {
|
|
8819
11199
|
alive = false;
|
|
@@ -8826,37 +11206,83 @@ window.__ModuleLoader__.load({
|
|
|
8826
11206
|
managementWritable
|
|
8827
11207
|
]);
|
|
8828
11208
|
const content = candidate?.trim() ?? "";
|
|
8829
|
-
const
|
|
8830
|
-
const
|
|
11209
|
+
const options = saveDestinations(status, taskAgent, t);
|
|
11210
|
+
const usable = options.filter((option) => option.disabled !== true);
|
|
11211
|
+
const destination = chosen ?? usable[0]?.value ?? "agent";
|
|
11212
|
+
const selected = options.find((option) => option.value === destination);
|
|
11213
|
+
const runtimeTarget = isRuntimePlace(destination) ? destination : void 0;
|
|
11214
|
+
(0, react.useEffect)(() => {
|
|
11215
|
+
if (!open || runtimeTarget === void 0 || usage !== void 0 || status === void 0) return;
|
|
11216
|
+
const runtime = status.memorySystem === void 0 ? void 0 : placeSource(status.memorySystem, "runtime");
|
|
11217
|
+
if (runtime === void 0) {
|
|
11218
|
+
setUsage({});
|
|
11219
|
+
return;
|
|
11220
|
+
}
|
|
11221
|
+
let alive = true;
|
|
11222
|
+
new MnemonClient(connection, sessionId).readSourceManagement(runtime.sourceInstanceKey, "snapshot").then((result) => {
|
|
11223
|
+
if (alive) setUsage(result.value?.targets ?? {});
|
|
11224
|
+
}, () => {
|
|
11225
|
+
if (alive) setUsage({});
|
|
11226
|
+
});
|
|
11227
|
+
return () => {
|
|
11228
|
+
alive = false;
|
|
11229
|
+
};
|
|
11230
|
+
}, [
|
|
11231
|
+
open,
|
|
11232
|
+
runtimeTarget,
|
|
11233
|
+
usage,
|
|
11234
|
+
status,
|
|
11235
|
+
connection,
|
|
11236
|
+
sessionId
|
|
11237
|
+
]);
|
|
11238
|
+
const placeNote = runtimePlaceNote(destination, content, usage, taskAgent, options.some((option) => option.value === "agent" && option.disabled !== true), t);
|
|
11239
|
+
const answered = outcome !== null && outcome.error === void 0 && outcome.content === content && outcome.destination === destination;
|
|
11240
|
+
const placeReady = runtimeTarget === void 0 || usage !== void 0;
|
|
11241
|
+
const canSubmit = content !== "" && !submitting && writeEnabled === true && selected !== void 0 && selected.disabled !== true && placeReady && placeNote?.blocked !== true && !answered;
|
|
8831
11242
|
const submit = () => {
|
|
8832
|
-
if (!canSubmit ||
|
|
11243
|
+
if (!canSubmit || inFlightRef.current !== void 0) return;
|
|
8833
11244
|
const requestVersion = requestVersionRef.current;
|
|
8834
|
-
|
|
11245
|
+
const target = destination;
|
|
11246
|
+
inFlightRef.current = {
|
|
11247
|
+
content,
|
|
11248
|
+
destination: target
|
|
11249
|
+
};
|
|
8835
11250
|
setSubmitting(true);
|
|
8836
11251
|
setOutcome(null);
|
|
8837
|
-
new MnemonClient(connection, sessionId)
|
|
8838
|
-
|
|
8839
|
-
|
|
8840
|
-
|
|
8841
|
-
|
|
8842
|
-
|
|
8843
|
-
|
|
8844
|
-
|
|
8845
|
-
|
|
8846
|
-
|
|
8847
|
-
|
|
8848
|
-
|
|
8849
|
-
|
|
11252
|
+
const client = new MnemonClient(connection, sessionId);
|
|
11253
|
+
(target === "agent" ? client.supervise(content, messageId).then((result) => ({
|
|
11254
|
+
action: result.action,
|
|
11255
|
+
summary: result.summary
|
|
11256
|
+
})) : saveDirectly(client, target, selected?.label ?? target, content, t)).then((result) => ({
|
|
11257
|
+
content,
|
|
11258
|
+
destination: target,
|
|
11259
|
+
...result
|
|
11260
|
+
}), (reason) => ({
|
|
11261
|
+
content,
|
|
11262
|
+
destination: target,
|
|
11263
|
+
error: message(reason)
|
|
11264
|
+
})).then((result) => {
|
|
11265
|
+
inFlightRef.current = void 0;
|
|
11266
|
+
if (openRef.current && (target !== "agent" || requestVersionRef.current === requestVersion)) setOutcome(result);
|
|
11267
|
+
else if (!openRef.current && target !== "agent") unseenRef.current = result;
|
|
8850
11268
|
if (openRef.current) setSubmitting(false);
|
|
11269
|
+
if (isRuntimePlace(target) && result.error === void 0) setUsage(void 0);
|
|
8851
11270
|
});
|
|
8852
11271
|
};
|
|
8853
11272
|
const viewMemory = () => {
|
|
11273
|
+
const runtime = outcome !== null && isRuntimePlace(outcome.destination);
|
|
8854
11274
|
setPanelOpen(false);
|
|
8855
11275
|
dispatchMnemonAnchor({
|
|
8856
|
-
page: "memory-spaces/content",
|
|
11276
|
+
page: runtime ? "runtime/entries" : "memory-spaces/content",
|
|
11277
|
+
...runtime ? { seed: outcome.content.replace(/\s+/gu, " ") } : {},
|
|
8857
11278
|
...sessionId === void 0 ? {} : { sessionId }
|
|
8858
11279
|
});
|
|
8859
11280
|
};
|
|
11281
|
+
const direct = writeEnabled === true && destination !== "agent";
|
|
11282
|
+
const receiptSummary = outcome?.note === void 0 ? outcome?.summary : t(outcome.note.key, {
|
|
11283
|
+
...outcome.note.params,
|
|
11284
|
+
...outcome.note.place === void 0 ? {} : { target: t(outcome.note.place) }
|
|
11285
|
+
});
|
|
8860
11286
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8861
11287
|
className: MnemonSaveAction_module_css_default.wrap,
|
|
8862
11288
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
|
|
@@ -8880,7 +11306,7 @@ window.__ModuleLoader__.load({
|
|
|
8880
11306
|
onClose: () => setPanelOpen(false),
|
|
8881
11307
|
title: t("saveAction.title"),
|
|
8882
11308
|
closeLabel: t("saveAction.close"),
|
|
8883
|
-
description: t("saveAction.hint"),
|
|
11309
|
+
description: t(direct ? "saveAction.hintDirect" : "saveAction.hint"),
|
|
8884
11310
|
className: MnemonSaveAction_module_css_default.modal,
|
|
8885
11311
|
contentClassName: MnemonSaveAction_module_css_default.modalContent,
|
|
8886
11312
|
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, {
|
|
@@ -8894,7 +11320,7 @@ window.__ModuleLoader__.load({
|
|
|
8894
11320
|
className: MnemonSaveAction_module_css_default.modalAction,
|
|
8895
11321
|
disabled: !canSubmit,
|
|
8896
11322
|
onClick: submit,
|
|
8897
|
-
children: submitting ? t("saveAction.submitting") : t("saveAction.submit")
|
|
11323
|
+
children: direct ? submitting ? t("saveAction.saving") : t("saveAction.save") : submitting ? t("saveAction.submitting") : t("saveAction.submit")
|
|
8898
11324
|
})] }),
|
|
8899
11325
|
children: [
|
|
8900
11326
|
writeEnabled === false && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
@@ -8919,8 +11345,8 @@ window.__ModuleLoader__.load({
|
|
|
8919
11345
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
8920
11346
|
htmlFor: candidateId,
|
|
8921
11347
|
children: t("saveAction.candidate")
|
|
8922
|
-
}), writeEnabled === true && taskAgent !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TaskAgentTag, {
|
|
8923
|
-
available: taskAgent,
|
|
11348
|
+
}), writeEnabled === true && !direct && taskAgent !== void 0 && usable.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TaskAgentTag, {
|
|
11349
|
+
available: taskAgent && selected?.disabled !== true,
|
|
8924
11350
|
t
|
|
8925
11351
|
})]
|
|
8926
11352
|
}),
|
|
@@ -8934,15 +11360,34 @@ window.__ModuleLoader__.load({
|
|
|
8934
11360
|
truncated && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
|
|
8935
11361
|
className: MnemonSaveAction_module_css_default.truncated,
|
|
8936
11362
|
children: t("saveAction.truncated", { limit: PREVIEW_LIMIT })
|
|
11363
|
+
}),
|
|
11364
|
+
writeEnabled === true && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SelectField, {
|
|
11365
|
+
className: MnemonSaveAction_module_css_default.destination,
|
|
11366
|
+
label: t("saveAction.to"),
|
|
11367
|
+
value: destination,
|
|
11368
|
+
options,
|
|
11369
|
+
disabled: submitting,
|
|
11370
|
+
onChange: setChosen
|
|
11371
|
+
}),
|
|
11372
|
+
writeEnabled === true && placeNote !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
|
|
11373
|
+
className: MnemonSaveAction_module_css_default.placeNote,
|
|
11374
|
+
"data-tone": placeNote.blocked ? "blocked" : "caution",
|
|
11375
|
+
children: placeNote.text
|
|
11376
|
+
}),
|
|
11377
|
+
writeEnabled === true && status !== void 0 && usable.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", {
|
|
11378
|
+
className: MnemonSaveAction_module_css_default.placeNote,
|
|
11379
|
+
"data-tone": "blocked",
|
|
11380
|
+
children: t("saveAction.noPlace")
|
|
8937
11381
|
})
|
|
8938
11382
|
]
|
|
8939
11383
|
}),
|
|
8940
11384
|
outcome !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WriteReceipt, {
|
|
8941
11385
|
t,
|
|
8942
11386
|
action: outcome.action,
|
|
8943
|
-
summary:
|
|
11387
|
+
summary: receiptSummary,
|
|
8944
11388
|
error: outcome.error,
|
|
8945
|
-
onView: viewMemory
|
|
11389
|
+
onView: viewMemory,
|
|
11390
|
+
...isRuntimePlace(outcome.destination) ? { viewLabel: t("receipt.viewRuntime") } : {}
|
|
8946
11391
|
})
|
|
8947
11392
|
]
|
|
8948
11393
|
})]
|
|
@@ -12236,6 +14681,7 @@ window.__ModuleLoader__.load({
|
|
|
12236
14681
|
componentChanges: seats.components,
|
|
12237
14682
|
t: translate
|
|
12238
14683
|
});
|
|
14684
|
+
const renderContributed = (packageName, owner) => renderComponentRegion(ctx, MNEMON_COMPONENT_SETTINGS_SLOT, packageName, owner);
|
|
12239
14685
|
ctx.slots.inject("plugins.bundle.config", () => ctx.slots.register({
|
|
12240
14686
|
name: "plugins.bundle.config",
|
|
12241
14687
|
key: MNEMON_PACKAGE_NAME,
|
|
@@ -12244,9 +14690,11 @@ window.__ModuleLoader__.load({
|
|
|
12244
14690
|
kind: "keyed",
|
|
12245
14691
|
scope: "root"
|
|
12246
14692
|
} },
|
|
12247
|
-
inject:
|
|
14693
|
+
inject: () => ({
|
|
14694
|
+
...configurationServices(),
|
|
14695
|
+
renderContributed
|
|
14696
|
+
})
|
|
12248
14697
|
}, MnemonSettingsHost));
|
|
12249
|
-
const renderContributed = (packageName, owner) => renderComponentRegion(ctx, MNEMON_COMPONENT_SETTINGS_SLOT, packageName, owner);
|
|
12250
14698
|
for (const { rowId, packageName } of STARTER_COMPONENT_ROWS) ctx.slots.inject("plugins.row.config", () => ctx.slots.register({
|
|
12251
14699
|
name: "plugins.row.config",
|
|
12252
14700
|
key: `${MNEMON_PACKAGE_NAME}#${rowId}`,
|