dsh-engram 0.9.1 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js CHANGED
@@ -33,6 +33,33 @@ __export(entry_exports, {
33
33
  });
34
34
  module.exports = __toCommonJS(entry_exports);
35
35
 
36
+ // client/src/i18n/index.ts
37
+ var DEFAULT_LOCALE = "en-US";
38
+ var translate = (key) => key;
39
+ var localeTag = DEFAULT_LOCALE;
40
+ function installTranslator(fn, locale) {
41
+ translate = fn;
42
+ if (locale !== void 0 && locale !== "") localeTag = locale;
43
+ }
44
+ function activeLocale() {
45
+ return localeTag;
46
+ }
47
+ function format(text, params) {
48
+ return text.replace(
49
+ /\{(\w+)\}/g,
50
+ (match, name) => Object.prototype.hasOwnProperty.call(params, name) ? String(params[name]) : match
51
+ );
52
+ }
53
+ function stringParams(params) {
54
+ const out = {};
55
+ for (const [name, value] of Object.entries(params)) out[name] = String(value);
56
+ return out;
57
+ }
58
+ function tr(key, params) {
59
+ const text = params === void 0 ? translate(key) : translate(key, stringParams(params));
60
+ return params === void 0 ? text : format(text, params);
61
+ }
62
+
36
63
  // client/src/api.ts
37
64
  var API_PREFIX = "/api/dsh-engram";
38
65
  var EngramApiError = class extends Error {
@@ -129,7 +156,8 @@ var EngramApi = class {
129
156
  return readJson(await fetch(`${API_PREFIX}/observations${query({ workspace })}`));
130
157
  }
131
158
  async model(workspace = "") {
132
- return readJson(await fetch(`${API_PREFIX}/model${query({ workspace })}`));
159
+ const lang = activeLocale().toLowerCase().startsWith("ru") ? "ru" : "zh";
160
+ return readJson(await fetch(`${API_PREFIX}/model${query({ workspace, lang })}`));
133
161
  }
134
162
  async stats(workspace) {
135
163
  return readJson(await fetch(`${API_PREFIX}/stats${query({ workspace })}`));
@@ -307,7 +335,7 @@ function shortAgent(a) {
307
335
  return bare.replace(/^session[-_]/i, "").replace(/^agent[-_]/i, "").slice(0, 14);
308
336
  }
309
337
  function fmtDateShort(ts) {
310
- return ts ? new Date(ts).toLocaleDateString("zh-CN", { month: "short", day: "numeric" }) : "\u2013";
338
+ return ts ? new Date(ts).toLocaleDateString(activeLocale(), { month: "short", day: "numeric" }) : "\u2013";
311
339
  }
312
340
  function buildTasksMarkdown(tasks) {
313
341
  const esc = (s4) => String(s4 ?? "").replace(/\|/g, "\\|").replace(/\n/g, " ");
@@ -315,11 +343,7 @@ function buildTasksMarkdown(tasks) {
315
343
  const ev = `${t.artifact ? "artifact\u2713" : "artifact\u2717"} \xB7 ${t.evaluation ? "eval\u2713" : "eval\u2717"} \xB7 ${(t.memoryRefs?.length ?? 0) > 0 ? "ref\u2713" : "ref\u2717"}`;
316
344
  return `| ${t.state} | ${esc(t.name)} | ${esc(t.workspace.replace(/^.*[\\/]/, ""))} | ${esc(taskGaps(t).join(", ") || "\u2014")} | ${ev} | ${fmtDateShort(t.createdAt ?? 0)} |`;
317
345
  });
318
- return `# ESR \u4EFB\u52A1\u5BFC\u51FA \xB7 ${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10)}
319
-
320
- | \u72B6\u6001 | \u4EFB\u52A1 | \u5DE5\u4F5C\u533A | \u8BC1\u636E\u7F3A\u53E3 | \u8BC1\u636E | \u521B\u5EFA |
321
- |---|---|---|---|---|---|
322
- ${rows.join("\n") || "(\u65E0\u4EFB\u52A1)"}`;
346
+ return tr("# ESR \u4EFB\u52A1\u5BFC\u51FA \xB7 {0}\n\n| \u72B6\u6001 | \u4EFB\u52A1 | \u5DE5\u4F5C\u533A | \u8BC1\u636E\u7F3A\u53E3 | \u8BC1\u636E | \u521B\u5EFA |\n|---|---|---|---|---|---|\n{1}", { "0": (/* @__PURE__ */ new Date()).toISOString().slice(0, 10), "1": rows.join("\n") || tr("(\u65E0\u4EFB\u52A1)") });
323
347
  }
324
348
  var POLL_MS = 2e4;
325
349
 
@@ -561,7 +585,7 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
561
585
  const failed = [];
562
586
  for (const it of toPromote) {
563
587
  try {
564
- await api.createTask(effWs, it.content, "\u6E90\u81EA\u4F1A\u8BDD\u8BA1\u5212\uFF08todo_write \u4E00\u952E\u6C89\u6DC0\uFF09");
588
+ await api.createTask(effWs, it.content, tr("\u6E90\u81EA\u4F1A\u8BDD\u8BA1\u5212\uFF08todo_write \u4E00\u952E\u6C89\u6DC0\uFF09"));
565
589
  done.push(it.content);
566
590
  } catch {
567
591
  failed.push(it.content);
@@ -573,7 +597,7 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
573
597
  }
574
598
  if (failed.length > 0) {
575
599
  setPromoteNote(
576
- failed.length === done.length ? `\u6C89\u6DC0\u5931\u8D25\uFF1A${failed.length} \u9879\u672A\u80FD\u521B\u5EFA\uFF08\u5DE5\u4F5C\u533A\u5DF2\u6EE1\u6216\u670D\u52A1\u4E0D\u53EF\u8FBE\uFF09\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u8BD5` : `\u90E8\u5206\u5931\u8D25\uFF1A${failed.length}/${toPromote.length} \u9879\u672A\u80FD\u521B\u5EFA`
600
+ failed.length === done.length ? tr("\u6C89\u6DC0\u5931\u8D25\uFF1A{0} \u9879\u672A\u80FD\u521B\u5EFA\uFF08\u5DE5\u4F5C\u533A\u5DF2\u6EE1\u6216\u670D\u52A1\u4E0D\u53EF\u8FBE\uFF09\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u8BD5", { "0": failed.length }) : tr("\u90E8\u5206\u5931\u8D25\uFF1A{0}/{1} \u9879\u672A\u80FD\u521B\u5EFA", { "0": failed.length, "1": toPromote.length })
577
601
  );
578
602
  }
579
603
  setPromoteBusy(false);
@@ -591,7 +615,7 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
591
615
  if (out.state === "active") {
592
616
  setData((prev) => ({
593
617
  ...prev,
594
- error: `\u8BC1\u636E\u4ECD\u6709\u7F3A\u53E3\uFF1A${(out.gaps ?? []).join(", ")}${out.artifactReason ? `\uFF08${out.artifactReason}\uFF09` : ""} \u2014 \u4EFB\u52A1\u4FDD\u6301 ACTIVE`
618
+ error: tr("\u8BC1\u636E\u4ECD\u6709\u7F3A\u53E3\uFF1A{0}{1} \u2014 \u4EFB\u52A1\u4FDD\u6301 ACTIVE", { "0": (out.gaps ?? []).join(", "), "1": out.artifactReason ? `\uFF08${out.artifactReason}\uFF09` : "" })
595
619
  }));
596
620
  } else {
597
621
  setClosingFor(null);
@@ -680,7 +704,7 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
680
704
  }
681
705
  ),
682
706
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: { flex: "none", fontSize: 13, fontWeight: 600, lineHeight: "20px", color: "var(--dsw-alias-label-primary, inherit)", display: "inline-flex", alignItems: "center", gap: 5 }, children: [
683
- "\u4EFB\u52A1",
707
+ tr("\u4EFB\u52A1"),
684
708
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { ...chip, ...chipNeutral, fontSize: 9.5, padding: "0 6px", lineHeight: "15px", fontWeight: 700, letterSpacing: ".02em" }, children: "ESR" })
685
709
  ] }),
686
710
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { ref: wsMenuRef, onClick: (e) => e.stopPropagation(), style: { position: "relative", display: "inline-flex", flex: "none", alignItems: "center" }, children: [
@@ -689,7 +713,7 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
689
713
  {
690
714
  role: "button",
691
715
  tabIndex: 0,
692
- title: following ? `\u8DDF\u968F\u5F53\u524D\u4F1A\u8BDD \xB7 \u5DE5\u4F5C\u533A ${wsBasename || "\u2014"}\uFF08\u70B9\u51FB\u5207\u6362 ESR \u4EFB\u52A1\u6765\u6E90\uFF09` : `\u5DF2\u56FA\u5B9A\u5230 ${effLabel}\uFF08\u70B9\u51FB\u5207\u6362\uFF09`,
716
+ title: following ? tr("\u8DDF\u968F\u5F53\u524D\u4F1A\u8BDD \xB7 \u5DE5\u4F5C\u533A {0}\uFF08\u70B9\u51FB\u5207\u6362 ESR \u4EFB\u52A1\u6765\u6E90\uFF09", { "0": wsBasename || "\u2014" }) : tr("\u5DF2\u56FA\u5B9A\u5230 {0}\uFF08\u70B9\u51FB\u5207\u6362\uFF09", { "0": effLabel }),
693
717
  onClick: (e) => {
694
718
  e.preventDefault();
695
719
  e.stopPropagation();
@@ -714,7 +738,7 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
714
738
  {
715
739
  role: "button",
716
740
  tabIndex: 0,
717
- title: "\u6062\u590D\u8DDF\u968F\u5F53\u524D\u4F1A\u8BDD",
741
+ title: tr("\u6062\u590D\u8DDF\u968F\u5F53\u524D\u4F1A\u8BDD"),
718
742
  onClick: (e) => {
719
743
  e.preventDefault();
720
744
  e.stopPropagation();
@@ -734,15 +758,11 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
734
758
  }
735
759
  ),
736
760
  wsOpen && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: wsMenu, role: "menu", children: [
737
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { role: "menuitem", style: wsItem(following), onClick: () => {
761
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { role: "menuitem", style: wsItem(following), onClick: () => {
738
762
  setFocusWs("");
739
763
  setWsOpen(false);
740
- }, children: [
741
- "\u8DDF\u968F\u4F1A\u8BDD \xB7 ",
742
- wsBasename || "\u2014",
743
- following ? " \u2713" : ""
744
- ] }),
745
- wsOptions.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { ...wsItem(false), cursor: "default", color: "var(--dsh-color-muted-weak, #9ca3af)" }, children: "\u6682\u65E0\u5176\u4ED6\u5DE5\u4F5C\u533A" }),
764
+ }, children: tr("\u8DDF\u968F\u4F1A\u8BDD \xB7 {0}{1}", { "0": wsBasename || "\u2014", "1": following ? " \u2713" : "" }) }),
765
+ wsOptions.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { ...wsItem(false), cursor: "default", color: "var(--dsh-color-muted-weak, #9ca3af)" }, children: tr("\u6682\u65E0\u5176\u4ED6\u5DE5\u4F5C\u533A") }),
746
766
  wsOptions.map((o) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { role: "menuitem", style: wsItem(effWs === o.path && !following), onClick: () => {
747
767
  setFocusWs(o.path);
748
768
  setWsOpen(false);
@@ -750,7 +770,7 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
750
770
  o.label,
751
771
  effWs === o.path && !following ? " \u2713" : ""
752
772
  ] }, o.path)),
753
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { marginTop: 4, paddingTop: 4, borderTop: "1px solid var(--dsh-color-border, #e5e7eb)", fontSize: 10.5, color: "var(--dsh-color-muted-weak, #9ca3af)", padding: "3px 9px" }, children: "\u4EC5\u5207\u6362 ESR \u4EFB\u52A1/\u5173\u7CFB\u6765\u6E90\uFF1B\u5185\u7F6E todo \u4ECD\u5C5E\u672C\u4F1A\u8BDD" })
773
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { marginTop: 4, paddingTop: 4, borderTop: "1px solid var(--dsh-color-border, #e5e7eb)", fontSize: 10.5, color: "var(--dsh-color-muted-weak, #9ca3af)", padding: "3px 9px" }, children: tr("\u4EC5\u5207\u6362 ESR \u4EFB\u52A1/\u5173\u7CFB\u6765\u6E90\uFF1B\u5185\u7F6E todo \u4ECD\u5C5E\u672C\u4F1A\u8BDD") })
754
774
  ] })
755
775
  ] }),
756
776
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
@@ -765,23 +785,11 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
765
785
  flexWrap: "wrap"
766
786
  },
767
787
  children: [
768
- planItems.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: { ...chip, ...chipNeutral }, children: [
769
- "\u672C\u8F6E\u8BA1\u5212 ",
770
- planItems.length
771
- ] }),
772
- gappedTasks.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: { ...chip, ...STATUS.gap }, children: [
773
- "\u8FDB\u884C\u4E2D ",
774
- gappedTasks.length
775
- ] }),
776
- readyTasks.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: { ...chip, ...STATUS.ready }, children: [
777
- "\u5C31\u7EEA ",
778
- readyTasks.length
779
- ] }),
780
- stableCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: { ...chip, ...STATUS.stable }, children: [
781
- "\u5DF2\u95ED\u73AF ",
782
- stableCount
783
- ] }),
784
- data.error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { ...chip, ...chipError }, title: data.error, children: "API \u5931\u8D25" })
788
+ planItems.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { ...chip, ...chipNeutral }, children: tr("\u672C\u8F6E\u8BA1\u5212 {0}", { "0": planItems.length }) }),
789
+ gappedTasks.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { ...chip, ...STATUS.gap }, children: tr("\u8FDB\u884C\u4E2D {0}", { "0": gappedTasks.length }) }),
790
+ readyTasks.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { ...chip, ...STATUS.ready }, children: tr("\u5C31\u7EEA {0}", { "0": readyTasks.length }) }),
791
+ stableCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { ...chip, ...STATUS.stable }, children: tr("\u5DF2\u95ED\u73AF {0}", { "0": stableCount }) }),
792
+ data.error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { ...chip, ...chipError }, title: data.error, children: tr("API \u5931\u8D25") })
785
793
  ]
786
794
  }
787
795
  ),
@@ -794,36 +802,34 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
794
802
  "\u26A0 ",
795
803
  data.error
796
804
  ] }),
797
- data.denied && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 11.5, color: "var(--dsw-alias-label-tertiary, var(--dsh-color-muted, #6b7280))", lineHeight: 1.5 }, children: "ESR \u5DE5\u4F5C\u533A\u6570\u636E\u4E0D\u53EF\u8FBE\uFF08loopback-only \u5B88\u536B\uFF09\u2014 \u672C\u8F6E\u8BA1\u5212\u7167\u5E38\u5C55\u793A\uFF1B\u5B8C\u6574\u4EFB\u52A1\u4E0E\u5173\u7CFB\u89C1 \u8BBE\u7F6E \u2192 Engram \u8BB0\u5FC6\u3002" }),
805
+ data.denied && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 11.5, color: "var(--dsw-alias-label-tertiary, var(--dsh-color-muted, #6b7280))", lineHeight: 1.5 }, children: tr("ESR \u5DE5\u4F5C\u533A\u6570\u636E\u4E0D\u53EF\u8FBE\uFF08loopback-only \u5B88\u536B\uFF09\u2014 \u672C\u8F6E\u8BA1\u5212\u7167\u5E38\u5C55\u793A\uFF1B\u5B8C\u6574\u4EFB\u52A1\u4E0E\u5173\u7CFB\u89C1 \u8BBE\u7F6E \u2192 Engram \u8BB0\u5FC6\u3002") }),
798
806
  toolStats && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: statsRow, children: [
799
807
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
800
- "\u8FD1 ",
801
- toolStats.days,
802
- " \u5929 \xB7 todo ",
808
+ tr("\u8FD1 {0} \u5929 \xB7 todo ", { "0": toolStats.days }),
803
809
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: toolStats.tools.todo_write ?? 0 }),
804
810
  " \xB7 ",
805
811
  "ESR ",
806
812
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: esrToolSum(toolStats) }),
807
813
  " \xB7 ",
808
- "\u8BB0\u5FC6 ",
814
+ tr("\u8BB0\u5FC6 "),
809
815
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: memToolSum(toolStats) }),
810
816
  " \xB7 ",
811
- "\u8C03\u7528 ",
812
- toolStats.events
817
+ tr("\u8C03\u7528 {0}", { "0": toolStats.events })
813
818
  ] }),
814
- esrToolSum(toolStats) === 0 && toolStats.tools.todo_write > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 10.5, color: "var(--dsw-alias-label-dimmed, var(--dsh-color-muted-weak, #9ca3af))" }, children: "\u2014 ESR \u4E3A\u96F6\uFF0Ctodo \u53EF\u7528\u300C\u6C89\u6DC0\u5230 ESR\u300D\u8F6C\u8349\u7A3F" })
819
+ esrToolSum(toolStats) === 0 && toolStats.tools.todo_write > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 10.5, color: "var(--dsw-alias-label-dimmed, var(--dsh-color-muted-weak, #9ca3af))" }, children: tr("\u2014 ESR \u4E3A\u96F6\uFF0Ctodo \u53EF\u7528\u300C\u6C89\u6DC0\u5230 ESR\u300D\u8F6C\u8349\u7A3F") })
815
820
  ] }),
816
821
  planItems.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: planBox, children: [
817
822
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
818
823
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: { display: "inline-flex", alignItems: "center", gap: 6, minWidth: 0 }, children: [
819
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 12, fontWeight: 600, color: "var(--dsw-alias-label-secondary, var(--dsh-color-muted-strong, #4b5563))" }, children: "\u672C\u8F6E\u8BA1\u5212" }),
820
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: badgeTodo, children: "\u539F\u751F todo \xB7 \u4F1A\u8BDD\u5185" })
824
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 12, fontWeight: 600, color: "var(--dsw-alias-label-secondary, var(--dsh-color-muted-strong, #4b5563))" }, children: tr("\u672C\u8F6E\u8BA1\u5212") }),
825
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: badgeTodo, children: tr("\u539F\u751F todo \xB7 \u4F1A\u8BDD\u5185") })
821
826
  ] }),
822
827
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: { fontSize: 10.5, color: "var(--dsw-alias-label-dimmed, var(--dsh-color-muted-weak, #9ca3af))" }, children: [
823
828
  planItems.filter((p) => p.status === "completed").length,
824
829
  "/",
825
830
  planItems.length,
826
- " \u5B8C\u6210 \xB7 \u8DDF\u968F\u4F1A\u8BDD\u81EA\u52A8\u66F4\u65B0"
831
+ " ",
832
+ tr(" \u5B8C\u6210 \xB7 \u8DDF\u968F\u4F1A\u8BDD\u81EA\u52A8\u66F4\u65B0")
827
833
  ] })
828
834
  ] }),
829
835
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { style: { listStyle: "none", margin: 0, padding: 0, display: "flex", flexDirection: "column", gap: 3 }, children: planItems.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("li", { style: { display: "flex", alignItems: "flex-start", gap: 8, fontSize: 12.5, lineHeight: "20px", color: item.status === "completed" ? "var(--dsw-alias-label-tertiary, var(--dsh-color-muted, #6b7280))" : "var(--dsw-alias-label-secondary, var(--dsh-color-muted-strong, #4b5563))" }, children: [
@@ -831,8 +837,8 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
831
837
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { textDecoration: item.status === "completed" ? "line-through" : "none", overflowWrap: "anywhere" }, children: item.content })
832
838
  ] }, `${item.content}-${i}`)) }),
833
839
  (toPromote.length > 0 || promoted.size > 0) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", gap: 6, alignItems: "center", marginTop: 1 }, children: [
834
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "ed-btn", style: { ...btn, ...btnSolid, padding: "3px 9px", fontSize: 11.5 }, disabled: promoteBusy || toPromote.length === 0, onClick: () => void promoteAll(), title: "\u628A\u672C\u8F6E\u5F85\u529E\u8F6C\u6210 ESR \u4EFB\u52A1\u8349\u7A3F\uFF08\u8DE8\u4F1A\u8BDD\u4FDD\u7559\uFF09", children: promoteBusy ? "\u2026" : promoted.size > 0 ? toPromote.length > 0 ? `\u5DF2\u6C89\u6DC0 ${promoted.size} \u9879 \xB7 \u518D\u6C89\u6DC0 ${toPromote.length} \u9879` : `\u5DF2\u6C89\u6DC0 ${promoted.size} \u9879` : `\u6C89\u6DC0\u5230 ESR\uFF08${toPromote.length} \u9879\uFF09` }),
835
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 10.5, color: "var(--dsw-alias-label-dimmed, var(--dsh-color-muted-weak, #9ca3af))" }, children: "\u8F6C\u8349\u7A3F \xB7 \u8DE8\u4F1A\u8BDD\u95ED\u73AF" })
840
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "ed-btn", style: { ...btn, ...btnSolid, padding: "3px 9px", fontSize: 11.5 }, disabled: promoteBusy || toPromote.length === 0, onClick: () => void promoteAll(), title: tr("\u628A\u672C\u8F6E\u5F85\u529E\u8F6C\u6210 ESR \u4EFB\u52A1\u8349\u7A3F\uFF08\u8DE8\u4F1A\u8BDD\u4FDD\u7559\uFF09"), children: promoteBusy ? "\u2026" : promoted.size > 0 ? toPromote.length > 0 ? tr("\u5DF2\u6C89\u6DC0 {0} \u9879 \xB7 \u518D\u6C89\u6DC0 {1} \u9879", { "0": promoted.size, "1": toPromote.length }) : tr("\u5DF2\u6C89\u6DC0 {0} \u9879", { "0": promoted.size }) : tr("\u6C89\u6DC0\u5230 ESR\uFF08{0} \u9879\uFF09", { "0": toPromote.length }) }),
841
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 10.5, color: "var(--dsw-alias-label-dimmed, var(--dsh-color-muted-weak, #9ca3af))" }, children: tr("\u8F6C\u8349\u7A3F \xB7 \u8DE8\u4F1A\u8BDD\u95ED\u73AF") })
836
842
  ] }),
837
843
  promoteNote && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { fontSize: 11, color: "#dc2626", lineHeight: 1.4 }, role: "alert", children: [
838
844
  "\u26A0 ",
@@ -841,28 +847,20 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
841
847
  activeTasks.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", gap: 6, alignItems: "flex-start", fontSize: 11.5, lineHeight: 1.5, color: "var(--dsw-alias-label-dimmed, var(--dsh-color-muted, #6b7280))", paddingTop: 2 }, children: [
842
848
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { "aria-hidden": true, style: { color: badgeEsr.color }, children: "\u21B3" }),
843
849
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
844
- "\u672C\u8F6E\u8BA1\u5212\u662F",
845
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "\u4F1A\u8BDD\u5185" }),
846
- "\u539F\u751F todo\uFF0C\u968F\u4F1A\u8BDD\u7ED3\u675F\uFF1B\u591A\u6B65/\u9700\u957F\u671F\u4FDD\u7559\u7684\u5DE5\u4F5C\u5EFA\u8BAE",
847
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "\u7528 esr_task \u5EFA ESR \u4EFB\u52A1" }),
848
- "\uFF08\u8DE8\u4F1A\u8BDD\u95ED\u73AF\uFF0C\u5E26\u8BC1\u636E\u95E8\uFF09\u6C89\u6DC0\u4E0B\u6765\u3002"
850
+ tr("\u672C\u8F6E\u8BA1\u5212\u662F"),
851
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: tr("\u4F1A\u8BDD\u5185") }),
852
+ tr("\u539F\u751F todo\uFF0C\u968F\u4F1A\u8BDD\u7ED3\u675F\uFF1B\u591A\u6B65/\u9700\u957F\u671F\u4FDD\u7559\u7684\u5DE5\u4F5C\u5EFA\u8BAE"),
853
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: tr("\u7528 esr_task \u5EFA ESR \u4EFB\u52A1") }),
854
+ tr("\uFF08\u8DE8\u4F1A\u8BDD\u95ED\u73AF\uFF0C\u5E26\u8BC1\u636E\u95E8\uFF09\u6C89\u6DC0\u4E0B\u6765\u3002")
849
855
  ] })
850
856
  ] })
851
857
  ] }),
852
858
  !data.denied && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
853
859
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, flexWrap: "wrap" }, children: [
854
860
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: { display: "inline-flex", alignItems: "center", gap: 6, minWidth: 0 }, children: [
855
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: { fontSize: 12, fontWeight: 600, color: "var(--dsw-alias-label-secondary, var(--dsh-color-muted-strong, #4b5563))" }, children: [
856
- "\u5DE5\u4F5C\u533A ESR \u4EFB\u52A1 \xB7 ",
857
- activeTasks.length,
858
- " \u8FDB\u884C\u4E2D"
859
- ] }),
860
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: badgeEsr, children: "ESR \xB7 \u8DE8\u4F1A\u8BDD\u95ED\u73AF" }),
861
- planItems.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: { fontSize: 10.5, color: "var(--dsw-alias-label-dimmed, var(--dsh-color-muted-weak, #9ca3af))" }, children: [
862
- "\u8BA1\u5212 ",
863
- planItems.length,
864
- " \u6761 todo"
865
- ] })
861
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 12, fontWeight: 600, color: "var(--dsw-alias-label-secondary, var(--dsh-color-muted-strong, #4b5563))" }, children: tr("\u5DE5\u4F5C\u533A ESR \u4EFB\u52A1 \xB7 {0} \u8FDB\u884C\u4E2D", { "0": activeTasks.length }) }),
862
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: badgeEsr, children: tr("ESR \xB7 \u8DE8\u4F1A\u8BDD\u95ED\u73AF") }),
863
+ planItems.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 10.5, color: "var(--dsw-alias-label-dimmed, var(--dsh-color-muted-weak, #9ca3af))" }, children: tr("\u8BA1\u5212 {0} \u6761 todo", { "0": planItems.length }) })
866
864
  ] }),
867
865
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { flex: "1 1 auto" } }),
868
866
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
@@ -877,14 +875,15 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
877
875
  },
878
876
  children: [
879
877
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(IconPlus, {}),
880
- " \u65B0\u5EFA"
878
+ " ",
879
+ tr(" \u65B0\u5EFA")
881
880
  ]
882
881
  }
883
882
  ),
884
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", className: "ed-btn", style: { ...btn }, onClick: refreshNow, disabled: data.loading, title: "\u5237\u65B0", children: [
883
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", className: "ed-btn", style: { ...btn }, onClick: refreshNow, disabled: data.loading, title: tr("\u5237\u65B0"), children: [
885
884
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(IconRefresh, {}),
886
885
  " ",
887
- data.loading ? "\u2026" : "\u5237\u65B0"
886
+ data.loading ? "\u2026" : tr("\u5237\u65B0")
888
887
  ] })
889
888
  ] }),
890
889
  creating && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { border: "1px dashed var(--dsw-alias-border-l3, #c7d2fe)", borderRadius: 10, padding: 8, display: "flex", flexDirection: "column", gap: 6, background: "var(--dsw-alias-bg-multi-select, transparent)" }, children: [
@@ -893,7 +892,7 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
893
892
  {
894
893
  autoFocus: true,
895
894
  style: input,
896
- placeholder: "\u4EFB\u52A1\u540D\u2026",
895
+ placeholder: tr("\u4EFB\u52A1\u540D\u2026"),
897
896
  value: newName,
898
897
  onChange: (e) => setNewName(e.target.value),
899
898
  onKeyDown: (e) => {
@@ -906,17 +905,17 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
906
905
  "input",
907
906
  {
908
907
  style: { ...input, fontSize: 12 },
909
- placeholder: "\u8981\u4EA7\u51FA / \u6EE1\u8DB3\u4EC0\u4E48\uFF08\u53EF\u9009\uFF09",
908
+ placeholder: tr("\u8981\u4EA7\u51FA / \u6EE1\u8DB3\u4EC0\u4E48\uFF08\u53EF\u9009\uFF09"),
910
909
  value: newDesc,
911
910
  onChange: (e) => setNewDesc(e.target.value)
912
911
  }
913
912
  ),
914
913
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", gap: 6 }, children: [
915
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "ed-btn", style: { ...btn, ...btnSolid }, disabled: actionBusy || !newName.trim(), onClick: () => void submitCreate(), children: actionBusy ? "\u2026" : "\u521B\u5EFA" }),
916
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "ed-btn", style: btn, onClick: () => setCreating(false), children: "\u53D6\u6D88" })
914
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "ed-btn", style: { ...btn, ...btnSolid }, disabled: actionBusy || !newName.trim(), onClick: () => void submitCreate(), children: actionBusy ? "\u2026" : tr("\u521B\u5EFA") }),
915
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "ed-btn", style: btn, onClick: () => setCreating(false), children: tr("\u53D6\u6D88") })
917
916
  ] })
918
917
  ] }),
919
- activeTasks.length === 0 && data.tasks.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 12, color: "var(--dsw-alias-label-tertiary, var(--dsh-color-muted-weak, #9ca3af))", padding: "2px 0" }, children: "\u6682\u65E0\u6D3B\u52A8\u4EFB\u52A1 \u2014 \u70B9\u300C\u65B0\u5EFA\u300D\u6216\u5728\u5BF9\u8BDD\u4E2D\u8BA9 agent \u7528 esr_task \u5EFA\u4EFB\u52A1" }),
918
+ activeTasks.length === 0 && data.tasks.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 12, color: "var(--dsw-alias-label-tertiary, var(--dsh-color-muted-weak, #9ca3af))", padding: "2px 0" }, children: tr("\u6682\u65E0\u6D3B\u52A8\u4EFB\u52A1 \u2014 \u70B9\u300C\u65B0\u5EFA\u300D\u6216\u5728\u5BF9\u8BDD\u4E2D\u8BA9 agent \u7528 esr_task \u5EFA\u4EFB\u52A1") }),
920
919
  data.tasks.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: taskGrid, children: pagedTasks.map((task) => {
921
920
  const gaps = taskGaps(task);
922
921
  const isStable = task.state === "stable";
@@ -934,7 +933,7 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
934
933
  className: "ed-task-row",
935
934
  style: { flex: "1 1 auto", minWidth: 0, display: "flex", alignItems: "center", gap: 6, textAlign: "left", border: "none", background: "transparent", cursor: "pointer", padding: "1px 0", color: "var(--dsw-alias-label-primary, inherit)", fontSize: 12.5, fontWeight: 600, lineHeight: "20px", overflowWrap: "anywhere" },
936
935
  onClick: () => setExpandedId(expanded ? null : task.id),
937
- title: expanded ? "\u6536\u8D77\u8BE6\u60C5" : "\u5C55\u5F00\u8BE6\u60C5",
936
+ title: expanded ? tr("\u6536\u8D77\u8BE6\u60C5") : tr("\u5C55\u5F00\u8BE6\u60C5"),
938
937
  children: [
939
938
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { fontSize: 10, color: "var(--dsw-alias-label-tertiary, var(--dsh-color-muted-weak, #9ca3af))", flex: "none" }, children: expanded ? "\u25BE" : "\u25B8" }),
940
939
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { color: isStable ? "var(--dsw-alias-label-tertiary, var(--dsh-color-muted, #6b7280))" : "inherit", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: task.name }),
@@ -942,7 +941,7 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
942
941
  "span",
943
942
  {
944
943
  style: { flex: "none", width: 7, height: 7, borderRadius: "50%", background: statusColor.fg },
945
- title: gaps.length > 0 ? `${label} \xB7 \u8BC1\u636E\u7F3A\u53E3: ${gaps.join(", ")}` : label
944
+ title: gaps.length > 0 ? tr("{0} \xB7 \u8BC1\u636E\u7F3A\u53E3: {1}", { "0": label, "1": gaps.join(", ") }) : label
946
945
  }
947
946
  )
948
947
  ]
@@ -951,7 +950,7 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
951
950
  expanded && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
952
951
  task.description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 12, lineHeight: 1.5, color: "var(--dsw-alias-label-secondary, var(--dsh-color-muted-strong, #4b5563))", overflowWrap: "anywhere" }, children: task.description }),
953
952
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", gap: 5, alignItems: "center", flexWrap: "wrap" }, children: [
954
- gaps.map((g) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: { ...chip, ...chipGap }, title: "\u8BC1\u636E\u7F3A\u53E3", children: [
953
+ gaps.map((g) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: { ...chip, ...chipGap }, title: tr("\u8BC1\u636E\u7F3A\u53E3"), children: [
955
954
  g,
956
955
  " \u2717"
957
956
  ] }, g)),
@@ -977,33 +976,26 @@ function EngramTaskDock({ sessionId, useSessions, useWorkspaces, useProjection,
977
976
  else if (expandedId === task.id) setExpandedId(null);
978
977
  setCreating(false);
979
978
  },
980
- children: open ? "\u6536\u8D77" : "\u8865\u9F50\u8BC1\u636E"
979
+ children: open ? tr("\u6536\u8D77") : tr("\u8865\u9F50\u8BC1\u636E")
981
980
  }
982
981
  ) })
983
982
  ] }),
984
983
  open && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { border: "1px dashed var(--dsw-alias-border-l2, #e5e7eb)", borderRadius: 8, padding: 7, display: "flex", flexDirection: "column", gap: 5, marginTop: 2 }, children: [
985
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 10.5, color: "var(--dsw-alias-label-tertiary, var(--dsh-color-muted, #6b7280))" }, children: "\u63D0\u4F9B\u4E09\u9879\u8BC1\u636E\u540E\u8F6C STABLE\uFF08artifact \xB7 evaluation \xB7 memory_ref\uFF09" }),
984
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { fontSize: 10.5, color: "var(--dsw-alias-label-tertiary, var(--dsh-color-muted, #6b7280))" }, children: tr("\u63D0\u4F9B\u4E09\u9879\u8BC1\u636E\u540E\u8F6C STABLE\uFF08artifact \xB7 evaluation \xB7 memory_ref\uFF09") }),
986
985
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", gap: 5, flexWrap: "wrap" }, children: [
987
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { style: { ...input, width: "auto", flex: "1 1 130px" }, placeholder: "artifact \u8DEF\u5F84/URL", value: closeArtifact, onChange: (e) => setCloseArtifact(e.target.value) }),
988
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { style: { ...input, width: "auto", flex: "1 1 130px" }, placeholder: "evaluation \u8BC1\u636E", value: closeEval, onChange: (e) => setCloseEval(e.target.value) }),
989
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { style: { ...input, width: "auto", flex: "1 1 130px" }, placeholder: "memory_refs \u9017\u53F7\u5206\u9694", value: closeRefs, onChange: (e) => setCloseRefs(e.target.value) }),
990
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "ed-btn", style: { ...btn, ...btnSolid }, disabled: actionBusy, onClick: () => void submitClose(task), children: actionBusy ? "\u2026" : "\u63D0\u4EA4\u5173\u95ED" })
986
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { style: { ...input, width: "auto", flex: "1 1 130px" }, placeholder: tr("artifact \u8DEF\u5F84/URL"), value: closeArtifact, onChange: (e) => setCloseArtifact(e.target.value) }),
987
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { style: { ...input, width: "auto", flex: "1 1 130px" }, placeholder: tr("evaluation \u8BC1\u636E"), value: closeEval, onChange: (e) => setCloseEval(e.target.value) }),
988
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { style: { ...input, width: "auto", flex: "1 1 130px" }, placeholder: tr("memory_refs \u9017\u53F7\u5206\u9694"), value: closeRefs, onChange: (e) => setCloseRefs(e.target.value) }),
989
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "ed-btn", style: { ...btn, ...btnSolid }, disabled: actionBusy, onClick: () => void submitClose(task), children: actionBusy ? "\u2026" : tr("\u63D0\u4EA4\u5173\u95ED") })
991
990
  ] })
992
991
  ] })
993
992
  ] })
994
993
  ] }, task.id);
995
994
  }) }),
996
995
  data.tasks.length > TASK_PAGE_SIZE && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, justifyContent: "flex-end", fontSize: 11.5, color: "var(--dsw-alias-label-tertiary, var(--dsh-color-muted-weak, #9ca3af))" }, children: [
997
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
998
- "\u5171 ",
999
- data.tasks.length,
1000
- " \xB7 ",
1001
- taskPage + 1,
1002
- "/",
1003
- totalPages
1004
- ] }),
1005
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "ed-btn", style: { ...btn, padding: "2px 8px", fontSize: 11.5 }, disabled: taskPage === 0, onClick: () => setTaskPage((v) => Math.max(0, v - 1)), children: "\u2039 \u4E0A\u4E00\u9875" }),
1006
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "ed-btn", style: { ...btn, padding: "2px 8px", fontSize: 11.5 }, disabled: taskPage >= totalPages - 1, onClick: () => setTaskPage((v) => Math.min(totalPages - 1, v + 1)), children: "\u4E0B\u4E00\u9875 \u203A" })
996
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: tr("\u5171 {0} \xB7 {1}/{2}", { "0": data.tasks.length, "1": taskPage + 1, "2": totalPages }) }),
997
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "ed-btn", style: { ...btn, padding: "2px 8px", fontSize: 11.5 }, disabled: taskPage === 0, onClick: () => setTaskPage((v) => Math.max(0, v - 1)), children: tr("\u2039 \u4E0A\u4E00\u9875") }),
998
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "ed-btn", style: { ...btn, padding: "2px 8px", fontSize: 11.5 }, disabled: taskPage >= totalPages - 1, onClick: () => setTaskPage((v) => Math.min(totalPages - 1, v + 1)), children: tr("\u4E0B\u4E00\u9875 \u203A") })
1007
999
  ] })
1008
1000
  ] })
1009
1001
  ] })
@@ -1188,13 +1180,14 @@ var import_jsx_runtime2 = require("react/jsx-runtime");
1188
1180
  var W = 640;
1189
1181
  var H = 420;
1190
1182
  var REL_LABEL = {
1191
- depends_on: "\u4F9D\u8D56",
1192
- implements: "\u5B9E\u73B0",
1193
- refines: "\u7EC6\u5316",
1194
- contradicts: "\u77DB\u76FE",
1195
- tracks: "\u8FFD\u8E2A",
1196
- relates_to: "\u5173\u8054"
1183
+ depends_on: tr("\u4F9D\u8D56"),
1184
+ implements: tr("\u5B9E\u73B0"),
1185
+ refines: tr("\u7EC6\u5316"),
1186
+ contradicts: tr("\u77DB\u76FE"),
1187
+ tracks: tr("\u8FFD\u8E2A"),
1188
+ relates_to: tr("\u5173\u8054")
1197
1189
  };
1190
+ var relLabel = (rel) => tr(REL_LABEL[rel] ?? rel);
1198
1191
  var REL_COLOR = {
1199
1192
  depends_on: "#f59e0b",
1200
1193
  implements: "#10b981",
@@ -1492,27 +1485,30 @@ function EngramGraph({ workspace, entities, tasks, links, nameOf }) {
1492
1485
  for (const rel of graph.keptLinks) incidentKinds.add(rel.relation);
1493
1486
  const zoom = (factor) => setView((v) => ({ ...v, k: Math.max(0.35, Math.min(3, v.k * factor)) }));
1494
1487
  if (graph.nodes.length === 0) {
1495
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { fontSize: 12.5, color: "var(--dsh-color-muted, #6b7280)", padding: "8px 0" }, children: "\u6682\u65E0\u8282\u70B9/\u5173\u7CFB\u53EF\u7ED8\u5236 \u2014 \u6A21\u578B\u7528 esr_node / esr_link \u767B\u8BB0\u9886\u57DF\u5BF9\u8C61\u5E76\u4E92\u8FDE\u540E\uFF0C\u8FD9\u91CC\u4F1A\u51FA\u73B0\u529B\u5BFC\u5411\u5173\u7CFB\u56FE\u3002" });
1488
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { fontSize: 12.5, color: "var(--dsh-color-muted, #6b7280)", padding: "8px 0" }, children: tr("\u6682\u65E0\u8282\u70B9/\u5173\u7CFB\u53EF\u7ED8\u5236 \u2014 \u6A21\u578B\u7528 esr_node / esr_link \u767B\u8BB0\u9886\u57DF\u5BF9\u8C61\u5E76\u4E92\u8FDE\u540E\uFF0C\u8FD9\u91CC\u4F1A\u51FA\u73B0\u529B\u5BFC\u5411\u5173\u7CFB\u56FE\u3002") });
1496
1489
  }
1497
1490
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
1498
1491
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "flex", gap: 8, flexWrap: "wrap", alignItems: "center", marginBottom: 6 }, children: [
1499
1492
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { style: { ...s.chip }, children: [
1500
1493
  graph.nodes.length,
1501
- " \u8282\u70B9"
1494
+ " ",
1495
+ tr(" \u8282\u70B9")
1502
1496
  ] }),
1503
1497
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { style: { ...s.chip }, children: [
1504
1498
  graph.keptLinks.length,
1505
- " \u5173\u7CFB"
1499
+ " ",
1500
+ tr(" \u5173\u7CFB")
1506
1501
  ] }),
1507
1502
  graph.dangling > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { style: { ...s.chipWarn }, children: [
1508
1503
  graph.dangling,
1509
- " \u60AC\u7A7A\u94FE\u63A5\uFF08\u7AEF\u70B9\u7F3A\u5931\uFF0C\u672A\u7ED8\u5236\uFF09"
1504
+ " ",
1505
+ tr(" \u60AC\u7A7A\u94FE\u63A5\uFF08\u7AEF\u70B9\u7F3A\u5931\uFF0C\u672A\u7ED8\u5236\uFF09")
1510
1506
  ] }),
1511
1507
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { flex: "1 1 auto" } }),
1512
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: s.hint, children: "\u62D6\u62FD\u8282\u70B9 \xB7 \u6EDA\u8F6E\u7F29\u653E \xB7 \u7A7A\u767D\u5904\u62D6\u62FD\u53EF\u5E73\u79FB" }),
1508
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: s.hint, children: tr("\u62D6\u62FD\u8282\u70B9 \xB7 \u6EDA\u8F6E\u7F29\u653E \xB7 \u7A7A\u767D\u5904\u62D6\u62FD\u53EF\u5E73\u79FB") }),
1513
1509
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", style: s.btn, onClick: () => zoom(1.2), children: "\uFF0B" }),
1514
1510
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", style: s.btn, onClick: () => zoom(1 / 1.2), children: "\uFF0D" }),
1515
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", style: s.btn, onClick: reLayout, children: "\u91CD\u7EC4" })
1511
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", style: s.btn, onClick: reLayout, children: tr("\u91CD\u7EC4") })
1516
1512
  ] }),
1517
1513
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { position: "relative", border: "1px solid var(--dsh-color-border, #e5e7eb)", borderRadius: 12, overflow: "hidden", background: "var(--dsh-color-surface, #fff)" }, children: [
1518
1514
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
@@ -1551,7 +1547,7 @@ function EngramGraph({ workspace, entities, tasks, links, nameOf }) {
1551
1547
  markerEnd: `url(#${uid}-arrow)`
1552
1548
  }
1553
1549
  ),
1554
- (activeEdge || hoverEdge === l.id) && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("text", { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 - 5, fontSize: 9.5, fill: color, textAnchor: "middle", style: { pointerEvents: "none" }, children: REL_LABEL[l.relation] ?? l.relation })
1550
+ (activeEdge || hoverEdge === l.id) && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("text", { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 - 5, fontSize: 9.5, fill: color, textAnchor: "middle", style: { pointerEvents: "none" }, children: relLabel(l.relation) })
1555
1551
  ] }, l.id);
1556
1552
  }),
1557
1553
  graph.nodes.map((node) => {
@@ -1592,23 +1588,22 @@ function EngramGraph({ workspace, entities, tasks, links, nameOf }) {
1592
1588
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
1593
1589
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { ...s.badge, background: selNode.kindType === "task" ? TASK_COLOR : KIND_COLOR[selNode.kind] ?? NODE_DEFAULT }, children: selNode.kindType === "task" ? selNode.state : selNode.kind }),
1594
1590
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontWeight: 700, fontSize: 13, flex: 1, overflowWrap: "anywhere" }, children: selNode.name }),
1595
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", style: s.closeBtn, onClick: () => setSelected(null), "aria-label": "\u5173\u95ED", children: "\u2715" })
1591
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", style: s.closeBtn, onClick: () => setSelected(null), "aria-label": tr("\u5173\u95ED"), children: "\u2715" })
1596
1592
  ] }),
1597
1593
  selNode.description && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { fontSize: 12, color: "var(--dsh-color-muted, #6b7280)", marginTop: 4 }, children: selNode.description }),
1598
1594
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { ...s.mono, marginTop: 4, fontSize: 11 }, children: selNode.id }),
1599
1595
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { fontSize: 11.5, color: "var(--dsh-color-muted-weak, #9ca3af)", marginTop: 2 }, children: [
1600
1596
  selNode.degree,
1601
- " \u6761\u5173\u8054 \xB7 ",
1602
- selEdges.length,
1603
- " \u6761\u5173\u7CFB"
1597
+ " ",
1598
+ tr(" \u6761\u5173\u8054 \xB7 {0} \u6761\u5173\u7CFB", { "0": selEdges.length })
1604
1599
  ] }),
1605
1600
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: 4, marginTop: 8 }, children: [
1606
- selEdges.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { fontSize: 11.5, color: "var(--dsh-color-muted-weak, #9ca3af)" }, children: "\u6682\u65E0\u5173\u7CFB" }),
1601
+ selEdges.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { fontSize: 11.5, color: "var(--dsh-color-muted-weak, #9ca3af)" }, children: tr("\u6682\u65E0\u5173\u7CFB") }),
1607
1602
  selEdges.slice(0, 8).map((l) => {
1608
1603
  const out = l.source === selNode.id;
1609
1604
  const other = out ? l.target : l.source;
1610
1605
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 5, fontSize: 11.5 }, children: [
1611
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { ...s.relChip, color: relColor(l.relation), borderColor: relColor(l.relation) }, children: REL_LABEL[l.relation] ?? l.relation }),
1606
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { ...s.relChip, color: relColor(l.relation), borderColor: relColor(l.relation) }, children: relLabel(l.relation) }),
1612
1607
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { color: "var(--dsh-color-muted, #6b7280)" }, children: out ? "\u2192" : "\u2190" }),
1613
1608
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", maxWidth: 150 }, children: nameOf(other) })
1614
1609
  ] }, l.id);
@@ -1616,21 +1611,24 @@ function EngramGraph({ workspace, entities, tasks, links, nameOf }) {
1616
1611
  selEdges.length > 8 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { fontSize: 11, color: "var(--dsh-color-muted-weak, #9ca3af)" }, children: [
1617
1612
  "+",
1618
1613
  selEdges.length - 8,
1619
- " \u6761\u66F4\u591A\u2026"
1614
+ " ",
1615
+ tr(" \u6761\u66F4\u591A\u2026")
1620
1616
  ] })
1621
1617
  ] })
1622
1618
  ] })
1623
1619
  ] }),
1624
1620
  incidentKinds.size > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "flex", gap: 6, flexWrap: "wrap", marginTop: 8, alignItems: "center" }, children: [
1625
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 11.5, color: "var(--dsh-color-muted-weak, #9ca3af)" }, children: "\u56FE\u4F8B\uFF1A" }),
1626
- [...incidentKinds].sort().map((rel) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { ...s.relChip, color: relColor(rel), borderColor: relColor(rel) }, children: REL_LABEL[rel] ?? rel }, rel)),
1621
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 11.5, color: "var(--dsh-color-muted-weak, #9ca3af)" }, children: tr("\u56FE\u4F8B\uFF1A") }),
1622
+ [...incidentKinds].sort().map((rel) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { ...s.relChip, color: relColor(rel), borderColor: relColor(rel) }, children: relLabel(rel) }, rel)),
1627
1623
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { style: { marginLeft: 10, display: "inline-flex", alignItems: "center", gap: 4, fontSize: 11.5, color: "var(--dsh-color-muted, #6b7280)" }, children: [
1628
1624
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("circle", { r: 5, fill: TASK_COLOR }),
1629
- " \u4EFB\u52A1"
1625
+ " ",
1626
+ tr(" \u4EFB\u52A1")
1630
1627
  ] }),
1631
1628
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { style: { display: "inline-flex", alignItems: "center", gap: 4, fontSize: 11.5, color: "var(--dsh-color-muted, #6b7280)" }, children: [
1632
1629
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("circle", { r: 5, fill: NODE_DEFAULT }),
1633
- " \u5B9E\u4F53"
1630
+ " ",
1631
+ tr(" \u5B9E\u4F53")
1634
1632
  ] })
1635
1633
  ] })
1636
1634
  ] });
@@ -1854,62 +1852,47 @@ function EngramPreview({ api, workspace, defaultWorkspace, workspaces }) {
1854
1852
  };
1855
1853
  const target = ws || workspaces[0] || "";
1856
1854
  if (!target) {
1857
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { ...hb2.root, color: "var(--dsh-color-muted, #6b7280)" }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: "\u8FD8\u6CA1\u6709\u53EF\u7528\u5DE5\u4F5C\u533A \u2014 \u5148\u521B\u5EFA/\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A\uFF0C[ENGRAM] \u6CE8\u5165\u5757\u4F1A\u6309\u5DE5\u4F5C\u533A\u72EC\u7ACB\u6E32\u67D3\u3002" }) });
1855
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { ...hb2.root, color: "var(--dsh-color-muted, #6b7280)" }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: tr("\u8FD8\u6CA1\u6709\u53EF\u7528\u5DE5\u4F5C\u533A \u2014 \u5148\u521B\u5EFA/\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A\uFF0C[ENGRAM] \u6CE8\u5165\u5757\u4F1A\u6309\u5DE5\u4F5C\u533A\u72EC\u7ACB\u6E32\u67D3\u3002") }) });
1858
1856
  }
1859
1857
  const esrLines = data ? data.esr.split("\n") : [];
1860
1858
  const engramLines = data ? data.engram.split("\n") : [];
1861
1859
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: hb2.root, children: [
1862
1860
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: hb2.head, children: [
1863
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: hb2.title, children: "\u6CE8\u5165\u9884\u89C8\uFF08[ENGRAM] \xB7 [ESR]\uFF09" }),
1864
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: hb2.sub, children: "\u6BCF\u4E2A\u4F1A\u8BDD\u5B9E\u9645\u6CE8\u5165\u7684\u63D0\u793A\u5757 \xB7 \u4F1A\u8BDD\u5185\u51BB\u7ED3\u4E00\u6B21\uFF08order 40/41\uFF0C\u524D\u7F00\u7A33\u5B9A\u590D\u7528 KV \u7F13\u5B58\uFF09" })
1861
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: hb2.title, children: tr("\u6CE8\u5165\u9884\u89C8\uFF08[ENGRAM] \xB7 [ESR]\uFF09") }),
1862
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: hb2.sub, children: tr("\u6BCF\u4E2A\u4F1A\u8BDD\u5B9E\u9645\u6CE8\u5165\u7684\u63D0\u793A\u5757 \xB7 \u4F1A\u8BDD\u5185\u51BB\u7ED3\u4E00\u6B21\uFF08order 40/41\uFF0C\u524D\u7F00\u7A33\u5B9A\u590D\u7528 KV \u7F13\u5B58\uFF09") })
1865
1863
  ] }),
1866
1864
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: hb2.meta, children: [
1867
1865
  data && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
1868
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: hb2.chip, children: [
1869
- "\u8BB0\u5FC6 ",
1870
- data.meta.counts.memories
1871
- ] }),
1872
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: hb2.chip, children: [
1873
- "\u4EFB\u52A1 ",
1874
- data.meta.counts.tasks,
1875
- " active"
1876
- ] }),
1877
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: hb2.chip, children: [
1878
- "\u5173\u7CFB ",
1879
- data.meta.counts.links
1880
- ] }),
1881
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: hb2.chip, children: [
1882
- "\u8282\u70B9 ",
1883
- data.meta.counts.nodes
1884
- ] }),
1885
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: hb2.chip, children: [
1886
- "\u5171 ~",
1887
- data.meta.engram.tokens + data.meta.esr.tokens,
1888
- " tokens"
1889
- ] })
1866
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: hb2.chip, children: tr("\u8BB0\u5FC6 {0}", { "0": data.meta.counts.memories }) }),
1867
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: hb2.chip, children: tr("\u4EFB\u52A1 {0} active", { "0": data.meta.counts.tasks }) }),
1868
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: hb2.chip, children: tr("\u5173\u7CFB {0}", { "0": data.meta.counts.links }) }),
1869
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: hb2.chip, children: tr("\u8282\u70B9 {0}", { "0": data.meta.counts.nodes }) }),
1870
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: hb2.chip, children: tr("\u5171 ~{0} tokens", { "0": data.meta.engram.tokens + data.meta.esr.tokens }) })
1890
1871
  ] }),
1891
- !data && !error && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: hb2.chip, children: loading ? "\u8BFB\u53D6\u4E2D\u2026" : "\u2026" }),
1872
+ !data && !error && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: hb2.chip, children: loading ? tr("\u8BFB\u53D6\u4E2D\u2026") : "\u2026" }),
1892
1873
  error && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: hb2.chip, children: error })
1893
1874
  ] }),
1894
1875
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: hb2.panes, children: [
1895
1876
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: hb2.pane, children: [
1896
1877
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: hb2.paneHead, children: [
1897
1878
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { ...hb2.badge, background: dark ? "#3b5bdb" : "#4f46e5" }, children: "ENGRAM" }),
1898
- "\u7D22\u5F15\u5757",
1879
+ tr("\u7D22\u5F15\u5757"),
1899
1880
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: hb2.orderChip, children: "order 40" }),
1900
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { style: hb2.copyBtn, onClick: () => copy("engram"), children: copied === "engram" ? "\u5DF2\u590D\u5236 \u2713" : "\u590D\u5236" })
1881
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { style: hb2.copyBtn, onClick: () => copy("engram"), children: copied === "engram" ? tr("\u5DF2\u590D\u5236 \u2713") : tr("\u590D\u5236") })
1901
1882
  ] }),
1902
- !data && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: hb2.empty, children: loading ? "\u6E32\u67D3\u4E2D\u2026" : "\u2013" }),
1903
- data && data.engram === "" && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: hb2.empty, children: "\u8BE5\u5DE5\u4F5C\u533A\u6CA1\u6709\u53EF\u6CE8\u5165\u7684\u8BB0\u5FC6/\u4EFB\u52A1/\u5173\u7CFB ([ENGRAM] \u5757\u4E3A\u7A7A)\u3002" }),
1883
+ !data && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: hb2.empty, children: loading ? tr("\u6E32\u67D3\u4E2D\u2026") : "\u2013" }),
1884
+ data && data.engram === "" && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: hb2.empty, children: tr("\u8BE5\u5DE5\u4F5C\u533A\u6CA1\u6709\u53EF\u6CE8\u5165\u7684\u8BB0\u5FC6/\u4EFB\u52A1/\u5173\u7CFB ([ENGRAM] \u5757\u4E3A\u7A7A)\u3002") }),
1904
1885
  data && data.engram !== "" && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("pre", { style: hb2.pre, children: engramLines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: lineColor(line, dark), children: line || "\xA0" }, i)) }),
1905
1886
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: hb2.paneCost, children: data && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
1906
1887
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: hb2.chip, children: [
1907
1888
  data.meta.engram.lines,
1908
- " \u884C"
1889
+ " ",
1890
+ tr(" \u884C")
1909
1891
  ] }),
1910
1892
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: hb2.chip, children: [
1911
1893
  data.meta.engram.chars,
1912
- " \u5B57\u7B26"
1894
+ " ",
1895
+ tr(" \u5B57\u7B26")
1913
1896
  ] }),
1914
1897
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: hb2.chip, children: [
1915
1898
  "~",
@@ -1921,21 +1904,23 @@ function EngramPreview({ api, workspace, defaultWorkspace, workspaces }) {
1921
1904
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: hb2.pane, children: [
1922
1905
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: hb2.paneHead, children: [
1923
1906
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { ...hb2.badge, background: dark ? "#6d28d9" : "#7c3aed" }, children: "ESR" }),
1924
- "\u4EFB\u52A1 \xB7 \u95ED\u73AF\u5757",
1907
+ tr("\u4EFB\u52A1 \xB7 \u95ED\u73AF\u5757"),
1925
1908
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: hb2.orderChip, children: "order 41" }),
1926
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { style: hb2.copyBtn, onClick: () => copy("esr"), children: copied === "esr" ? "\u5DF2\u590D\u5236 \u2713" : "\u590D\u5236" })
1909
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { style: hb2.copyBtn, onClick: () => copy("esr"), children: copied === "esr" ? tr("\u5DF2\u590D\u5236 \u2713") : tr("\u590D\u5236") })
1927
1910
  ] }),
1928
- !data && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: hb2.empty, children: loading ? "\u6E32\u67D3\u4E2D\u2026" : "\u2013" }),
1929
- data && data.esr === "" && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: hb2.empty, children: "\u8BE5\u5DE5\u4F5C\u533A\u6CA1\u6709\u4EFB\u52A1 ([ESR] \u5757\u4E3A\u7A7A)\u3002" }),
1911
+ !data && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: hb2.empty, children: loading ? tr("\u6E32\u67D3\u4E2D\u2026") : "\u2013" }),
1912
+ data && data.esr === "" && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: hb2.empty, children: tr("\u8BE5\u5DE5\u4F5C\u533A\u6CA1\u6709\u4EFB\u52A1 ([ESR] \u5757\u4E3A\u7A7A)\u3002") }),
1930
1913
  data && data.esr !== "" && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("pre", { style: hb2.pre, children: esrLines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: lineColor(line, dark), children: line || "\xA0" }, i)) }),
1931
1914
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: hb2.paneCost, children: data && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
1932
1915
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: hb2.chip, children: [
1933
1916
  data.meta.esr.lines,
1934
- " \u884C"
1917
+ " ",
1918
+ tr(" \u884C")
1935
1919
  ] }),
1936
1920
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: hb2.chip, children: [
1937
1921
  data.meta.esr.chars,
1938
- " \u5B57\u7B26"
1922
+ " ",
1923
+ tr(" \u5B57\u7B26")
1939
1924
  ] }),
1940
1925
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: hb2.chip, children: [
1941
1926
  "~",
@@ -1945,7 +1930,7 @@ function EngramPreview({ api, workspace, defaultWorkspace, workspaces }) {
1945
1930
  ] }) })
1946
1931
  ] })
1947
1932
  ] }),
1948
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: hb2.sub, children: "\u8BF4\u660E\uFF1A\u5757\u7531\u4E0E\u7CFB\u7EDF\u63D0\u793A\u76F8\u540C\u7684\u7EAF\u51FD\u6570\u5B9E\u65F6\u6E32\u67D3\uFF08\u6BCF 20s \u5237\u65B0\uFF09\uFF1B\u300Cescalate:\u300D\u884C\u662F\u6700\u8FD1 14 \u5929 mem/esr \u8C03\u7528\u5931\u8861\u65F6\u81EA\u52A8\u9644\u52A0\u7684\u6570\u636E\u9A71\u52A8\u63D0\u9192\uFF0C\u884C\u4E3A\u6539\u5584\u540E\u81EA\u52A8\u6D88\u5931\u3002\u590D\u5236\u6309\u94AE\u53EF\u76F4\u63A5\u628A\u6CE8\u5165\u5757 \u8D34\u8FDB\u63D0\u793A\u8BCD\u5BA1\u8BA1\u3002" })
1933
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: hb2.sub, children: tr("\u8BF4\u660E\uFF1A\u5757\u7531\u4E0E\u7CFB\u7EDF\u63D0\u793A\u76F8\u540C\u7684\u7EAF\u51FD\u6570\u5B9E\u65F6\u6E32\u67D3\uFF08\u6BCF 20s \u5237\u65B0\uFF09\uFF1B\u300Cescalate:\u300D\u884C\u662F\u6700\u8FD1 14 \u5929 mem/esr \u8C03\u7528\u5931\u8861\u65F6\u81EA\u52A8\u9644\u52A0\u7684\u6570\u636E\u9A71\u52A8\u63D0\u9192\uFF0C\u884C\u4E3A\u6539\u5584\u540E\u81EA\u52A8\u6D88\u5931\u3002\u590D\u5236\u6309\u94AE\u53EF\u76F4\u63A5\u628A\u6CE8\u5165\u5757 \u8D34\u8FDB\u63D0\u793A\u8BCD\u5BA1\u8BA1\u3002") })
1949
1934
  ] });
1950
1935
  }
1951
1936
 
@@ -1970,7 +1955,7 @@ function EvidenceRing({ artifact, evaluation, refs, size = 24, showLabel = true,
1970
1955
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1971
1956
  "span",
1972
1957
  {
1973
- title: title ?? (isFraction ? `\u8BC1\u636E\u5B8C\u5907\u5EA6 ${Math.round(fraction * 100)}%` : `\u8BC1\u636E\u95ED\u73AF\uFF1Aartifact${artifact ? "\u2713" : "\u2717"} \xB7 evaluation${evaluation ? "\u2713" : "\u2717"} \xB7 memory_ref${refs ? "\u2713" : "\u2717"} (${filled}/3)`),
1958
+ title: title ?? (isFraction ? tr("\u8BC1\u636E\u5B8C\u5907\u5EA6 {0}%", { "0": Math.round(fraction * 100) }) : tr("\u8BC1\u636E\u95ED\u73AF\uFF1Aartifact{0} \xB7 evaluation{1} \xB7 memory_ref{2} ({3}/3)", { "0": artifact ? "\u2713" : "\u2717", "1": evaluation ? "\u2713" : "\u2717", "2": refs ? "\u2713" : "\u2717", "3": filled })),
1974
1959
  style: { position: "relative", display: "inline-flex", alignItems: "center", justifyContent: "center", flex: "0 0 auto", width: size, height: size, lineHeight: 1 },
1975
1960
  children: [
1976
1961
  isFraction ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, "aria-hidden": "true", children: [
@@ -2086,7 +2071,7 @@ function EngramTelemetry({ api, workspace }) {
2086
2071
  return { rows, max };
2087
2072
  }, [stats]);
2088
2073
  const dose = stats && stats.ratios ? stats.ratios : null;
2089
- const sampleText = stats && stats.ratios && stats.ratios.calls < 10 ? `\u6837\u672C\u4E0D\u8DB3\uFF08${stats.ratios.calls} \u6B21\uFF09\uFF0C\u6BD4\u4F8B\u4EC5\u4F9B\u53C2\u8003` : null;
2074
+ const sampleText = stats && stats.ratios && stats.ratios.calls < 10 ? tr("\u6837\u672C\u4E0D\u8DB3\uFF08{0} \u6B21\uFF09\uFF0C\u6BD4\u4F8B\u4EC5\u4F9B\u53C2\u8003", { "0": stats.ratios.calls }) : null;
2090
2075
  const ledger = stats?.ledger ?? null;
2091
2076
  const ledgerBucket = ledger === null ? null : workspace === "" ? ledger.totals : ledger.byWorkspace?.[workspace] ?? null;
2092
2077
  const ledgerDays = ledger === null || workspace !== "" ? [] : [...ledger.byDay ?? []].slice(0, 14).reverse();
@@ -2128,11 +2113,8 @@ function EngramTelemetry({ api, workspace }) {
2128
2113
  const maxBar = daily.max;
2129
2114
  return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.root, children: [
2130
2115
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.head, children: [
2131
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: hb2.title, children: "agent \u884C\u4E3A\u9065\u6D4B\u4EEA\u8868\u76D8" }),
2132
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { style: hb2.sub, children: [
2133
- "\u57FA\u4E8E /stats \u771F\u5B9E\u8C03\u7528\u7D2F\u8BA1\uFF08\u5DE5\u4F5C\u533A \xD7 \u5929\u6EDA\u52A8\uFF09\xB7 20s \u81EA\u52A8\u5237\u65B0",
2134
- workspace === "" ? " \xB7 \u5168\u90E8\u5DE5\u4F5C\u533A" : ` \xB7 ${workspace}`
2135
- ] }),
2116
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: hb2.title, children: tr("agent \u884C\u4E3A\u9065\u6D4B\u4EEA\u8868\u76D8") }),
2117
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: hb2.sub, children: tr("\u57FA\u4E8E /stats \u771F\u5B9E\u8C03\u7528\u7D2F\u8BA1\uFF08\u5DE5\u4F5C\u533A \xD7 \u5929\u6EDA\u52A8\uFF09\xB7 20s \u81EA\u52A8\u5237\u65B0{0}", { "0": workspace === "" ? tr(" \xB7 \u5168\u90E8\u5DE5\u4F5C\u533A") : ` \xB7 ${workspace}` }) }),
2136
2118
  loading && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: hb2.sub, children: "\u2026" }),
2137
2119
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2138
2120
  "button",
@@ -2140,7 +2122,7 @@ function EngramTelemetry({ api, workspace }) {
2140
2122
  style: { marginLeft: "auto", fontSize: 11.5, fontWeight: 600, padding: "3px 10px", borderRadius: 7, cursor: "pointer", border: "1px solid var(--dsh-color-border, #d1d5db)", background: "transparent", color: "var(--dsh-color-muted-strong, #374151)" },
2141
2123
  onClick: () => void refresh(),
2142
2124
  disabled: loading,
2143
- children: "\u5237\u65B0"
2125
+ children: tr("\u5237\u65B0")
2144
2126
  }
2145
2127
  )
2146
2128
  ] }),
@@ -2149,108 +2131,88 @@ function EngramTelemetry({ api, workspace }) {
2149
2131
  error
2150
2132
  ] }),
2151
2133
  sampleText && stats && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.warn, children: sampleText }),
2152
- !stats && !error && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { ...hb2.sub, padding: 8 }, children: "\u52A0\u8F7D\u4E2D\u2026" }),
2134
+ !stats && !error && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { ...hb2.sub, padding: 8 }, children: tr("\u52A0\u8F7D\u4E2D\u2026") }),
2153
2135
  stats && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
2154
2136
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.grid, children: [
2155
2137
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.gaugeCard, children: [
2156
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(EvidenceRing, { artifact: false, evaluation: false, refs: false, size: 64, fraction: dose?.esrRatio ?? 0, labelText: pct(dose?.esrRatio), title: `ESR \u4E3B\u52A8\u6027\uFF08\u76EE\u6807 \u2265 34%\uFF09` }),
2138
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(EvidenceRing, { artifact: false, evaluation: false, refs: false, size: 64, fraction: dose?.esrRatio ?? 0, labelText: pct(dose?.esrRatio), title: tr(`ESR \u4E3B\u52A8\u6027\uFF08\u76EE\u6807 \u2265 34%\uFF09`) }),
2157
2139
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { children: [
2158
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.gaugeLabel, children: "ESR \u4E3B\u52A8\u6027" }),
2140
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.gaugeLabel, children: tr("ESR \u4E3B\u52A8\u6027") }),
2159
2141
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.gaugeSub, children: [
2160
2142
  "esr ",
2161
2143
  dose?.esrCalls,
2162
2144
  " / mem ",
2163
2145
  dose?.memCalls,
2164
- " \xB7 \u5171 ",
2165
- dose?.calls
2146
+ " ",
2147
+ tr(" \xB7 \u5171 {0}", { "0": dose?.calls })
2166
2148
  ] }),
2167
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { fontSize: 10, color: (dose?.esrRatio ?? 0) >= 0.34 ? "#059669" : "#d97706", fontWeight: 700 }, children: (dose?.esrRatio ?? 0) >= 0.34 ? "\u5065\u5EB7" : "\u504F\u4F4E \u2192 \u4E0B\u4F1A\u8BDD\u6CE8\u5165 escalate \u63D0\u9192" })
2149
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { fontSize: 10, color: (dose?.esrRatio ?? 0) >= 0.34 ? "#059669" : "#d97706", fontWeight: 700 }, children: (dose?.esrRatio ?? 0) >= 0.34 ? tr("\u5065\u5EB7") : tr("\u504F\u4F4E \u2192 \u4E0B\u4F1A\u8BDD\u6CE8\u5165 escalate \u63D0\u9192") })
2168
2150
  ] })
2169
2151
  ] }),
2170
2152
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.gaugeCard, children: [
2171
2153
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(EvidenceRing, { artifact: false, evaluation: false, refs: false, size: 64, fraction: dose?.recallHitRate ?? 0, labelText: pct(dose?.recallHitRate) }),
2172
2154
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { children: [
2173
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.gaugeLabel, children: "\u53EC\u56DE\u547D\u4E2D\u7387" }),
2174
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.gaugeSub, children: "\u6709\u547D\u4E2D\u7684 engram_recall \u5360\u6BD4" })
2155
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.gaugeLabel, children: tr("\u53EC\u56DE\u547D\u4E2D\u7387") }),
2156
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.gaugeSub, children: tr("\u6709\u547D\u4E2D\u7684 engram_recall \u5360\u6BD4") })
2175
2157
  ] })
2176
2158
  ] }),
2177
2159
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.gaugeCard, children: [
2178
2160
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(EvidenceRing, { artifact: false, evaluation: false, refs: false, size: 64, fraction: dose?.detailFollowRate ?? 0, labelText: pct(dose?.detailFollowRate) }),
2179
2161
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { children: [
2180
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.gaugeLabel, children: "detail \u8F6C\u5316" }),
2181
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.gaugeSub, children: "\u547D\u4E2D\u53EC\u56DE\u540E 8 \u4E8B\u4EF6\u5185\u8DDF engram_detail" })
2162
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.gaugeLabel, children: tr("detail \u8F6C\u5316") }),
2163
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.gaugeSub, children: tr("\u547D\u4E2D\u53EC\u56DE\u540E 8 \u4E8B\u4EF6\u5185\u8DDF engram_detail") })
2182
2164
  ] })
2183
2165
  ] })
2184
2166
  ] }),
2185
2167
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.grid, children: [
2186
2168
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.statCard, children: [
2187
2169
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statNum, children: dose?.calls ?? 0 }),
2188
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statLabel, children: "\u7D2F\u8BA1\u5DE5\u5177\u8C03\u7528" })
2170
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statLabel, children: tr("\u7D2F\u8BA1\u5DE5\u5177\u8C03\u7528") })
2189
2171
  ] }),
2190
2172
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.statCard, children: [
2191
2173
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statNum, children: dose?.esrCalls ?? 0 }),
2192
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statLabel, children: "esr_* \u8C03\u7528" })
2174
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statLabel, children: tr("esr_* \u8C03\u7528") })
2193
2175
  ] }),
2194
2176
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.statCard, children: [
2195
2177
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statNum, children: dose?.memCalls ?? 0 }),
2196
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statLabel, children: "\u8BB0\u5FC6\u7C7B\u8C03\u7528" })
2178
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statLabel, children: tr("\u8BB0\u5FC6\u7C7B\u8C03\u7528") })
2197
2179
  ] }),
2198
2180
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.statCard, children: [
2199
2181
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statNum, children: dose?.recallHitsPerQuery ?? "\u2013" }),
2200
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statLabel, children: "\u5E73\u5747\u547D\u4E2D/\u67E5\u8BE2" })
2182
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statLabel, children: tr("\u5E73\u5747\u547D\u4E2D/\u67E5\u8BE2") })
2201
2183
  ] }),
2202
2184
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.statCard, children: [
2203
2185
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statNum, children: stats.totals.failures ?? 0 }),
2204
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statLabel, children: "\u5931\u8D25\u6B21\u6570" })
2186
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statLabel, children: tr("\u5931\u8D25\u6B21\u6570") })
2205
2187
  ] })
2206
2188
  ] }),
2207
2189
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.panel, children: [
2208
2190
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { ...hb2.panelTitle, display: "flex", alignItems: "baseline", gap: 8, flexWrap: "wrap" }, children: [
2209
- "Context Ledger \xB7 \u4E0A\u4E0B\u6587\u51C0\u6536\u76CA",
2210
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: hb2.sub, children: workspace === "" ? "\u5168\u90E8\u5DE5\u4F5C\u533A" : workspace })
2191
+ tr("Context Ledger \xB7 \u4E0A\u4E0B\u6587\u51C0\u6536\u76CA"),
2192
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: hb2.sub, children: workspace === "" ? tr("\u5168\u90E8\u5DE5\u4F5C\u533A") : workspace })
2211
2193
  ] }),
2212
- !ledger ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.sub, children: "\u8D26\u672C\u672A\u542F\u7528\uFF08`ledgerEnabled:false`\uFF09\u6216\u5BBF\u4E3B API \u672A\u5C31\u7EEA\u3002" }) : !ledgerBucket ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.sub, children: "\u8BE5\u5DE5\u4F5C\u533A\u8FD8\u6CA1\u6709\u8D26\u672C\u8BB0\u5F55\u3002" }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
2194
+ !ledger ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.sub, children: tr("\u8D26\u672C\u672A\u542F\u7528\uFF08`ledgerEnabled:false`\uFF09\u6216\u5BBF\u4E3B API \u672A\u5C31\u7EEA\u3002") }) : !ledgerBucket ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.sub, children: tr("\u8BE5\u5DE5\u4F5C\u533A\u8FD8\u6CA1\u6709\u8D26\u672C\u8BB0\u5F55\u3002") }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
2213
2195
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", alignItems: "baseline", gap: 10, flexWrap: "wrap" }, children: [
2214
2196
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { ...hb2.statNum, fontSize: 24, color: ledgerBucket.netTokens >= 0 ? "#059669" : "#dc2626" }, children: tokenCount(ledgerBucket.netTokens) }),
2215
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: hb2.statLabel, children: "\u51C0 token\uFF08\u8282\u7701 \u2212 \u6CE8\u5165 \u2212 \u91CD\u5199\u7F5A\u91D1\uFF09" }),
2216
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { style: hb2.gaugeSub, children: [
2217
- "\u8BF7\u6C42 ",
2218
- ledgerBucket.requests,
2219
- " \xB7 \u4F1A\u8BDD ",
2220
- ledgerBucket.sessions,
2221
- " \xB7 open ",
2222
- ledger.openSessions,
2223
- stats.jit ? ` \xB7 JIT \u63A8\u9001 ${stats.jit.pushes}` : ""
2224
- ] })
2197
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: hb2.statLabel, children: tr("\u51C0 token\uFF08\u8282\u7701 \u2212 \u6CE8\u5165 \u2212 \u91CD\u5199\u7F5A\u91D1\uFF09") }),
2198
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: hb2.gaugeSub, children: tr("\u8BF7\u6C42 {0} \xB7 \u4F1A\u8BDD {1} \xB7 open {2}{3}", { "0": ledgerBucket.requests, "1": ledgerBucket.sessions, "2": ledger.openSessions, "3": stats.jit ? tr(" \xB7 JIT \u63A8\u9001 {0}", { "0": stats.jit.pushes }) : "" }) })
2225
2199
  ] }),
2226
2200
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { ...hb2.grid, marginTop: 8 }, children: [
2227
2201
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.statCard, children: [
2228
2202
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { ...hb2.statNum, color: "#059669" }, children: tokenCount(ledgerBucket.avoidedTokens) }),
2229
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statLabel, children: "\u8282\u7701 \xB7 \u526A\u679D/\u538B\u7F29\uFF08\u5DF2\u5165\u8D26\uFF09" })
2203
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statLabel, children: tr("\u8282\u7701 \xB7 \u526A\u679D/\u538B\u7F29\uFF08\u5DF2\u5165\u8D26\uFF09") })
2230
2204
  ] }),
2231
2205
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.statCard, children: [
2232
2206
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { ...hb2.statNum, color: "#d97706" }, children: tokenCount(-ledgerBucket.injectedTokens) }),
2233
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statLabel, children: "\u6CE8\u5165\u6210\u672C \xB7 \u7D22\u5F15/\u53EC\u56DE/ESR\uFF08\u6BCF\u8BF7\u6C42\u91CD\u8BA1\uFF09" })
2207
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statLabel, children: tr("\u6CE8\u5165\u6210\u672C \xB7 \u7D22\u5F15/\u53EC\u56DE/ESR\uFF08\u6BCF\u8BF7\u6C42\u91CD\u8BA1\uFF09") })
2234
2208
  ] }),
2235
2209
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.statCard, children: [
2236
2210
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { ...hb2.statNum, color: "#dc2626" }, children: tokenCount(-Math.round(ledgerBucket.rewritesCostChars / ledger.charsPerToken)) }),
2237
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.statLabel, children: [
2238
- "\u91CD\u5199\u7F5A\u91D1 \xB7 ",
2239
- ledgerBucket.rewriteCount,
2240
- " \u6B21"
2241
- ] })
2211
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.statLabel, children: tr("\u91CD\u5199\u7F5A\u91D1 \xB7 {0} \u6B21", { "0": ledgerBucket.rewriteCount }) })
2242
2212
  ] })
2243
2213
  ] }),
2244
- ledgerBucket.avoidedTokens === 0 && (ledgerBucket.injectedTokens > 0 || ledgerBucket.rewriteCount > 0) && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { ...hb2.sub, marginTop: 6 }, children: "\u8282\u7701\u4ECD\u4E3A 0\uFF1A\u672C\u5DE5\u4F5C\u533A\u8FD8\u6CA1\u6709\u526A\u679D/\u538B\u7F29\u8282\u7701\u5165\u8D26\u2014\u2014L1 \u8FB9\u754C\u526A\u679D\u9700\u8981 host \u5E73\u9762\u7684 toolResultPruner\uFF08DSH \u2265 0.2.0 \u7531 bundle patch \u91CD\u65B0\u542F\u7528\u8BE5\u884C\uFF09\uFF0C\u538B\u7F29\u8282\u7701\u7531 Context GC \u5F15\u64CE\u5728 checkpoint \u65F6\u4E0A\u62A5\uFF1B\u51C0\u503C\u4E3A\u8D1F = \u6CE8\u5165\u6210\u672C + \u91CD\u5199\u7F5A\u91D1\u7684\u5408\u8BA1\u3002" }),
2245
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { ...hb2.sub, marginTop: 6 }, children: [
2246
- "\u53E3\u5F84\uFF1Achars/",
2247
- ledger.charsPerToken,
2248
- " \u4F30\u7B97 \xB7 \u7F13\u5B58\u6298\u4EF7 ",
2249
- Math.round(ledger.cacheDiscount * 100),
2250
- "% \uFF08\u91CD\u5199\u6309 ",
2251
- Math.round((1 - ledger.cacheDiscount) * 100),
2252
- "% \u8BA1\uFF09\xB7 \u672A\u8BA1\u6A21\u578B\u8D28\u91CF\u5DEE"
2253
- ] }),
2214
+ ledgerBucket.avoidedTokens === 0 && (ledgerBucket.injectedTokens > 0 || ledgerBucket.rewriteCount > 0) && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { ...hb2.sub, marginTop: 6 }, children: tr("\u8282\u7701\u4ECD\u4E3A 0\uFF1A\u672C\u5DE5\u4F5C\u533A\u8FD8\u6CA1\u6709\u526A\u679D/\u538B\u7F29\u8282\u7701\u5165\u8D26\u2014\u2014L1 \u8FB9\u754C\u526A\u679D\u9700\u8981 host \u5E73\u9762\u7684 toolResultPruner\uFF08DSH \u2265 0.2.0 \u7531 bundle patch \u91CD\u65B0\u542F\u7528\u8BE5\u884C\uFF09\uFF0C\u538B\u7F29\u8282\u7701\u7531 Context GC \u5F15\u64CE\u5728 checkpoint \u65F6\u4E0A\u62A5\uFF1B\u51C0\u503C\u4E3A\u8D1F = \u6CE8\u5165\u6210\u672C + \u91CD\u5199\u7F5A\u91D1\u7684\u5408\u8BA1\u3002") }),
2215
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { ...hb2.sub, marginTop: 6 }, children: tr("\u53E3\u5F84\uFF1Achars/{0} \u4F30\u7B97 \xB7 \u7F13\u5B58\u6298\u4EF7 {1}% \uFF08\u91CD\u5199\u6309 {2}% \u8BA1\uFF09\xB7 \u672A\u8BA1\u6A21\u578B\u8D28\u91CF\u5DEE", { "0": ledger.charsPerToken, "1": Math.round(ledger.cacheDiscount * 100), "2": Math.round((1 - ledger.cacheDiscount) * 100) }) }),
2254
2216
  ledgerDays.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("svg", { width: 460, height: 96, viewBox: "0 0 460 96", style: { display: "block", maxWidth: "100%", marginTop: 8 }, children: [
2255
2217
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("line", { x1: 0, y1: 48, x2: 460, y2: 48, stroke: dark ? "rgba(148,163,184,.35)" : "rgba(107,114,128,.35)", strokeDasharray: "3 3" }),
2256
2218
  ledgerDays.map((d, i) => {
@@ -2259,17 +2221,17 @@ function EngramTelemetry({ api, workspace }) {
2259
2221
  const h = Math.abs(d.netTokens) / ledgerMax * 38;
2260
2222
  const positive = d.netTokens >= 0;
2261
2223
  return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("g", { children: [
2262
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("rect", { x, y: positive ? 48 - h : 48, width: w, height: Math.max(1, h), rx: 2, fill: positive ? "#059669" : "#dc2626", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("title", { children: `${d.day} \xB7 net ${d.netTokens} tok \xB7 \u8BF7\u6C42 ${d.requests}` }) }),
2224
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("rect", { x, y: positive ? 48 - h : 48, width: w, height: Math.max(1, h), rx: 2, fill: positive ? "#059669" : "#dc2626", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("title", { children: tr("{0} \xB7 net {1} tok \xB7 \u8BF7\u6C42 {2}", { "0": d.day, "1": d.netTokens, "2": d.requests }) }) }),
2263
2225
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("text", { x: x + w / 2, y: 92, fontSize: 8, fill: dark ? "#8b93a7" : "#6b7280", textAnchor: "middle", children: (d.day ?? "").slice(5).replace("-", "/") })
2264
2226
  ] }, d.day);
2265
2227
  })
2266
2228
  ] }),
2267
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { ...hb2.sub, marginTop: 4 }, children: "\u7EFF = \u5F53\u65E5\u51C0\u7701 \xB7 \u7EA2 = \u5F53\u65E5\u51C0\u4E8F\uFF08\u6309\u5929\u6EDA\u52A8\uFF0C\u6700\u8FD1 14 \u5929\uFF09" })
2229
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { ...hb2.sub, marginTop: 4 }, children: tr("\u7EFF = \u5F53\u65E5\u51C0\u7701 \xB7 \u7EA2 = \u5F53\u65E5\u51C0\u4E8F\uFF08\u6309\u5929\u6EDA\u52A8\uFF0C\u6700\u8FD1 14 \u5929\uFF09") })
2268
2230
  ] })
2269
2231
  ] }),
2270
2232
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.panel, children: [
2271
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.panelTitle, children: "\u8FD1 14 \u5929\u6BCF\u65E5\u6D3B\u52A8 \xB7 mem vs esr" }),
2272
- daily.rows.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.sub, children: "\u8FD8\u6CA1\u6709\u6309\u5929\u6570\u636E\uFF08\u5DE5\u5177\u8C03\u7528\u4F1A\u5B9E\u65F6\u7D2F\u8BA1\uFF09\u3002" }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("svg", { width: BW, height: BH, viewBox: `0 0 ${BW} ${BH}`, style: { display: "block", maxWidth: "100%" }, children: daily.rows.map((d, i) => {
2233
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.panelTitle, children: tr("\u8FD1 14 \u5929\u6BCF\u65E5\u6D3B\u52A8 \xB7 mem vs esr") }),
2234
+ daily.rows.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.sub, children: tr("\u8FD8\u6CA1\u6709\u6309\u5929\u6570\u636E\uFF08\u5DE5\u5177\u8C03\u7528\u4F1A\u5B9E\u65F6\u7D2F\u8BA1\uFF09\u3002") }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("svg", { width: BW, height: BH, viewBox: `0 0 ${BW} ${BH}`, style: { display: "block", maxWidth: "100%" }, children: daily.rows.map((d, i) => {
2273
2235
  const mem = MEM_TOOLS2.reduce((a, k) => a + (d.counts?.[k] ?? 0), 0);
2274
2236
  const esr = ESR_TOOLS2.reduce((a, k) => a + (d.counts?.[k] ?? 0), 0);
2275
2237
  const total = mem + esr;
@@ -2288,7 +2250,8 @@ function EngramTelemetry({ api, workspace }) {
2288
2250
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", gap: 14, marginTop: 6 }, children: [
2289
2251
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { style: hb2.legend, children: [
2290
2252
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("i", { style: { width: 9, height: 9, borderRadius: 2, background: COLOR_MEM, display: "inline-block" } }),
2291
- " \u8BB0\u5FC6\u7C7B (engram_*/loom_*)"
2253
+ " ",
2254
+ tr(" \u8BB0\u5FC6\u7C7B (engram_*/loom_*)")
2292
2255
  ] }),
2293
2256
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { style: hb2.legend, children: [
2294
2257
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("i", { style: { width: 9, height: 9, borderRadius: 2, background: COLOR_ESR, display: "inline-block" } }),
@@ -2297,8 +2260,8 @@ function EngramTelemetry({ api, workspace }) {
2297
2260
  ] })
2298
2261
  ] }),
2299
2262
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: hb2.panel, children: [
2300
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.panelTitle, children: "\u5DE5\u5177\u8C03\u7528\u5206\u5E03\uFF08Top 8\uFF09" }),
2301
- toolRows.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.sub, children: "\u8FD8\u6CA1\u6709\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55\u3002" }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: 5 }, children: toolRows.map((r) => {
2263
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.panelTitle, children: tr("\u5DE5\u5177\u8C03\u7528\u5206\u5E03\uFF08Top 8\uFF09") }),
2264
+ toolRows.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: hb2.sub, children: tr("\u8FD8\u6CA1\u6709\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55\u3002") }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: 5 }, children: toolRows.map((r) => {
2302
2265
  const max = toolRows[0].count;
2303
2266
  const w = Math.max(4, Math.round(r.count / max * 320));
2304
2267
  const c = r.esc === "esr" ? COLOR_ESR : r.esc === "mem" ? COLOR_MEM : COLOR_MUTED;
@@ -2319,80 +2282,80 @@ function EngramTelemetry({ api, workspace }) {
2319
2282
  // client/src/EngramConfigCard.tsx
2320
2283
  var import_react6 = require("react");
2321
2284
  var import_jsx_runtime6 = require("react/jsx-runtime");
2322
- var COMMON_FIELDS = [
2323
- { key: "autoCapture", label: "\u81EA\u52A8\u6355\u83B7", hint: "\u96F6 LLM \u4ECE\u5DE5\u5177\u7ED3\u679C\u63D0\u53D6\u8BB0\u5FC6\uFF08git/\u5173\u952E\u6587\u4EF6/\u9519\u8BEF\uFF09", kind: "bool" },
2324
- { key: "autoCapturePreferences", label: "\u504F\u597D\u6355\u83B7", hint: "\u7528\u6237\u7EA0\u6B63/\u504F\u597D\u5B66\u4E60\uFF1A\u68C0\u6D4B\u6D88\u606F\u91CC\u7684\u300C\u4E0D\u8981\u7528X/\u6539\u7528Y/prefer/never use\u300D\u53E5\u5F0F\uFF0C\u81EA\u52A8\u6C89\u6DC0\u4E3A preference \u8BB0\u5FC6\u5E76\u7F6E\u9876 [ENGRAM]\uFF08correx/PAHF \u5F0F\uFF0C\u96F6 LLM\uFF09", kind: "bool" },
2325
- { key: "boundaryPrune", label: "\u8FB9\u754C\u526A\u679D", hint: "ResultPack L1\uFF1Atodo \u5B8C\u6210/goal \u7EC8\u6001\u8FB9\u754C\u4E3B\u52A8\u526A\u6389\u8D85\u9608\u503C\u65E7\u5DE5\u5177\u7ED3\u679C\uFF08DSH \u786E\u5B9A\u6027 surface-replace\u3001\u507F\u8FD8\u95E8\u3001\u96F6 LLM\uFF1B\u9ED8\u8BA4\u5F00\uFF0C\u5173=opt-out\uFF09", kind: "bool" },
2326
- { key: "boundaryPruneAdaptive", label: "\u526A\u679D\u81EA\u9002\u5E94", hint: "\u8D26\u672C\u5426\u51B3\uFF1A\u8BE5 workspace \u771F\u5B9E\u526A\u679D\u540E\u51C0\u6536\u76CA\u4E3A\u8D1F\uFF08\u22653 \u6B21\uFF09\u65F6\u81EA\u52A8\u505C\u6B62\u7EE7\u7EED\u526A\uFF1B\u8BC1\u636E\u53EA\u80FD\u5173\u3001\u4E0D\u4F1A\u81EA\u884C\u5F00", kind: "bool" },
2327
- { key: "boundaryPruneThresholdChars", label: "\u526A\u679D\u9608\u503C(\u5B57\u7B26)", hint: "\u8986\u76D6\u5BBF\u4E3B 8192\uFF1A\u8BBE 2048 \u53EF\u66F4\u65E9\u5F00\u526A\uFF0C\u5E76\u914D L2 \u5F52\u6863\u627E\u56DE\u88AB\u526A\u4E2D\u6BB5\uFF1B\u7559\u7A7A=\u5BBF\u4E3B\u9ED8\u8BA4\u3002\u5EFA\u8BAE\u540C\u65F6\u628A\u4FDD\u7559\u8FB9\u7F18\u8C03\u5C0F\uFF08\u5982 1024/256\uFF09\u4EE5\u83B7\u5F97\u6700\u5927\u8282\u7701", kind: "num", min: 256, max: 16384, step: 256 },
2328
- { key: "resultPack", label: "\u7ED3\u679C\u5F52\u6863\u53EC\u56DE", hint: "ResultPack L2\uFF1A\u526A\u6389\u7684\u4E2D\u6BB5\u8131\u654F\u5F52\u6863\uFF0C\u8282\u70B9\u5C3E\u90E8\u9644 handle\uFF0C\u6A21\u578B\u53EF\u7528 result_recall(callId) \u6309\u9875\u53EC\u56DE\uFF08\u5B8C\u6574 ObservationPack\uFF1B\u9ED8\u8BA4\u5F00\uFF0C\u4FDD\u8BC1\u9ED8\u8BA4\u526A\u679D\u65E0\u635F\uFF1B\u9700\u4E0E\u8FB9\u754C\u526A\u679D\u4E00\u8D77\u5F00\uFF09", kind: "bool" },
2329
- { key: "autoRecallOnStart", label: "\u4F1A\u8BDD\u542F\u52A8\u81EA\u52A8\u53EC\u56DE", hint: "\u65B0\u4F1A\u8BDD\u6309\u9996\u6761\u6D88\u606F\u81EA\u52A8\u628A\u6700\u76F8\u5173\u8BB0\u5FC6\u6CE8\u5165 [RECALL] \u5757\uFF08\u65E0\u9700\u6A21\u578B\u60F3\u8D77\u8C03 engram_recall\uFF09\uFF1B\u5173\u6389=\u56DE\u5230\u7EAF\u62C9\u53D6", kind: "bool" },
2330
- { key: "jitEnabled", label: "JIT \u63A8\u9001", hint: "\u9519\u8BEF\u590D\u53D1 / \u6587\u4EF6\u7126\u70B9 / goal \u5B8C\u6210\u65F6\uFF0C\u628A\u5DF2\u6709\u8BB0\u5FC6\u538B\u6210\u4E00\u884C\u63A8\u8FDB\u4E0A\u4E0B\u6587\uFF08append-only\u3001\u6BCF\u4F1A\u8BDD\u22643 \u884C\u3001\u65E0\u547D\u4E2D\u6C89\u9ED8\uFF1B\u6BCF\u6B21\u63A8\u9001\u6309\u524D\u7F00\u91CD\u5199\u8BA1\u5165\u8D26\u672C\uFF09", kind: "bool" },
2331
- { key: "episodeEnabled", label: "\u4F1A\u8BDD\u7EAA\u8981", hint: "\u4F1A\u8BDD\u7ED3\u675F\u65F6\u7528\u96F6 LLM \u89C4\u5219\u751F\u6210\u4E00\u6761 episode\uFF08\u6587\u4EF6/\u547D\u4EE4/\u5931\u8D25\u2192\u4FEE\u590D/\u51B3\u7B56/\u672A\u95ED\u73AF\uFF09\uFF0C\u4E0D\u8FDB\u7D22\u5F15\uFF0C\u4F9B\u6062\u590D\u7B80\u62A5\u4F7F\u7528\uFF1B\u6BCF workspace \u4FDD\u7559\u6700\u8FD1 20 \u6761", kind: "bool" },
2332
- { key: "resumeBriefEnabled", label: "\u6062\u590D\u7B80\u62A5", hint: "\u65B0\u4F1A\u8BDD\u542F\u52A8\u65F6\u6CE8\u5165\u6700\u8FD1 7 \u5929\u7684\u6700\u65B0 episode\uFF08\u2264240 \u5B57\u7B26 + engram_detail \u6307\u9488\uFF09\uFF0C\u9694\u5929\u7EE7\u7EED\u4E0D\u7528\u91CD\u65B0\u4EA4\u4EE3\u80CC\u666F", kind: "bool" },
2333
- { key: "entityCardsEnabled", label: "\u5B9E\u4F53\u5361", hint: "[ENGRAM] \u7D22\u5F15\u4E3A\u6D3B\u8DC3\u5B9E\u4F53\uFF08\u6709\u951A\u5B9A\u8BB0\u5FC6\u6216\u672A\u95ED\u73AF\u4EFB\u52A1\uFF09\u6E32\u67D3\u4E00\u884C\u300C\u5F53\u524D\u771F\u76F8 + \u6253\u5F00\u4EFB\u52A1 + engram_detail(entity=\u2026) \u6307\u9488\u300D\uFF0C\u6700\u591A 2 \u5F20\uFF0C\u66FF\u4EE3\u8FD9\u4E9B\u5B9E\u4F53\u7684\u5E73\u94FA\u8BB0\u5FC6\u884C", kind: "bool" },
2334
- { key: "maxRecallPerSession", label: "\u6BCF\u4F1A\u8BDD\u53BB\u91CD\u4E0A\u9650", hint: "recall \u6BCF\u4F1A\u8BDD\u6700\u591A\u4FDD\u7559 N \u6761\uFF08\u8DE8\u4F1A\u8BDD\u53BB\u91CD\uFF09", kind: "num", min: 1, max: 10 },
2335
- { key: "expireDays", label: "TTL\uFF08\u5929\uFF09", hint: "0 = \u4E0D\u8FC7\u671F", kind: "num", min: 0, max: 3650 },
2336
- { key: "indexMaxChars", label: "\u7D22\u5F15\u5B57\u7B26\u4E0A\u9650", hint: "[ENGRAM] \u5757 token \u9884\u7B97", kind: "num", min: 0, max: 4e3 }
2285
+ var commonFields = () => [
2286
+ { key: "autoCapture", label: tr("\u81EA\u52A8\u6355\u83B7"), hint: tr("\u96F6 LLM \u4ECE\u5DE5\u5177\u7ED3\u679C\u63D0\u53D6\u8BB0\u5FC6\uFF08git/\u5173\u952E\u6587\u4EF6/\u9519\u8BEF\uFF09"), kind: "bool" },
2287
+ { key: "autoCapturePreferences", label: tr("\u504F\u597D\u6355\u83B7"), hint: tr("\u7528\u6237\u7EA0\u6B63/\u504F\u597D\u5B66\u4E60\uFF1A\u68C0\u6D4B\u6D88\u606F\u91CC\u7684\u300C\u4E0D\u8981\u7528X/\u6539\u7528Y/prefer/never use\u300D\u53E5\u5F0F\uFF0C\u81EA\u52A8\u6C89\u6DC0\u4E3A preference \u8BB0\u5FC6\u5E76\u7F6E\u9876 [ENGRAM]\uFF08correx/PAHF \u5F0F\uFF0C\u96F6 LLM\uFF09"), kind: "bool" },
2288
+ { key: "boundaryPrune", label: tr("\u8FB9\u754C\u526A\u679D"), hint: tr("ResultPack L1\uFF1Atodo \u5B8C\u6210/goal \u7EC8\u6001\u8FB9\u754C\u4E3B\u52A8\u526A\u6389\u8D85\u9608\u503C\u65E7\u5DE5\u5177\u7ED3\u679C\uFF08DSH \u786E\u5B9A\u6027 surface-replace\u3001\u507F\u8FD8\u95E8\u3001\u96F6 LLM\uFF1B\u9ED8\u8BA4\u5F00\uFF0C\u5173=opt-out\uFF09"), kind: "bool" },
2289
+ { key: "boundaryPruneAdaptive", label: tr("\u526A\u679D\u81EA\u9002\u5E94"), hint: tr("\u8D26\u672C\u5426\u51B3\uFF1A\u8BE5 workspace \u771F\u5B9E\u526A\u679D\u540E\u51C0\u6536\u76CA\u4E3A\u8D1F\uFF08\u22653 \u6B21\uFF09\u65F6\u81EA\u52A8\u505C\u6B62\u7EE7\u7EED\u526A\uFF1B\u8BC1\u636E\u53EA\u80FD\u5173\u3001\u4E0D\u4F1A\u81EA\u884C\u5F00"), kind: "bool" },
2290
+ { key: "boundaryPruneThresholdChars", label: tr("\u526A\u679D\u9608\u503C(\u5B57\u7B26)"), hint: tr("\u8986\u76D6\u5BBF\u4E3B 8192\uFF1A\u8BBE 2048 \u53EF\u66F4\u65E9\u5F00\u526A\uFF0C\u5E76\u914D L2 \u5F52\u6863\u627E\u56DE\u88AB\u526A\u4E2D\u6BB5\uFF1B\u7559\u7A7A=\u5BBF\u4E3B\u9ED8\u8BA4\u3002\u5EFA\u8BAE\u540C\u65F6\u628A\u4FDD\u7559\u8FB9\u7F18\u8C03\u5C0F\uFF08\u5982 1024/256\uFF09\u4EE5\u83B7\u5F97\u6700\u5927\u8282\u7701"), kind: "num", min: 256, max: 16384, step: 256 },
2291
+ { key: "resultPack", label: tr("\u7ED3\u679C\u5F52\u6863\u53EC\u56DE"), hint: tr("ResultPack L2\uFF1A\u526A\u6389\u7684\u4E2D\u6BB5\u8131\u654F\u5F52\u6863\uFF0C\u8282\u70B9\u5C3E\u90E8\u9644 handle\uFF0C\u6A21\u578B\u53EF\u7528 result_recall(callId) \u6309\u9875\u53EC\u56DE\uFF08\u5B8C\u6574 ObservationPack\uFF1B\u9ED8\u8BA4\u5F00\uFF0C\u4FDD\u8BC1\u9ED8\u8BA4\u526A\u679D\u65E0\u635F\uFF1B\u9700\u4E0E\u8FB9\u754C\u526A\u679D\u4E00\u8D77\u5F00\uFF09"), kind: "bool" },
2292
+ { key: "autoRecallOnStart", label: tr("\u4F1A\u8BDD\u542F\u52A8\u81EA\u52A8\u53EC\u56DE"), hint: tr("\u65B0\u4F1A\u8BDD\u6309\u9996\u6761\u6D88\u606F\u81EA\u52A8\u628A\u6700\u76F8\u5173\u8BB0\u5FC6\u6CE8\u5165 [RECALL] \u5757\uFF08\u65E0\u9700\u6A21\u578B\u60F3\u8D77\u8C03 engram_recall\uFF09\uFF1B\u5173\u6389=\u56DE\u5230\u7EAF\u62C9\u53D6"), kind: "bool" },
2293
+ { key: "jitEnabled", label: tr("JIT \u63A8\u9001"), hint: tr("\u9519\u8BEF\u590D\u53D1 / \u6587\u4EF6\u7126\u70B9 / goal \u5B8C\u6210\u65F6\uFF0C\u628A\u5DF2\u6709\u8BB0\u5FC6\u538B\u6210\u4E00\u884C\u63A8\u8FDB\u4E0A\u4E0B\u6587\uFF08append-only\u3001\u6BCF\u4F1A\u8BDD\u22643 \u884C\u3001\u65E0\u547D\u4E2D\u6C89\u9ED8\uFF1B\u6BCF\u6B21\u63A8\u9001\u6309\u524D\u7F00\u91CD\u5199\u8BA1\u5165\u8D26\u672C\uFF09"), kind: "bool" },
2294
+ { key: "episodeEnabled", label: tr("\u4F1A\u8BDD\u7EAA\u8981"), hint: tr("\u4F1A\u8BDD\u7ED3\u675F\u65F6\u7528\u96F6 LLM \u89C4\u5219\u751F\u6210\u4E00\u6761 episode\uFF08\u6587\u4EF6/\u547D\u4EE4/\u5931\u8D25\u2192\u4FEE\u590D/\u51B3\u7B56/\u672A\u95ED\u73AF\uFF09\uFF0C\u4E0D\u8FDB\u7D22\u5F15\uFF0C\u4F9B\u6062\u590D\u7B80\u62A5\u4F7F\u7528\uFF1B\u6BCF workspace \u4FDD\u7559\u6700\u8FD1 20 \u6761"), kind: "bool" },
2295
+ { key: "resumeBriefEnabled", label: tr("\u6062\u590D\u7B80\u62A5"), hint: tr("\u65B0\u4F1A\u8BDD\u542F\u52A8\u65F6\u6CE8\u5165\u6700\u8FD1 7 \u5929\u7684\u6700\u65B0 episode\uFF08\u2264240 \u5B57\u7B26 + engram_detail \u6307\u9488\uFF09\uFF0C\u9694\u5929\u7EE7\u7EED\u4E0D\u7528\u91CD\u65B0\u4EA4\u4EE3\u80CC\u666F"), kind: "bool" },
2296
+ { key: "entityCardsEnabled", label: tr("\u5B9E\u4F53\u5361"), hint: tr("[ENGRAM] \u7D22\u5F15\u4E3A\u6D3B\u8DC3\u5B9E\u4F53\uFF08\u6709\u951A\u5B9A\u8BB0\u5FC6\u6216\u672A\u95ED\u73AF\u4EFB\u52A1\uFF09\u6E32\u67D3\u4E00\u884C\u300C\u5F53\u524D\u771F\u76F8 + \u6253\u5F00\u4EFB\u52A1 + engram_detail(entity=\u2026) \u6307\u9488\u300D\uFF0C\u6700\u591A 2 \u5F20\uFF0C\u66FF\u4EE3\u8FD9\u4E9B\u5B9E\u4F53\u7684\u5E73\u94FA\u8BB0\u5FC6\u884C"), kind: "bool" },
2297
+ { key: "maxRecallPerSession", label: tr("\u6BCF\u4F1A\u8BDD\u53BB\u91CD\u4E0A\u9650"), hint: tr("recall \u6BCF\u4F1A\u8BDD\u6700\u591A\u4FDD\u7559 N \u6761\uFF08\u8DE8\u4F1A\u8BDD\u53BB\u91CD\uFF09"), kind: "num", min: 1, max: 10 },
2298
+ { key: "expireDays", label: tr("TTL\uFF08\u5929\uFF09"), hint: tr("0 = \u4E0D\u8FC7\u671F"), kind: "num", min: 0, max: 3650 },
2299
+ { key: "indexMaxChars", label: tr("\u7D22\u5F15\u5B57\u7B26\u4E0A\u9650"), hint: tr("[ENGRAM] \u5757 token \u9884\u7B97"), kind: "num", min: 0, max: 4e3 }
2337
2300
  ];
2338
- var ADVANCED_GROUPS = [
2301
+ var advancedGroups = () => [
2339
2302
  {
2340
2303
  id: "capture-adv",
2341
- title: "\u6355\u83B7\u4E0E\u68C0\u7D22\uFF08\u9AD8\u7EA7\uFF09",
2342
- description: "\u5176\u4F59\u6355\u83B7/\u641C\u7D22\u65CB\u94AE",
2304
+ title: tr("\u6355\u83B7\u4E0E\u68C0\u7D22\uFF08\u9AD8\u7EA7\uFF09"),
2305
+ description: tr("\u5176\u4F59\u6355\u83B7/\u641C\u7D22\u65CB\u94AE"),
2343
2306
  fields: [
2344
- { key: "autoCapturePerSession", label: "\u6BCF\u4F1A\u8BDD\u6355\u83B7\u4E0A\u9650", hint: "\u5355\u4F1A\u8BDD\u81EA\u52A8\u6355\u83B7\u6761\u6570\u4E0A\u9650", kind: "num", min: 0, max: 1e3 },
2345
- { key: "boundaryPruneHeadChars", label: "\u526A\u679D\u4FDD\u7559\u5934\u90E8(\u5B57\u7B26)", hint: "\u9608\u503C\u8986\u76D6\u751F\u6548\u65F6\u7ED3\u679C\u5F00\u5934\u4FDD\u7559\u957F\u5EA6\uFF08\u9ED8\u8BA4 4096\uFF09\uFF1B\u8C03\u5C0F\uFF08\u5982 1024\uFF09\u914D\u5408 T2048 \u66F4\u7701", kind: "num", min: 0, max: 16384, step: 128 },
2346
- { key: "boundaryPruneTailChars", label: "\u526A\u679D\u4FDD\u7559\u5C3E\u90E8(\u5B57\u7B26)", hint: "\u9608\u503C\u8986\u76D6\u751F\u6548\u65F6\u7ED3\u679C\u7ED3\u5C3E\u4FDD\u7559\u957F\u5EA6\uFF08\u9ED8\u8BA4 1024\uFF09\uFF1B\u8C03\u5C0F\uFF08\u5982 256\uFF09\u914D\u5408 T2048 \u66F4\u7701", kind: "num", min: 0, max: 16384, step: 128 },
2347
- { key: "boundaryPruneIdleCadence", label: "\u7A7A\u95F2\u6B65\u6570\u8FB9\u754C", hint: "\u6700\u591A\u6BCF N \u8BF7\u6C42\u89E6\u53D1\u4E00\u6B21\u526A\u679D\uFF0C\u8986\u76D6\u65E0 todo/goal \u7684\u4F1A\u8BDD\uFF08\u7EA6 62% \u4F1A\u8BDD\uFF09\uFF1B\u4ECD\u53D7\u507F\u8FD8\u95E8\u7EA6\u675F\uFF1B\u7559\u7A7A=\u4EC5\u4E8B\u4EF6\u8FB9\u754C", kind: "num", min: 10, max: 1e3, step: 10 },
2348
- { key: "autoRecallLimit", label: "\u81EA\u52A8\u53EC\u56DE\u6761\u6570", hint: "[RECALL] \u5757\u6700\u591A\u6CE8\u5165\u7684\u8BB0\u5FC6\u6761\u6570\uFF08\u5C11\u800C\u51C6\uFF09", kind: "num", min: 1, max: 8 },
2349
- { key: "sessionSearch", label: "\u4F1A\u8BDD\u5386\u53F2\u641C\u7D22", hint: "engram_recall \u652F\u6301\u8DE8\u4F1A\u8BDD FTS \u515C\u5E95", kind: "bool" },
2350
- { key: "recallScope", label: "\u53EC\u56DE\u8303\u56F4", hint: "workspace=\u4E25\u683C\u5F53\u524D\u5DE5\u4F5C\u533A\u9694\u79BB\uFF08\u9ED8\u8BA4\uFF0Ctoken \u7EAA\u5F8B\uFF09\uFF1Bglobal=\u672C\u5DE5\u4F5C\u533A\u547D\u4E2D\u5F31/\u7A7A\u65F6\u4ECE\u5176\u5B83\u5DE5\u4F5C\u533A\u6C60\u53EC\u56DE\u5E76\u6807 [W:<workspace>] \u6765\u6E90\uFF08\u4F1A\u6253\u7834\u9694\u79BB\uFF09", kind: "select", options: ["workspace", "global"] }
2307
+ { key: "autoCapturePerSession", label: tr("\u6BCF\u4F1A\u8BDD\u6355\u83B7\u4E0A\u9650"), hint: tr("\u5355\u4F1A\u8BDD\u81EA\u52A8\u6355\u83B7\u6761\u6570\u4E0A\u9650"), kind: "num", min: 0, max: 1e3 },
2308
+ { key: "boundaryPruneHeadChars", label: tr("\u526A\u679D\u4FDD\u7559\u5934\u90E8(\u5B57\u7B26)"), hint: tr("\u9608\u503C\u8986\u76D6\u751F\u6548\u65F6\u7ED3\u679C\u5F00\u5934\u4FDD\u7559\u957F\u5EA6\uFF08\u9ED8\u8BA4 4096\uFF09\uFF1B\u8C03\u5C0F\uFF08\u5982 1024\uFF09\u914D\u5408 T2048 \u66F4\u7701"), kind: "num", min: 0, max: 16384, step: 128 },
2309
+ { key: "boundaryPruneTailChars", label: tr("\u526A\u679D\u4FDD\u7559\u5C3E\u90E8(\u5B57\u7B26)"), hint: tr("\u9608\u503C\u8986\u76D6\u751F\u6548\u65F6\u7ED3\u679C\u7ED3\u5C3E\u4FDD\u7559\u957F\u5EA6\uFF08\u9ED8\u8BA4 1024\uFF09\uFF1B\u8C03\u5C0F\uFF08\u5982 256\uFF09\u914D\u5408 T2048 \u66F4\u7701"), kind: "num", min: 0, max: 16384, step: 128 },
2310
+ { key: "boundaryPruneIdleCadence", label: tr("\u7A7A\u95F2\u6B65\u6570\u8FB9\u754C"), hint: tr("\u6700\u591A\u6BCF N \u8BF7\u6C42\u89E6\u53D1\u4E00\u6B21\u526A\u679D\uFF0C\u8986\u76D6\u65E0 todo/goal \u7684\u4F1A\u8BDD\uFF08\u7EA6 62% \u4F1A\u8BDD\uFF09\uFF1B\u4ECD\u53D7\u507F\u8FD8\u95E8\u7EA6\u675F\uFF1B\u7559\u7A7A=\u4EC5\u4E8B\u4EF6\u8FB9\u754C"), kind: "num", min: 10, max: 1e3, step: 10 },
2311
+ { key: "autoRecallLimit", label: tr("\u81EA\u52A8\u53EC\u56DE\u6761\u6570"), hint: tr("[RECALL] \u5757\u6700\u591A\u6CE8\u5165\u7684\u8BB0\u5FC6\u6761\u6570\uFF08\u5C11\u800C\u51C6\uFF09"), kind: "num", min: 1, max: 8 },
2312
+ { key: "sessionSearch", label: tr("\u4F1A\u8BDD\u5386\u53F2\u641C\u7D22"), hint: tr("engram_recall \u652F\u6301\u8DE8\u4F1A\u8BDD FTS \u515C\u5E95"), kind: "bool" },
2313
+ { key: "recallScope", label: tr("\u53EC\u56DE\u8303\u56F4"), hint: tr("workspace=\u4E25\u683C\u5F53\u524D\u5DE5\u4F5C\u533A\u9694\u79BB\uFF08\u9ED8\u8BA4\uFF0Ctoken \u7EAA\u5F8B\uFF09\uFF1Bglobal=\u672C\u5DE5\u4F5C\u533A\u547D\u4E2D\u5F31/\u7A7A\u65F6\u4ECE\u5176\u5B83\u5DE5\u4F5C\u533A\u6C60\u53EC\u56DE\u5E76\u6807 [W:<workspace>] \u6765\u6E90\uFF08\u4F1A\u6253\u7834\u9694\u79BB\uFF09"), kind: "select", options: ["workspace", "global"] }
2351
2314
  ]
2352
2315
  },
2353
2316
  {
2354
2317
  id: "index-adv",
2355
- title: "\u7D22\u5F15\uFF08\u9AD8\u7EA7\uFF09",
2356
- description: "\u884C\u6570\u3001\u5165\u7D22\u5F15\u4FE1\u53F7\u4E0E\u664B\u5347\u89C4\u5219",
2318
+ title: tr("\u7D22\u5F15\uFF08\u9AD8\u7EA7\uFF09"),
2319
+ description: tr("\u884C\u6570\u3001\u5165\u7D22\u5F15\u4FE1\u53F7\u4E0E\u664B\u5347\u89C4\u5219"),
2357
2320
  fields: [
2358
- { key: "indexMaxLines", label: "\u7D22\u5F15\u6700\u5927\u884C\u6570", hint: "[ENGRAM] \u5757\u6700\u591A\u663E\u793A\u7684\u6761\u76EE\u884C\u6570", kind: "num", min: 0, max: 50 },
2359
- { key: "minIndexSignal", label: "\u5165\u7D22\u5F15\u4FE1\u53F7\u9608\u503C", hint: "signal \u2265 \u6B64\u503C\u7684\u81EA\u52A8\u6355\u83B7\u624D\u8FDB\u7D22\u5F15", kind: "num", min: 0, max: 1, step: 0.05 },
2360
- { key: "promoteHits", label: "\u664B\u5347\u547D\u4E2D\u6570", hint: "hit \u6570\u8FBE\u6B64\u503C\u7684\u4F4E\u4FE1\u53F7\u6761\u76EE\u8FDB\u7D22\u5F15", kind: "num", min: 0, max: 20 }
2321
+ { key: "indexMaxLines", label: tr("\u7D22\u5F15\u6700\u5927\u884C\u6570"), hint: tr("[ENGRAM] \u5757\u6700\u591A\u663E\u793A\u7684\u6761\u76EE\u884C\u6570"), kind: "num", min: 0, max: 50 },
2322
+ { key: "minIndexSignal", label: tr("\u5165\u7D22\u5F15\u4FE1\u53F7\u9608\u503C"), hint: tr("signal \u2265 \u6B64\u503C\u7684\u81EA\u52A8\u6355\u83B7\u624D\u8FDB\u7D22\u5F15"), kind: "num", min: 0, max: 1, step: 0.05 },
2323
+ { key: "promoteHits", label: tr("\u664B\u5347\u547D\u4E2D\u6570"), hint: tr("hit \u6570\u8FBE\u6B64\u503C\u7684\u4F4E\u4FE1\u53F7\u6761\u76EE\u8FDB\u7D22\u5F15"), kind: "num", min: 0, max: 20 }
2361
2324
  ]
2362
2325
  },
2363
2326
  {
2364
2327
  id: "retention-adv",
2365
- title: "\u751F\u547D\u5468\u671F\u4E0E GC\uFF08\u9AD8\u7EA7\uFF09",
2366
- description: "\u5BB9\u91CF\u4E0A\u9650\u4E0E\u5B9A\u671F\u56DE\u6536\uFF08\u81EA\u52A8 GC = \u66FF\u4EE3 DSH \u81EA\u52A8 compact\uFF09",
2328
+ title: tr("\u751F\u547D\u5468\u671F\u4E0E GC\uFF08\u9AD8\u7EA7\uFF09"),
2329
+ description: tr("\u5BB9\u91CF\u4E0A\u9650\u4E0E\u5B9A\u671F\u56DE\u6536\uFF08\u81EA\u52A8 GC = \u66FF\u4EE3 DSH \u81EA\u52A8 compact\uFF09"),
2367
2330
  fields: [
2368
- { key: "maxMemoriesPerWorkspace", label: "\u5DE5\u4F5C\u533A\u8BB0\u5FC6\u4E0A\u9650", hint: "\u5355\u5DE5\u4F5C\u533A\u5BB9\u91CF\u4E0A\u9650\uFF08GC \u5F52\u6863\u8D85\u9650\u6761\u76EE\uFF09", kind: "num", min: 0, max: 1e4 },
2369
- { key: "gcEnabled", label: "\u8BB0\u5FC6 GC", hint: "\u5B9A\u65F6\u56DE\u6536\uFF08\u8FC7\u671F/\u8D85\u5BB9\u91CF/stable \u8D85\u7A97/\u60AC\u7A7A\u94FE\u63A5\uFF09", kind: "bool" },
2370
- { key: "gcNarrative", label: "Context GC \u53D9\u4E8B\u515C\u5E95", hint: "\u81EA\u52A8 compact \u65F6\u65E0\u951A\u8F6E\u6B21\u7528 LLM \u6458\u8981\uFF1B\u5173\u6389=\u7EAF\u673A\u68B0\uFF08\u96F6 LLM\uFF09", kind: "bool" },
2371
- { key: "gcStableRetentionDays", label: "stable \u4EFB\u52A1\u4FDD\u7559\uFF08\u5929\uFF09", hint: "\u8D85\u7A97\u540E\u7531 GC \u5F52\u6863\u3001\u79BB\u5F00 [ESR] \u8868\u9762", kind: "num", min: 0, max: 3650 },
2372
- { key: "verifyArtifact", label: "\u6821\u9A8C artifact \u5B58\u5728", hint: "esr_close \u7684 artifact \u987B\u5728\u5DE5\u4F5C\u533A\u78C1\u76D8\u4E0A\u771F\u5B9E\u5B58\u5728\uFF08URL \u8C41\u514D\uFF09\uFF1Bforce:true/\u5173\u6389\u53EF\u8DF3\u8FC7", kind: "bool" },
2373
- { key: "autoSinkTodosOnEnd", label: "\u4F1A\u8BDD\u7ED3\u675F\u81EA\u52A8\u6C89\u6DC0 todo", hint: "\u4F1A\u8BDD\u7ED3\u675F\u65F6\u4ECD pending \u7684 todo \u81EA\u52A8\u8F6C\u6210 ESR draft\uFF08\u6309\u540D\u53BB\u91CD\u3001\u53D7\u4EFB\u52A1\u4E0A\u9650\u7EA6\u675F\uFF09\uFF1B\u5173\u6389=\u968F\u4F1A\u8BDD\u5F03\u53BB", kind: "bool" },
2374
- { key: "autoWebCompaction", label: "web \u9762\u81EA\u52A8\u542F\u7528 Context GC", hint: "\u542F\u52A8\u65F6\u628A\u5168\u90E8 stock \u5E03\u5C40\u7684 agent \u9884\u8BBE\uFF08shipped + \u81EA\u5B9A\u4E49\u6839\uFF09\u7684 compaction \u7EC4\u81EA\u52A8\u6362\u6210 dsh-engram/compaction\uFF1B\u5173\u6389=\u4E0D\u518D\u81EA\u52A8\u63A5\u7BA1\uFF08\u5DF2\u63A5\u7BA1\u7684\u9700 web-compaction:revert \u8FD8\u539F\uFF09", kind: "bool" }
2331
+ { key: "maxMemoriesPerWorkspace", label: tr("\u5DE5\u4F5C\u533A\u8BB0\u5FC6\u4E0A\u9650"), hint: tr("\u5355\u5DE5\u4F5C\u533A\u5BB9\u91CF\u4E0A\u9650\uFF08GC \u5F52\u6863\u8D85\u9650\u6761\u76EE\uFF09"), kind: "num", min: 0, max: 1e4 },
2332
+ { key: "gcEnabled", label: tr("\u8BB0\u5FC6 GC"), hint: tr("\u5B9A\u65F6\u56DE\u6536\uFF08\u8FC7\u671F/\u8D85\u5BB9\u91CF/stable \u8D85\u7A97/\u60AC\u7A7A\u94FE\u63A5\uFF09"), kind: "bool" },
2333
+ { key: "gcNarrative", label: tr("Context GC \u53D9\u4E8B\u515C\u5E95"), hint: tr("\u81EA\u52A8 compact \u65F6\u65E0\u951A\u8F6E\u6B21\u7528 LLM \u6458\u8981\uFF1B\u5173\u6389=\u7EAF\u673A\u68B0\uFF08\u96F6 LLM\uFF09"), kind: "bool" },
2334
+ { key: "gcStableRetentionDays", label: tr("stable \u4EFB\u52A1\u4FDD\u7559\uFF08\u5929\uFF09"), hint: tr("\u8D85\u7A97\u540E\u7531 GC \u5F52\u6863\u3001\u79BB\u5F00 [ESR] \u8868\u9762"), kind: "num", min: 0, max: 3650 },
2335
+ { key: "verifyArtifact", label: tr("\u6821\u9A8C artifact \u5B58\u5728"), hint: tr("esr_close \u7684 artifact \u987B\u5728\u5DE5\u4F5C\u533A\u78C1\u76D8\u4E0A\u771F\u5B9E\u5B58\u5728\uFF08URL \u8C41\u514D\uFF09\uFF1Bforce:true/\u5173\u6389\u53EF\u8DF3\u8FC7"), kind: "bool" },
2336
+ { key: "autoSinkTodosOnEnd", label: tr("\u4F1A\u8BDD\u7ED3\u675F\u81EA\u52A8\u6C89\u6DC0 todo"), hint: tr("\u4F1A\u8BDD\u7ED3\u675F\u65F6\u4ECD pending \u7684 todo \u81EA\u52A8\u8F6C\u6210 ESR draft\uFF08\u6309\u540D\u53BB\u91CD\u3001\u53D7\u4EFB\u52A1\u4E0A\u9650\u7EA6\u675F\uFF09\uFF1B\u5173\u6389=\u968F\u4F1A\u8BDD\u5F03\u53BB"), kind: "bool" },
2337
+ { key: "autoWebCompaction", label: tr("web \u9762\u81EA\u52A8\u542F\u7528 Context GC"), hint: tr("\u542F\u52A8\u65F6\u628A\u5168\u90E8 stock \u5E03\u5C40\u7684 agent \u9884\u8BBE\uFF08shipped + \u81EA\u5B9A\u4E49\u6839\uFF09\u7684 compaction \u7EC4\u81EA\u52A8\u6362\u6210 dsh-engram/compaction\uFF1B\u5173\u6389=\u4E0D\u518D\u81EA\u52A8\u63A5\u7BA1\uFF08\u5DF2\u63A5\u7BA1\u7684\u9700 web-compaction:revert \u8FD8\u539F\uFF09"), kind: "bool" }
2375
2338
  ]
2376
2339
  },
2377
2340
  {
2378
2341
  id: "semantics-adv",
2379
- title: "\u8BB0\u5FC6\u8BED\u4E49\uFF08\u9AD8\u7EA7\uFF09",
2380
- description: "supersedes / contradict \u7684\u542F\u53D1\u5F0F",
2342
+ title: tr("\u8BB0\u5FC6\u8BED\u4E49\uFF08\u9AD8\u7EA7\uFF09"),
2343
+ description: tr("supersedes / contradict \u7684\u542F\u53D1\u5F0F"),
2381
2344
  fields: [
2382
- { key: "autoSupersede", label: "\u81EA\u52A8 supersedes", hint: "\u5B9E\u4F53\u951A\u5B9A + \u66FF\u6362\u5F0F\u66F4\u65B0\uFF08\u6539\u7528/\u4E0D\u518D/no longer\u2026\uFF09\u81EA\u52A8\u628A\u65E7\u8BB0\u5FC6\u6807\u4E3A superseded\uFF1B\u65E7\u884C\u4FDD\u7559\u3001\u53EC\u56DE\u964D\u7EA7\u3002\u9ED8\u8BA4\u5173\uFF0C\u663E\u5F0F supersedes \u6C38\u8FDC\u4F18\u5148", kind: "bool" }
2345
+ { key: "autoSupersede", label: tr("\u81EA\u52A8 supersedes"), hint: tr("\u5B9E\u4F53\u951A\u5B9A + \u66FF\u6362\u5F0F\u66F4\u65B0\uFF08\u6539\u7528/\u4E0D\u518D/no longer\u2026\uFF09\u81EA\u52A8\u628A\u65E7\u8BB0\u5FC6\u6807\u4E3A superseded\uFF1B\u65E7\u884C\u4FDD\u7559\u3001\u53EC\u56DE\u964D\u7EA7\u3002\u9ED8\u8BA4\u5173\uFF0C\u663E\u5F0F supersedes \u6C38\u8FDC\u4F18\u5148"), kind: "bool" }
2383
2346
  ]
2384
2347
  },
2385
2348
  {
2386
2349
  id: "security",
2387
- title: "\u5B89\u5168",
2388
- description: "\u8BBF\u95EE\u56F4\u680F\u4E0E\u96A7\u9053\u6388\u6743",
2350
+ title: tr("\u5B89\u5168"),
2351
+ description: tr("\u8BBF\u95EE\u56F4\u680F\u4E0E\u96A7\u9053\u6388\u6743"),
2389
2352
  fields: [
2390
- { key: "trustedHosts", label: "\u53D7\u4FE1\u96A7\u9053\u57DF\u540D", hint: "\u5141\u8BB8\u7ECF\u96A7\u9053\u8BBF\u95EE\u8BB0\u5FC6\u67E5\u770B\u5668\u7684\u57DF\u540D\uFF0C\u9017\u53F7\u5206\u9694\uFF1B\u7559\u7A7A = \u4EC5\u672C\u673A\u3002\u6539\u540E\u9700\u91CD\u542F dsh web \u751F\u6548", kind: "text", width: 260 }
2353
+ { key: "trustedHosts", label: tr("\u53D7\u4FE1\u96A7\u9053\u57DF\u540D"), hint: tr("\u5141\u8BB8\u7ECF\u96A7\u9053\u8BBF\u95EE\u8BB0\u5FC6\u67E5\u770B\u5668\u7684\u57DF\u540D\uFF0C\u9017\u53F7\u5206\u9694\uFF1B\u7559\u7A7A = \u4EC5\u672C\u673A\u3002\u6539\u540E\u9700\u91CD\u542F dsh web \u751F\u6548"), kind: "text", width: 260 }
2391
2354
  ]
2392
2355
  }
2393
2356
  ];
2394
- var FIELDS = [...COMMON_FIELDS, ...ADVANCED_GROUPS.flatMap((group) => group.fields)];
2395
- var CARD_DESCRIPTION = "\u63A7\u5236 engram \u8BB0\u5FC6\u7684\u6355\u83B7\u3001\u7D22\u5F15\u3001\u4FDD\u7559\u4E0E\u96A7\u9053\u8BBF\u95EE";
2357
+ var allFields = () => [...commonFields(), ...advancedGroups().flatMap((group) => group.fields)];
2358
+ var cardDescription = () => tr("\u63A7\u5236 engram \u8BB0\u5FC6\u7684\u6355\u83B7\u3001\u7D22\u5F15\u3001\u4FDD\u7559\u4E0E\u96A7\u9053\u8BBF\u95EE");
2396
2359
  var s2 = {
2397
2360
  card: {
2398
2361
  listStyle: "none",
@@ -2579,7 +2542,7 @@ function EngramConfigCard({ scope, defaultOpen }) {
2579
2542
  const next = scope.getSnapshot();
2580
2543
  setSnap(next);
2581
2544
  if (next.status === "unavailable") {
2582
- console.warn("[dsh-engram] settings scope unavailable \u2014 Plugins \u914D\u7F6E\u5361\u5DF2\u9690\u85CF:", next.reason ?? "no reason served");
2545
+ console.warn(tr("[dsh-engram] settings scope unavailable \u2014 Plugins \u914D\u7F6E\u5361\u5DF2\u9690\u85CF:"), next.reason ?? "no reason served");
2583
2546
  }
2584
2547
  const value2 = next.value ?? next.base;
2585
2548
  if (value2) setDraft((prev) => ({ ...value2, ...prev }));
@@ -2591,7 +2554,7 @@ function EngramConfigCard({ scope, defaultOpen }) {
2591
2554
  setDraft((prev) => ({ ...prev, [key]: value2 }));
2592
2555
  }, []);
2593
2556
  const effective = snap?.value ?? snap?.base ?? {};
2594
- const anyDirty = FIELDS.some((field) => {
2557
+ const anyDirty = allFields().some((field) => {
2595
2558
  const staged = draft[field.key];
2596
2559
  return staged !== void 0 && staged !== effective[field.key];
2597
2560
  });
@@ -2599,7 +2562,7 @@ function EngramConfigCard({ scope, defaultOpen }) {
2599
2562
  setSaving(true);
2600
2563
  setError(null);
2601
2564
  try {
2602
- for (const field of FIELDS) {
2565
+ for (const field of allFields()) {
2603
2566
  const value2 = draft[field.key];
2604
2567
  if (value2 === void 0) continue;
2605
2568
  if (value2 === effective[field.key]) continue;
@@ -2666,7 +2629,7 @@ function EngramConfigCard({ scope, defaultOpen }) {
2666
2629
  style: { ...s2.input, width: field.width ?? 180 },
2667
2630
  value: Array.isArray(raw) ? raw.join(", ") : raw === void 0 ? "" : String(raw),
2668
2631
  disabled: !writable,
2669
- placeholder: "host.domain, \u53E6\u4E00\u57DF\u540D\u2026",
2632
+ placeholder: tr("host.domain, \u53E6\u4E00\u57DF\u540D\u2026"),
2670
2633
  onChange: (e) => {
2671
2634
  const tokens = e.target.value.split(/[,\s]+/).map((x) => x.trim()).filter(Boolean);
2672
2635
  setField(field.key, tokens);
@@ -2690,10 +2653,10 @@ function EngramConfigCard({ scope, defaultOpen }) {
2690
2653
  {
2691
2654
  type: "button",
2692
2655
  style: overridden ? { ...s2.reset, color: "var(--dsw-alias-brand-primary, #2563eb)" } : { ...s2.reset, cursor: "default", opacity: 0.55 },
2693
- title: "\u91CD\u7F6E\u4E3A\u9ED8\u8BA4",
2656
+ title: tr("\u91CD\u7F6E\u4E3A\u9ED8\u8BA4"),
2694
2657
  disabled: !writable || !overridden,
2695
2658
  onClick: () => void resetField(field.key),
2696
- children: "\u91CD\u7F6E"
2659
+ children: tr("\u91CD\u7F6E")
2697
2660
  }
2698
2661
  )
2699
2662
  ] })
@@ -2713,26 +2676,26 @@ function EngramConfigCard({ scope, defaultOpen }) {
2713
2676
  type: "button",
2714
2677
  style: s2.header,
2715
2678
  "aria-expanded": open,
2716
- "aria-label": `${open ? "\u6536\u8D77" : "\u5C55\u5F00"} dsh-engram \u8BBE\u7F6E`,
2679
+ "aria-label": tr("{0} dsh-engram \u8BBE\u7F6E", { "0": open ? tr("\u6536\u8D77") : tr("\u5C55\u5F00") }),
2717
2680
  onClick: () => setOpen((prev) => !prev),
2718
2681
  children: [
2719
2682
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { style: s2.headText, children: [
2720
2683
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: s2.name, children: "dsh-engram" }),
2721
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: s2.description, children: CARD_DESCRIPTION })
2684
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: s2.description, children: cardDescription() })
2722
2685
  ] }),
2723
- anyDirty && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: s2.pending, children: "\u672A\u4FDD\u5B58" }),
2686
+ anyDirty && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: s2.pending, children: tr("\u672A\u4FDD\u5B58") }),
2724
2687
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Chevron, { open })
2725
2688
  ]
2726
2689
  }
2727
2690
  ),
2728
2691
  open && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: s2.body, children: [
2729
- !writable && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { style: s2.readOnly, children: "\u672C\u90E8\u7F72\u7684\u8BBE\u7F6E\u4E3A\u53EA\u8BFB\uFF08\u5BBF\u4E3B\u672A\u6388\u6743\u5199\u5165\u6216\u9700\u91CD\u542F\u5E94\u7528\uFF09\u3002" }),
2692
+ !writable && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { style: s2.readOnly, children: tr("\u672C\u90E8\u7F72\u7684\u8BBE\u7F6E\u4E3A\u53EA\u8BFB\uFF08\u5BBF\u4E3B\u672A\u6388\u6743\u5199\u5165\u6216\u9700\u91CD\u542F\u5E94\u7528\uFF09\u3002") }),
2730
2693
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: s2.groupPanel, children: [
2731
2694
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: s2.groupHead, children: [
2732
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: s2.groupTitle, children: "\u5E38\u7528" }),
2733
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: s2.groupDesc, children: "\u6BCF\u5929\u4F1A\u78B0\u5230\u7684\u65CB\u94AE \xB7 \u5176\u4F59\u6536\u5728\u4E0B\u65B9\u9AD8\u7EA7\u8BBE\u7F6E" })
2695
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: s2.groupTitle, children: tr("\u5E38\u7528") }),
2696
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: s2.groupDesc, children: tr("\u6BCF\u5929\u4F1A\u78B0\u5230\u7684\u65CB\u94AE \xB7 \u5176\u4F59\u6536\u5728\u4E0B\u65B9\u9AD8\u7EA7\u8BBE\u7F6E") })
2734
2697
  ] }),
2735
- COMMON_FIELDS.map(renderField)
2698
+ commonFields().map(renderField)
2736
2699
  ] }),
2737
2700
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
2738
2701
  "button",
@@ -2742,17 +2705,13 @@ function EngramConfigCard({ scope, defaultOpen }) {
2742
2705
  "aria-expanded": advancedOpen,
2743
2706
  onClick: () => setAdvancedOpen((v) => !v),
2744
2707
  children: [
2745
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { style: s2.advHeadLabel, children: [
2746
- "\u9AD8\u7EA7\u8BBE\u7F6E\uFF08",
2747
- ADVANCED_GROUPS.reduce((n, g) => n + g.fields.length, 0),
2748
- " \u9879\uFF09"
2749
- ] }),
2708
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: s2.advHeadLabel, children: tr("\u9AD8\u7EA7\u8BBE\u7F6E\uFF08{0} \u9879\uFF09", { "0": advancedGroups().reduce((n, g) => n + g.fields.length, 0) }) }),
2750
2709
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Chevron, { open: advancedOpen })
2751
2710
  ]
2752
2711
  }
2753
2712
  ),
2754
- advancedOpen && ADVANCED_GROUPS.map(renderGroup),
2755
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: s2.note, children: "\u8BBE\u7F6E\u5BF9\u65B0\u5EFA\u4F1A\u8BDD\u5373\u65F6\u751F\u6548\uFF1B\u5DF2\u51BB\u7ED3\u7684 [ENGRAM] \u5757\u4FDD\u6301\u524D\u7F00\u7A33\u5B9A\u3002" }),
2713
+ advancedOpen && advancedGroups().map(renderGroup),
2714
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: s2.note, children: tr("\u8BBE\u7F6E\u5BF9\u65B0\u5EFA\u4F1A\u8BDD\u5373\u65F6\u751F\u6548\uFF1B\u5DF2\u51BB\u7ED3\u7684 [ENGRAM] \u5757\u4FDD\u6301\u524D\u7F00\u7A33\u5B9A\u3002") }),
2756
2715
  error && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: s2.failed, children: error }),
2757
2716
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: s2.footer, children: [
2758
2717
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
@@ -2762,7 +2721,7 @@ function EngramConfigCard({ scope, defaultOpen }) {
2762
2721
  style: { ...s2.discard, ...!anyDirty || saving ? s2.disabled : void 0 },
2763
2722
  disabled: !anyDirty || saving,
2764
2723
  onClick: discard,
2765
- children: "\u653E\u5F03\u4FEE\u6539"
2724
+ children: tr("\u653E\u5F03\u4FEE\u6539")
2766
2725
  }
2767
2726
  ),
2768
2727
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
@@ -2772,7 +2731,7 @@ function EngramConfigCard({ scope, defaultOpen }) {
2772
2731
  style: { ...s2.save, ...!anyDirty || saving ? s2.disabled : void 0 },
2773
2732
  disabled: !anyDirty || saving,
2774
2733
  onClick: () => void save(),
2775
- children: saving ? "\u4FDD\u5B58\u4E2D\u2026" : "\u4FDD\u5B58"
2734
+ children: saving ? tr("\u4FDD\u5B58\u4E2D\u2026") : tr("\u4FDD\u5B58")
2776
2735
  }
2777
2736
  )
2778
2737
  ] })
@@ -2794,15 +2753,16 @@ var KIND_COLORS = {
2794
2753
  task: "#4f46e5"
2795
2754
  };
2796
2755
  var KIND_LABEL = {
2797
- preference: "\u504F\u597D",
2798
- decision: "\u51B3\u5B9A",
2799
- error: "\u9519\u8BEF",
2800
- procedure: "\u6D41\u7A0B",
2801
- fact: "\u4E8B\u5B9E",
2802
- insight: "\u6D1E\u5BDF",
2803
- handoff: "\u4EA4\u63A5",
2804
- task: "\u4EFB\u52A1"
2756
+ preference: tr("\u504F\u597D"),
2757
+ decision: tr("\u51B3\u5B9A"),
2758
+ error: tr("\u9519\u8BEF"),
2759
+ procedure: tr("\u6D41\u7A0B"),
2760
+ fact: tr("\u4E8B\u5B9E"),
2761
+ insight: tr("\u6D1E\u5BDF"),
2762
+ handoff: tr("\u4EA4\u63A5"),
2763
+ task: tr("\u4EFB\u52A1")
2805
2764
  };
2765
+ var kindLabel = (kind) => tr(KIND_LABEL[kind] ?? kind);
2806
2766
  var REL_COLORS = {
2807
2767
  depends_on: "#d97706",
2808
2768
  implements: "#2563eb",
@@ -2820,7 +2780,7 @@ function fmtDate(ts) {
2820
2780
  function daysLeft(ts) {
2821
2781
  if (ts === null || ts === void 0) return "\u221E";
2822
2782
  const days = Math.ceil((ts - Date.now()) / 864e5);
2823
- return days > 0 ? `${days}d` : "\u5DF2\u8FC7\u671F";
2783
+ return days > 0 ? `${days}d` : tr("\u5DF2\u8FC7\u671F");
2824
2784
  }
2825
2785
  function gapsOf(t) {
2826
2786
  const gaps = [];
@@ -2905,25 +2865,25 @@ function EngramDetail({ target, api, tasks, nodes, links, memories = [], onClose
2905
2865
  try {
2906
2866
  const refs = gRefs.split(/[,,\s]+/).map((s4) => s4.trim()).filter(Boolean);
2907
2867
  const res = await api.closeTask(task.workspace, task.id, { artifact: gArt.trim() || void 0, evaluation: gEval.trim() || void 0, memoryRefs: refs.length ? refs : void 0 });
2908
- setNotice(res.state === "stable" ? `\u5DF2\u95ED\u73AF \u2192 STABLE \u2713` : `\u4ECD\u6709\u7F3A\u53E3\uFF1A${(res.gaps ?? []).join(", ") || "\u2014"}${res.artifactReason ? `\uFF08${res.artifactReason}\uFF09` : ""}`);
2868
+ setNotice(res.state === "stable" ? tr(`\u5DF2\u95ED\u73AF \u2192 STABLE \u2713`) : tr("\u4ECD\u6709\u7F3A\u53E3\uFF1A{0}{1}", { "0": (res.gaps ?? []).join(", ") || "\u2014", "1": res.artifactReason ? `\uFF08${res.artifactReason}\uFF09` : "" }));
2909
2869
  onChanged?.();
2910
2870
  } catch (e) {
2911
- setNotice(`\u5173\u95ED\u5931\u8D25\uFF1A${e instanceof Error ? e.message : String(e)}`);
2871
+ setNotice(tr("\u5173\u95ED\u5931\u8D25\uFF1A{0}", { "0": e instanceof Error ? e.message : String(e) }));
2912
2872
  } finally {
2913
2873
  setBusy(false);
2914
2874
  }
2915
2875
  }
2916
2876
  const kindBadge = (kind, label) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: { ...hb2.badge, background: KIND_COLORS[kind] ?? "#6b7280" }, children: label });
2917
2877
  const headerTitle = target.kind === "task" ? task?.name ?? target.id : target.kind === "memory" ? target.memory.text.slice(0, 40) : target.kind === "node" ? node?.name ?? target.id : link ? nameOf(link.source) : "";
2918
- const headerKind = target.kind === "task" ? task?.state === "stable" ? { k: "task", label: "STABLE" } : task ? { k: "task", label: task.state === "draft" ? "DRAFT" : "\u4EFB\u52A1" } : { k: "task", label: "\u4EFB\u52A1" } : target.kind === "memory" ? { k: target.memory.kind, label: KIND_LABEL[target.memory.kind] ?? target.memory.kind } : target.kind === "node" ? { k: "node", label: node?.kind || "\u8282\u70B9" } : { k: "link", label: "\u5173\u7CFB" };
2878
+ const headerKind = target.kind === "task" ? task?.state === "stable" ? { k: "task", label: "STABLE" } : task ? { k: "task", label: task.state === "draft" ? "DRAFT" : tr("\u4EFB\u52A1") } : { k: "task", label: tr("\u4EFB\u52A1") } : target.kind === "memory" ? { k: target.memory.kind, label: kindLabel(target.memory.kind) } : target.kind === "node" ? { k: "node", label: node?.kind || tr("\u8282\u70B9") } : { k: "link", label: tr("\u5173\u7CFB") };
2919
2879
  return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: hb2.root, children: [
2920
2880
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: hb2.head, children: [
2921
2881
  kindBadge(headerKind.k, headerKind.label),
2922
2882
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.title, title: headerTitle, children: headerTitle }),
2923
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("button", { style: hb2.close, onClick: onClose, "aria-label": "\u5173\u95ED\u8BE6\u60C5", children: "\u2715" })
2883
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("button", { style: hb2.close, onClick: onClose, "aria-label": tr("\u5173\u95ED\u8BE6\u60C5"), children: "\u2715" })
2924
2884
  ] }),
2925
2885
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: hb2.body, children: [
2926
- target.kind === "task" && !task && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.v, children: "\u4EFB\u52A1\u4E0D\u5B58\u5728\uFF08\u53EF\u80FD\u5DF2\u88AB\u5173\u95ED/\u5F52\u6863\uFF09\u3002" }),
2886
+ target.kind === "task" && !task && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.v, children: tr("\u4EFB\u52A1\u4E0D\u5B58\u5728\uFF08\u53EF\u80FD\u5DF2\u88AB\u5173\u95ED/\u5F52\u6863\uFF09\u3002") }),
2927
2887
  target.kind === "task" && task && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
2928
2888
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
2929
2889
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(EvidenceRing, { artifact: Boolean(task.artifact), evaluation: Boolean(task.evaluation), refs: (task.memoryRefs?.length ?? 0) > 0, size: 40 }),
@@ -2937,25 +2897,19 @@ function EngramDetail({ target, api, tasks, nodes, links, memories = [], onClose
2937
2897
  ] })
2938
2898
  ] }),
2939
2899
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: hb2.section, children: [
2940
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: "\u72B6\u6001" }),
2900
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: tr("\u72B6\u6001") }),
2941
2901
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { display: "flex", gap: 5, alignItems: "center", flexWrap: "wrap", marginTop: 3 }, children: [
2942
2902
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: { ...hb2.badge, background: task.state === "stable" ? "#059669" : task.state === "draft" ? "#6b7280" : gapsOf(task).length === 0 ? "#2563eb" : "#d97706" }, children: task.state === "stable" ? "STABLE" : task.state === "draft" ? "DRAFT" : gapsOf(task).length === 0 ? "READY" : "ACTIVE" }),
2943
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { style: hb2.tag, children: [
2944
- "\u521B\u5EFA ",
2945
- fmtDate(task.createdAt)
2946
- ] }),
2947
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { style: hb2.tag, children: [
2948
- "\u66F4\u65B0 ",
2949
- fmtDate(task.updatedAt)
2950
- ] })
2903
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: hb2.tag, children: tr("\u521B\u5EFA {0}", { "0": fmtDate(task.createdAt) }) }),
2904
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: hb2.tag, children: tr("\u66F4\u65B0 {0}", { "0": fmtDate(task.updatedAt) }) })
2951
2905
  ] })
2952
2906
  ] }),
2953
2907
  task.description && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: hb2.section, children: [
2954
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: "\u63CF\u8FF0" }),
2908
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: tr("\u63CF\u8FF0") }),
2955
2909
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { ...hb2.v, marginTop: 3 }, children: task.description })
2956
2910
  ] }),
2957
2911
  task.state === "active" && gapsOf(task).length > 0 && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: hb2.section, children: [
2958
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: "\u8BC1\u636E\u7F3A\u53E3" }),
2912
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: tr("\u8BC1\u636E\u7F3A\u53E3") }),
2959
2913
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { display: "flex", gap: 5, flexWrap: "wrap", marginTop: 3 }, children: gapsOf(task).map((g) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { style: hb2.tag, children: [
2960
2914
  g,
2961
2915
  " \u2717"
@@ -2976,37 +2930,37 @@ function EngramDetail({ target, api, tasks, nodes, links, memories = [], onClose
2976
2930
  ] })
2977
2931
  ] }),
2978
2932
  task.memoryRefs.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: hb2.section, children: [
2979
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: "\u8BB0\u5FC6\u5F15\u7528" }),
2980
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { display: "flex", gap: 5, flexWrap: "wrap", marginTop: 3 }, children: task.memoryRefs.map((r) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { style: hb2.chip, title: `\u6253\u5F00\u8BB0\u5FC6 ${r}`, onClick: () => onNavigateMemory(r), children: [
2933
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: tr("\u8BB0\u5FC6\u5F15\u7528") }),
2934
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { display: "flex", gap: 5, flexWrap: "wrap", marginTop: 3 }, children: task.memoryRefs.map((r) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { style: hb2.chip, title: tr("\u6253\u5F00\u8BB0\u5FC6 {0}", { "0": r }), onClick: () => onNavigateMemory(r), children: [
2981
2935
  "#",
2982
2936
  r.slice(0, 8)
2983
2937
  ] }, r)) })
2984
2938
  ] }),
2985
2939
  task.state === "active" && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { marginTop: 4, padding: 8, border: "1px solid var(--dsh-color-border, #d1d5db)", borderRadius: 10, background: dark ? "rgba(15,23,42,.35)" : "rgba(15,23,42,.03)" }, children: [
2986
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { fontSize: 11, color: "var(--dsh-color-muted, #6b7280)", marginBottom: 6 }, children: "\u8865\u9F50\u8BC1\u636E \u2192 \u5173\u95ED\uFF08\u4E09\u9879\u5168\u9F50\u8F6C STABLE\uFF09" }),
2940
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { fontSize: 11, color: "var(--dsh-color-muted, #6b7280)", marginBottom: 6 }, children: tr("\u8865\u9F50\u8BC1\u636E \u2192 \u5173\u95ED\uFF08\u4E09\u9879\u5168\u9F50\u8F6C STABLE\uFF09") }),
2987
2941
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: 6 }, children: [
2988
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("input", { style: hb2.input, placeholder: "artifact \u4EA7\u7269\uFF08\u6587\u4EF6/PR/\u8DEF\uFF09", value: gArt, onChange: (e) => setGArt(e.target.value) }),
2989
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("input", { style: hb2.input, placeholder: "evaluation \u8BC4\u4F30\uFF08\u6D4B\u8BD5/\u8BC4\u5BA1/\u5206\u6570\uFF09", value: gEval, onChange: (e) => setGEval(e.target.value) }),
2990
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("input", { style: hb2.input, placeholder: "memory_refs\uFF08#id, \u9017\u53F7\u5206\u9694\uFF09", value: gRefs, onChange: (e) => setGRefs(e.target.value) }),
2942
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("input", { style: hb2.input, placeholder: tr("artifact \u4EA7\u7269\uFF08\u6587\u4EF6/PR/\u8DEF\uFF09"), value: gArt, onChange: (e) => setGArt(e.target.value) }),
2943
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("input", { style: hb2.input, placeholder: tr("evaluation \u8BC4\u4F30\uFF08\u6D4B\u8BD5/\u8BC4\u5BA1/\u5206\u6570\uFF09"), value: gEval, onChange: (e) => setGEval(e.target.value) }),
2944
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("input", { style: hb2.input, placeholder: tr("memory_refs\uFF08#id, \u9017\u53F7\u5206\u9694\uFF09"), value: gRefs, onChange: (e) => setGRefs(e.target.value) }),
2991
2945
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { display: "flex", gap: 6 }, children: [
2992
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("button", { style: hb2.btnPrimary, disabled: busy, onClick: () => setClosing(true), children: busy ? "\u2026" : "\u6309\u8BC1\u636E\u95ED\u73AF" }),
2946
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("button", { style: hb2.btnPrimary, disabled: busy, onClick: () => setClosing(true), children: busy ? "\u2026" : tr("\u6309\u8BC1\u636E\u95ED\u73AF") }),
2993
2947
  closing && !busy && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
2994
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: { fontSize: 11.5, color: "var(--dsh-color-muted, #6b7280)", alignSelf: "center" }, children: "\u786E\u8BA4\u63D0\u4EA4\uFF1F" }),
2948
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: { fontSize: 11.5, color: "var(--dsh-color-muted, #6b7280)", alignSelf: "center" }, children: tr("\u786E\u8BA4\u63D0\u4EA4\uFF1F") }),
2995
2949
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("button", { style: hb2.btn, onClick: () => {
2996
2950
  void submitClose();
2997
2951
  setClosing(false);
2998
- }, children: "\u786E\u8BA4" }),
2999
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("button", { style: hb2.btn, onClick: () => setClosing(false), children: "\u53D6\u6D88" })
2952
+ }, children: tr("\u786E\u8BA4") }),
2953
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("button", { style: hb2.btn, onClick: () => setClosing(false), children: tr("\u53D6\u6D88") })
3000
2954
  ] })
3001
2955
  ] })
3002
2956
  ] })
3003
2957
  ] }),
3004
- task.state === "stable" && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { fontSize: 11.5, color: "#059669", fontWeight: 700 }, children: "\u5DF2\u95ED\u73AF \u2713 \u2014 \u5168\u90E8\u8BC1\u636E\u95E8\u5DF2\u6EE1\u8DB3\uFF0C\u53EF\u4EE5\u4ECE\u770B\u677F/\u6E05\u5355\u79FB\u9664" }),
2958
+ task.state === "stable" && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { fontSize: 11.5, color: "#059669", fontWeight: 700 }, children: tr("\u5DF2\u95ED\u73AF \u2713 \u2014 \u5168\u90E8\u8BC1\u636E\u95E8\u5DF2\u6EE1\u8DB3\uFF0C\u53EF\u4EE5\u4ECE\u770B\u677F/\u6E05\u5355\u79FB\u9664") }),
3005
2959
  notice && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { fontSize: 11.5, fontWeight: 600, color: "#d97706" }, children: notice })
3006
2960
  ] }),
3007
2961
  target.kind === "memory" && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
3008
2962
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { display: "flex", alignItems: "flex-start", gap: 6 }, children: [
3009
- kindBadge(target.memory.kind, KIND_LABEL[target.memory.kind] ?? target.memory.kind),
2963
+ kindBadge(target.memory.kind, kindLabel(target.memory.kind)),
3010
2964
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { style: hb2.tag, children: [
3011
2965
  "signal ",
3012
2966
  target.memory.signal.toFixed(2)
@@ -3018,41 +2972,32 @@ function EngramDetail({ target, api, tasks, nodes, links, memories = [], onClose
3018
2972
  target.memory.status === "archived" && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: hb2.tag, children: "archived" })
3019
2973
  ] }),
3020
2974
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: hb2.section, children: [
3021
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: "\u5185\u5BB9" }),
2975
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: tr("\u5185\u5BB9") }),
3022
2976
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { ...hb2.v, whiteSpace: "pre-wrap", background: dark ? "rgba(15,23,42,.5)" : "rgba(15,23,42,.05)", borderRadius: 8, padding: 8, marginTop: 3 }, children: target.memory.text })
3023
2977
  ] }),
3024
2978
  target.memory.tags.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: hb2.section, children: [
3025
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: "\u6807\u7B7E" }),
2979
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: tr("\u6807\u7B7E") }),
3026
2980
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { display: "flex", gap: 5, flexWrap: "wrap", marginTop: 3 }, children: target.memory.tags.map((t) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { style: hb2.tag, children: [
3027
2981
  "#",
3028
2982
  t
3029
2983
  ] }, t)) })
3030
2984
  ] }),
3031
2985
  memoryLinks && (memoryLinks.m.supersedes || memoryLinks.m.contradicts || memoryLinks.replacedBy.length > 0 || memoryLinks.contradictedBy.length > 0) && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: hb2.section, children: [
3032
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: "\u66FF\u6362 / \u51B2\u7A81" }),
2986
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: tr("\u66FF\u6362 / \u51B2\u7A81") }),
3033
2987
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { display: "flex", gap: 5, flexWrap: "wrap", marginTop: 3 }, children: [
3034
- memoryLinks.m.supersedes && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { style: hb2.chipSup, title: `\u672C\u6761\u66FF\u4EE3 ${memoryLinks.m.supersedes}\uFF08\u65E7\u884C\u4FDD\u7559\u3001\u53EC\u56DE\u964D\u7EA7\uFF09`, onClick: () => onNavigateMemory(memoryLinks.m.supersedes), children: [
3035
- "\u66FF\u4EE3 #",
3036
- memoryLinks.m.supersedes.slice(0, 8)
3037
- ] }),
3038
- memoryLinks.m.contradicts && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { style: hb2.chipDanger, title: `\u672C\u6761\u4E0E ${memoryLinks.m.contradicts} \u51B2\u7A81\uFF08\u4E24\u6761\u90FD\u4FDD\u7559\uFF09`, onClick: () => onNavigateMemory(memoryLinks.m.contradicts), children: [
3039
- "\u51B2\u7A81 #",
3040
- memoryLinks.m.contradicts.slice(0, 8)
3041
- ] }),
3042
- memoryLinks.replacedBy.map((x) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { style: hb2.chipSup, title: `\u5DF2\u88AB ${x.text.slice(0, 40)}\u2026 \u66FF\u4EE3`, onClick: () => onNavigateMemory(x.id), children: [
3043
- "\u2190 \u88AB #",
3044
- x.id.slice(0, 8),
3045
- " \u66FF\u4EE3"
3046
- ] }, x.id)),
3047
- memoryLinks.contradictedBy.map((x) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { style: hb2.chipDanger, title: `${x.text.slice(0, 40)}\u2026 \u4E0E\u672C\u6761\u51B2\u7A81`, onClick: () => onNavigateMemory(x.id), children: [
2988
+ memoryLinks.m.supersedes && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: hb2.chipSup, title: tr("\u672C\u6761\u66FF\u4EE3 {0}\uFF08\u65E7\u884C\u4FDD\u7559\u3001\u53EC\u56DE\u964D\u7EA7\uFF09", { "0": memoryLinks.m.supersedes }), onClick: () => onNavigateMemory(memoryLinks.m.supersedes), children: tr("\u66FF\u4EE3 #{0}", { "0": memoryLinks.m.supersedes.slice(0, 8) }) }),
2989
+ memoryLinks.m.contradicts && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: hb2.chipDanger, title: tr("\u672C\u6761\u4E0E {0} \u51B2\u7A81\uFF08\u4E24\u6761\u90FD\u4FDD\u7559\uFF09", { "0": memoryLinks.m.contradicts }), onClick: () => onNavigateMemory(memoryLinks.m.contradicts), children: tr("\u51B2\u7A81 #{0}", { "0": memoryLinks.m.contradicts.slice(0, 8) }) }),
2990
+ memoryLinks.replacedBy.map((x) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: hb2.chipSup, title: tr("\u5DF2\u88AB {0}\u2026 \u66FF\u4EE3", { "0": x.text.slice(0, 40) }), onClick: () => onNavigateMemory(x.id), children: tr("\u2190 \u88AB #{0} \u66FF\u4EE3", { "0": x.id.slice(0, 8) }) }, x.id)),
2991
+ memoryLinks.contradictedBy.map((x) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { style: hb2.chipDanger, title: tr("{0}\u2026 \u4E0E\u672C\u6761\u51B2\u7A81", { "0": x.text.slice(0, 40) }), onClick: () => onNavigateMemory(x.id), children: [
3048
2992
  "\u21C4 #",
3049
2993
  x.id.slice(0, 8),
3050
- " \u51B2\u7A81"
2994
+ " ",
2995
+ tr(" \u51B2\u7A81")
3051
2996
  ] }, x.id))
3052
2997
  ] })
3053
2998
  ] }),
3054
2999
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: hb2.section, children: [
3055
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: "\u5143\u6570\u636E" }),
3000
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: tr("\u5143\u6570\u636E") }),
3056
3001
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: 2, marginTop: 3, fontSize: 11.5, fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", color: "var(--dsh-color-muted, #6b7280)" }, children: [
3057
3002
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { children: [
3058
3003
  "id ",
@@ -3097,18 +3042,18 @@ function EngramDetail({ target, api, tasks, nodes, links, memories = [], onClose
3097
3042
  ] })
3098
3043
  ] })
3099
3044
  ] }),
3100
- target.kind === "node" && !node && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.v, children: "\u8282\u70B9\u4E0D\u5B58\u5728\u3002" }),
3045
+ target.kind === "node" && !node && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.v, children: tr("\u8282\u70B9\u4E0D\u5B58\u5728\u3002") }),
3101
3046
  target.kind === "node" && node && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
3102
3047
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
3103
- kindBadge("node", node.kind || "\u8282\u70B9"),
3048
+ kindBadge("node", node.kind || tr("\u8282\u70B9")),
3104
3049
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: { fontWeight: 700, fontSize: 13 }, children: node.name })
3105
3050
  ] }),
3106
3051
  node.description && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: hb2.section, children: [
3107
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: "\u63CF\u8FF0" }),
3052
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: tr("\u63CF\u8FF0") }),
3108
3053
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { ...hb2.v, marginTop: 3 }, children: node.description })
3109
3054
  ] }),
3110
3055
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: hb2.section, children: [
3111
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: "\u5143\u6570\u636E" }),
3056
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: tr("\u5143\u6570\u636E") }),
3112
3057
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { marginTop: 3, fontSize: 11.5, fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", color: "var(--dsh-color-muted, #6b7280)", display: "flex", flexDirection: "column", gap: 2 }, children: [
3113
3058
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { children: [
3114
3059
  node.id,
@@ -3122,13 +3067,9 @@ function EngramDetail({ target, api, tasks, nodes, links, memories = [], onClose
3122
3067
  ] })
3123
3068
  ] }),
3124
3069
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: hb2.section, children: [
3125
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: hb2.k, children: [
3126
- "\u5173\u8054\u5173\u7CFB\uFF08",
3127
- incident.length,
3128
- "\uFF09"
3129
- ] }),
3070
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: tr("\u5173\u8054\u5173\u7CFB\uFF08{0}\uFF09", { "0": incident.length }) }),
3130
3071
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: 5, marginTop: 3 }, children: [
3131
- incident.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.v, children: "\u6682\u65E0\u5173\u7CFB \u2014 \u7528 esr_link \u5173\u8054" }),
3072
+ incident.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.v, children: tr("\u6682\u65E0\u5173\u7CFB \u2014 \u7528 esr_link \u5173\u8054") }),
3132
3073
  incident.map(({ l, outgoing }) => {
3133
3074
  const other = outgoing ? l.target : l.source;
3134
3075
  const color = REL_COLORS[l.relation] ?? "#6b7280";
@@ -3158,7 +3099,7 @@ function EngramDetail({ target, api, tasks, nodes, links, memories = [], onClose
3158
3099
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "mono", style: { fontSize: 12, fontWeight: 600 }, children: nameOf(link.target) })
3159
3100
  ] }),
3160
3101
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: hb2.section, children: [
3161
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: "\u5143\u6570\u636E" }),
3102
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: hb2.k, children: tr("\u5143\u6570\u636E") }),
3162
3103
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { marginTop: 3, fontSize: 11.5, fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", color: "var(--dsh-color-muted, #6b7280)", display: "flex", flexDirection: "column", gap: 2 }, children: [
3163
3104
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { children: [
3164
3105
  "id ",
@@ -3206,15 +3147,16 @@ var KIND_COLORS2 = {
3206
3147
  task: "#4f46e5"
3207
3148
  };
3208
3149
  var KIND_LABEL2 = {
3209
- preference: "\u504F\u597D",
3210
- decision: "\u51B3\u5B9A",
3211
- error: "\u9519\u8BEF",
3212
- procedure: "\u6D41\u7A0B",
3213
- fact: "\u4E8B\u5B9E",
3214
- insight: "\u6D1E\u5BDF",
3215
- handoff: "\u4EA4\u63A5",
3216
- task: "\u4EFB\u52A1"
3150
+ preference: tr("\u504F\u597D"),
3151
+ decision: tr("\u51B3\u5B9A"),
3152
+ error: tr("\u9519\u8BEF"),
3153
+ procedure: tr("\u6D41\u7A0B"),
3154
+ fact: tr("\u4E8B\u5B9E"),
3155
+ insight: tr("\u6D1E\u5BDF"),
3156
+ handoff: tr("\u4EA4\u63A5"),
3157
+ task: tr("\u4EFB\u52A1")
3217
3158
  };
3159
+ var kindLabel2 = (kind) => tr(KIND_LABEL2[kind] ?? kind);
3218
3160
  var s3 = {
3219
3161
  root: { padding: "2px 4px 40px" },
3220
3162
  h1: { fontSize: 20, fontWeight: 700, margin: "0 0 4px" },
@@ -3564,13 +3506,13 @@ function EngramSection({ api, t, scope }) {
3564
3506
  setImportDump(JSON.parse(text));
3565
3507
  setImportName(file.name);
3566
3508
  } catch (e) {
3567
- setDataError(`\u65E0\u6CD5\u89E3\u6790 ${file.name}\uFF1A${e instanceof Error ? e.message : String(e)}`);
3509
+ setDataError(tr("\u65E0\u6CD5\u89E3\u6790 {0}\uFF1A{1}", { "0": file.name, "1": e instanceof Error ? e.message : String(e) }));
3568
3510
  }
3569
3511
  };
3570
3512
  const runImport = async () => {
3571
3513
  if (importDump === null) return;
3572
3514
  if (importMode === "replace" && !importReplaceOk) {
3573
- setDataError("\u66FF\u6362\u6A21\u5F0F\u4F1A\u5148\u6E05\u7A7A\u76EE\u6807\u5DE5\u4F5C\u533A \u2014 \u8BF7\u5148\u52FE\u9009\u786E\u8BA4");
3515
+ setDataError(tr("\u66FF\u6362\u6A21\u5F0F\u4F1A\u5148\u6E05\u7A7A\u76EE\u6807\u5DE5\u4F5C\u533A \u2014 \u8BF7\u5148\u52FE\u9009\u786E\u8BA4"));
3574
3516
  return;
3575
3517
  }
3576
3518
  setImportBusy(true);
@@ -3648,7 +3590,7 @@ function EngramSection({ api, t, scope }) {
3648
3590
  memoryRefs: refs
3649
3591
  });
3650
3592
  if (out.state === "active") {
3651
- setError(`\u8BC1\u636E\u4ECD\u6709\u7F3A\u53E3\uFF1A${(out.gaps ?? []).join(", ")}${out.artifactReason ? `\uFF08${out.artifactReason}\uFF09` : ""} \u2014 \u4EFB\u52A1\u4FDD\u6301 ACTIVE\uFF0C\u8865\u9F50\u540E\u518D\u63D0\u4EA4`);
3593
+ setError(tr("\u8BC1\u636E\u4ECD\u6709\u7F3A\u53E3\uFF1A{0}{1} \u2014 \u4EFB\u52A1\u4FDD\u6301 ACTIVE\uFF0C\u8865\u9F50\u540E\u518D\u63D0\u4EA4", { "0": (out.gaps ?? []).join(", "), "1": out.artifactReason ? `\uFF08${out.artifactReason}\uFF09` : "" }));
3652
3594
  }
3653
3595
  setCloseFor(null);
3654
3596
  setCloseArtifact("");
@@ -3667,7 +3609,7 @@ function EngramSection({ api, t, scope }) {
3667
3609
  setDetail({ kind: "memory", memory: m });
3668
3610
  setDetailNotice(null);
3669
3611
  } else {
3670
- setDetailNotice(`\u8BB0\u5FC6 ${id} \u4E0D\u5728\u5F53\u524D\u52A0\u8F7D\u5217\u8868 \u2014 \u5207\u6362\u5230\u300C\u8BB0\u5FC6\u300D\u9875\u52A0\u8F7D\u540E\u53EF\u7528`);
3612
+ setDetailNotice(tr("\u8BB0\u5FC6 {0} \u4E0D\u5728\u5F53\u524D\u52A0\u8F7D\u5217\u8868 \u2014 \u5207\u6362\u5230\u300C\u8BB0\u5FC6\u300D\u9875\u52A0\u8F7D\u540E\u53EF\u7528", { "0": id }));
3671
3613
  }
3672
3614
  };
3673
3615
  const openTask = (id) => {
@@ -3683,44 +3625,39 @@ function EngramSection({ api, t, scope }) {
3683
3625
  const wsCounts = workspace && overview ? overview.workspaces[workspace] ?? null : null;
3684
3626
  const { vars } = useEngramTheme();
3685
3627
  return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { ...s3.root, ...vars }, children: [
3686
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h1", { style: s3.h1, children: "Engram \u8BB0\u5FC6" }),
3687
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { style: s3.sub, children: "\u8DE8\u4F1A\u8BDD\u8BB0\u5FC6 \xB7 \u96F6 LLM \u81EA\u52A8\u6355\u83B7 \xB7 \u7B26\u53F7\u7D22\u5F15\u6E10\u8FDB\u62AB\u9732 \u2014 \u6570\u636E\u6E90 ~/.dsh/storages/dsh_engram.json" }),
3628
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h1", { style: s3.h1, children: tr("Engram \u8BB0\u5FC6") }),
3629
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { style: s3.sub, children: tr("\u8DE8\u4F1A\u8BDD\u8BB0\u5FC6 \xB7 \u96F6 LLM \u81EA\u52A8\u6355\u83B7 \xB7 \u7B26\u53F7\u7D22\u5F15\u6E10\u8FDB\u62AB\u9732 \u2014 \u6570\u636E\u6E90 ~/.dsh/storages/dsh_engram.json") }),
3688
3630
  error && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: s3.error, children: [
3689
3631
  t("error"),
3690
3632
  ": ",
3691
3633
  error
3692
3634
  ] }),
3693
3635
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: s3.tabBar, children: [
3694
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: view === "mem" ? s3.tabActive : s3.tab, onClick: () => setView("mem"), children: "\u8BB0\u5FC6" }),
3695
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: view === "esr" ? s3.tabActive : s3.tab, onClick: () => setView("esr"), children: "ESR\uFF08\u4EFB\u52A1 \xB7 \u8282\u70B9 \xB7 \u5173\u7CFB\uFF09" }),
3696
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: view === "preview" ? s3.tabActive : s3.tab, onClick: () => setView("preview"), children: "\u6CE8\u5165\u9884\u89C8" }),
3697
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: view === "telemetry" ? s3.tabActive : s3.tab, onClick: () => setView("telemetry"), children: "\u9065\u6D4B" }),
3698
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: view === "config" ? s3.tabActive : s3.tab, onClick: () => setView("config"), children: "\u8BBE\u7F6E" })
3636
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: view === "mem" ? s3.tabActive : s3.tab, onClick: () => setView("mem"), children: tr("\u8BB0\u5FC6") }),
3637
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: view === "esr" ? s3.tabActive : s3.tab, onClick: () => setView("esr"), children: tr("ESR\uFF08\u4EFB\u52A1 \xB7 \u8282\u70B9 \xB7 \u5173\u7CFB\uFF09") }),
3638
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: view === "preview" ? s3.tabActive : s3.tab, onClick: () => setView("preview"), children: tr("\u6CE8\u5165\u9884\u89C8") }),
3639
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: view === "telemetry" ? s3.tabActive : s3.tab, onClick: () => setView("telemetry"), children: tr("\u9065\u6D4B") }),
3640
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: view === "config" ? s3.tabActive : s3.tab, onClick: () => setView("config"), children: tr("\u8BBE\u7F6E") })
3699
3641
  ] }),
3700
3642
  view !== "config" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { ...s3.row, marginTop: 2 }, children: [
3701
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { fontWeight: 700, fontSize: 13 }, children: "\u5DE5\u4F5C\u533A\uFF1A" }),
3643
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { fontWeight: 700, fontSize: 13 }, children: tr("\u5DE5\u4F5C\u533A\uFF1A") }),
3702
3644
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("select", { style: s3.input, value: workspace, onChange: (e) => setWorkspace(e.target.value), children: [
3703
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "", children: "\u5168\u90E8\u5DE5\u4F5C\u533A" }),
3645
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "", children: tr("\u5168\u90E8\u5DE5\u4F5C\u533A") }),
3704
3646
  workspaces.map((ws) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("option", { value: ws, children: [
3705
3647
  ws,
3706
3648
  "\uFF08",
3707
3649
  overview?.workspaces[ws]?.memories ?? 0,
3708
- " \u6761\uFF09"
3650
+ " ",
3651
+ tr(" \u6761\uFF09")
3709
3652
  ] }, ws))
3710
3653
  ] })
3711
3654
  ] }),
3712
3655
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { display: "flex", gap: 12, alignItems: "flex-start" }, children: [
3713
3656
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { flex: "1 1 auto", minWidth: 0 }, children: [
3714
3657
  view === "mem" && approvals.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { ...s3.card, marginBottom: 12, borderColor: "#f0c36d" }, children: [
3715
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { fontWeight: 700, fontSize: 13, marginBottom: 6 }, children: [
3716
- "Playbook \u5F85\u6279\u51C6\uFF08",
3717
- approvals.filter((a) => !a.approved).length,
3718
- " \u6761 / \u5171 ",
3719
- approvals.length,
3720
- "\uFF09"
3721
- ] }),
3658
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { fontWeight: 700, fontSize: 13, marginBottom: 6 }, children: tr("Playbook \u5F85\u6279\u51C6\uFF08{0} \u6761 / \u5171 {1}\uFF09", { "0": approvals.filter((a) => !a.approved).length, "1": approvals.length }) }),
3722
3659
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { fontSize: 12, opacity: 0.75, marginBottom: 8 }, children: [
3723
- "\u8BC1\u636E\u5DF2\u8FC7\u5173\uFF08\u22653 \u6B21\u9A8C\u8BC1\u300114 \u5929\u5185\uFF09\u3002\u5199\u6587\u4EF6\u7ED9\u5BBF\u4E3B\u5E7F\u544A\u9700\u8981\u4F60\u70B9\u5934 \u2014\u2014 \u8BC1\u636E\u8BC1\u660E\u547D\u4EE4\u8DD1\u901A\u8FC7\uFF0C\u4E0D\u8BC1\u660E\u6307\u4EE4\u662F\u5BF9\u7684\u3002 \u6279\u51C6\u540E\uFF1A",
3660
+ tr("\u8BC1\u636E\u5DF2\u8FC7\u5173\uFF08\u22653 \u6B21\u9A8C\u8BC1\u300114 \u5929\u5185\uFF09\u3002\u5199\u6587\u4EF6\u7ED9\u5BBF\u4E3B\u5E7F\u544A\u9700\u8981\u4F60\u70B9\u5934 \u2014\u2014 \u8BC1\u636E\u8BC1\u660E\u547D\u4EE4\u8DD1\u901A\u8FC7\uFF0C\u4E0D\u8BC1\u660E\u6307\u4EE4\u662F\u5BF9\u7684\u3002 \u6279\u51C6\u540E\uFF1A"),
3724
3661
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { children: "npx dsh-engram skill export" }),
3725
3662
  "\u3002"
3726
3663
  ] }),
@@ -3728,9 +3665,8 @@ function EngramSection({ api, t, scope }) {
3728
3665
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { style: { fontWeight: 600 }, children: item.name }),
3729
3666
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { opacity: 0.7 }, children: [
3730
3667
  item.id.slice(0, 8),
3731
- " \xB7 \u8BC1\u636E ",
3732
- item.evidence,
3733
- " \u6B21"
3668
+ " ",
3669
+ tr(" \xB7 \u8BC1\u636E {0} \u6B21", { "0": item.evidence })
3734
3670
  ] }),
3735
3671
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { opacity: 0.7, flex: "1 1 auto", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: item.description }),
3736
3672
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
@@ -3739,7 +3675,7 @@ function EngramSection({ api, t, scope }) {
3739
3675
  style: s3.btn,
3740
3676
  disabled: approvalBusy === item.id,
3741
3677
  onClick: () => void toggleApproval(item),
3742
- children: item.approved ? "\u64A4\u9500" : "\u6279\u51C6"
3678
+ children: item.approved ? tr("\u64A4\u9500") : tr("\u6279\u51C6")
3743
3679
  }
3744
3680
  )
3745
3681
  ] }, item.id))
@@ -3751,61 +3687,61 @@ function EngramSection({ api, t, scope }) {
3751
3687
  const linkNum = wsCounts ? wsCounts.links : overview.totals.links;
3752
3688
  const ledgerBucket = overview.ledger ? workspace && overview.ledger.byWorkspace[workspace] || overview.ledger.totals : null;
3753
3689
  return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: s3.stats, children: [
3754
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StatCard, { num: String(memNum), label: wsCounts ? "\u8BB0\u5FC6 (active)" : "\u8BB0\u5FC6 (active, \u5168\u5C40)" }),
3755
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StatCard, { num: String(taskNum), label: wsCounts ? "\u4EFB\u52A1 (active)" : "\u4EFB\u52A1 (active, \u5168\u5C40)" }),
3756
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StatCard, { num: String(linkNum), label: wsCounts ? "\u5173\u7CFB" : "\u5173\u7CFB (\u5168\u5C40)" }),
3757
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StatCard, { num: String(wsCounts ? wsCounts.nodes ?? 0 : overview.totals.nodes ?? 0), label: wsCounts ? "\u8282\u70B9" : "\u8282\u70B9 (\u5168\u5C40)" }),
3758
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StatCard, { num: String(workspaces.length), label: "\u5DE5\u4F5C\u533A" }),
3759
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StatCard, { num: String(overview.captures.total), label: "\u81EA\u52A8\u6355\u83B7" }),
3760
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StatCard, { num: String(overview.captures.preference ?? 0), label: "\u504F\u597D\u6355\u83B7" }),
3690
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StatCard, { num: String(memNum), label: wsCounts ? tr("\u8BB0\u5FC6 (active)") : tr("\u8BB0\u5FC6 (active, \u5168\u5C40)") }),
3691
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StatCard, { num: String(taskNum), label: wsCounts ? tr("\u4EFB\u52A1 (active)") : tr("\u4EFB\u52A1 (active, \u5168\u5C40)") }),
3692
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StatCard, { num: String(linkNum), label: wsCounts ? tr("\u5173\u7CFB") : tr("\u5173\u7CFB (\u5168\u5C40)") }),
3693
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StatCard, { num: String(wsCounts ? wsCounts.nodes ?? 0 : overview.totals.nodes ?? 0), label: wsCounts ? tr("\u8282\u70B9") : tr("\u8282\u70B9 (\u5168\u5C40)") }),
3694
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StatCard, { num: String(workspaces.length), label: tr("\u5DE5\u4F5C\u533A") }),
3695
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StatCard, { num: String(overview.captures.total), label: tr("\u81EA\u52A8\u6355\u83B7") }),
3696
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StatCard, { num: String(overview.captures.preference ?? 0), label: tr("\u504F\u597D\u6355\u83B7") }),
3761
3697
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
3762
3698
  StatCard,
3763
3699
  {
3764
3700
  num: indexCost ? `~${indexCost.tokens}` : "\u2013",
3765
- label: "[ENGRAM] \u7D22\u5F15 token / \u5DE5\u4F5C\u533A"
3701
+ label: tr("[ENGRAM] \u7D22\u5F15 token / \u5DE5\u4F5C\u533A")
3766
3702
  }
3767
3703
  ),
3768
3704
  gc && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
3769
3705
  StatCard,
3770
3706
  {
3771
3707
  num: String(gc.archivedMemories + gc.archivedTasks),
3772
- label: `GC \u5DF2\u5F52\u6863 \xB7 \u94FE\u63A5-${gc.removedLinks}`
3708
+ label: tr("GC \u5DF2\u5F52\u6863 \xB7 \u94FE\u63A5-{0}", { "0": gc.removedLinks })
3773
3709
  }
3774
3710
  ),
3775
3711
  ledgerBucket && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
3776
3712
  StatCard,
3777
3713
  {
3778
3714
  num: signedTokens(ledgerBucket.netTokens),
3779
- label: `\u4E0A\u4E0B\u6587\u51C0 token \xB7 \u8BF7\u6C42 ${ledgerBucket.requests}`
3715
+ label: tr("\u4E0A\u4E0B\u6587\u51C0 token \xB7 \u8BF7\u6C42 {0}", { "0": ledgerBucket.requests })
3780
3716
  }
3781
3717
  )
3782
3718
  ] });
3783
3719
  })(),
3784
3720
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: s3.subPanel, children: [
3785
3721
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 10, flexWrap: "wrap" }, children: [
3786
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { fontWeight: 700, fontSize: 13 }, children: "\u8BB0\u5FC6 GC\uFF08pi-esr \u7EA6\u675F\uFF09" }),
3722
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { fontWeight: 700, fontSize: 13 }, children: tr("\u8BB0\u5FC6 GC\uFF08pi-esr \u7EA6\u675F\uFF09") }),
3787
3723
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("label", { style: { fontSize: 12, display: "inline-flex", gap: 4, alignItems: "center" }, children: [
3788
3724
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("input", { type: "checkbox", checked: gcDryRun, onChange: (e) => setGcDryRun(e.target.checked) }),
3789
- "\u4EC5\u9884\u89C8\uFF08dry run\uFF09"
3725
+ tr("\u4EC5\u9884\u89C8\uFF08dry run\uFF09")
3790
3726
  ] }),
3791
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btnPrimary, onClick: () => void runGc(), disabled: gcRunning || !workspace, children: gcRunning ? "\u2026" : "\u8FD0\u884C GC" }),
3792
- gc && gc.lastRun > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: s3.mono, children: [
3793
- "\u4E0A\u6B21 ",
3794
- fmtDate2(gc.lastRun)
3795
- ] })
3727
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btnPrimary, onClick: () => void runGc(), disabled: gcRunning || !workspace, children: gcRunning ? "\u2026" : tr("\u8FD0\u884C GC") }),
3728
+ gc && gc.lastRun > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: s3.mono, children: tr("\u4E0A\u6B21 {0}", { "0": fmtDate2(gc.lastRun) }) })
3796
3729
  ] }),
3797
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { fontSize: 11.5, color: "var(--dsh-color-muted, #6b7280)", marginTop: 4 }, children: "\u5DE5\u4F5C\u96C6\uFF08active \u4EFB\u52A1\u5F15\u7528 / \u4EFB\u52A1\u8BB0\u5FC6 / \u5DF2\u5165\u7D22\u5F15\u547D\u4E2D\uFF09\u6C38\u4E0D\u9A71\u9010\uFF1BTTL \u8FC7\u671F\u5F52\u6863\u3001\u8D85\u5BB9\u91CF\u6DD8\u6C70\u3001stable \u4EFB\u52A1\u8D85\u7A97\u5F52\u6863\u3001\u60AC\u7A7A\u94FE\u63A5\u6E05\u7406\u3002\u53EA\u5F52\u6863\u4E0D\u786C\u5220\u2014\u2014\u6761\u76EE id \u4FDD\u6301\u53EF\u91CD\u53D6\u3002" }),
3730
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { fontSize: 11.5, color: "var(--dsh-color-muted, #6b7280)", marginTop: 4 }, children: tr("\u5DE5\u4F5C\u96C6\uFF08active \u4EFB\u52A1\u5F15\u7528 / \u4EFB\u52A1\u8BB0\u5FC6 / \u5DF2\u5165\u7D22\u5F15\u547D\u4E2D\uFF09\u6C38\u4E0D\u9A71\u9010\uFF1BTTL \u8FC7\u671F\u5F52\u6863\u3001\u8D85\u5BB9\u91CF\u6DD8\u6C70\u3001stable \u4EFB\u52A1\u8D85\u7A97\u5F52\u6863\u3001\u60AC\u7A7A\u94FE\u63A5\u6E05\u7406\u3002\u53EA\u5F52\u6863\u4E0D\u786C\u5220\u2014\u2014\u6761\u76EE id \u4FDD\u6301\u53EF\u91CD\u53D6\u3002") }),
3798
3731
  gcReport && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { marginTop: 8, fontSize: 12.5 }, children: [
3799
3732
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { children: [
3800
- gcReport.dryRun ? "dry-run \u9884\u89C8\uFF1A" : "\u5DF2\u6267\u884C\uFF1A",
3733
+ gcReport.dryRun ? tr("dry-run \u9884\u89C8\uFF1A") : tr("\u5DF2\u6267\u884C\uFF1A"),
3801
3734
  " ",
3802
- "\u5F52\u6863\u8BB0\u5FC6 ",
3735
+ tr("\u5F52\u6863\u8BB0\u5FC6 "),
3803
3736
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("b", { children: gcReport.archivedMemories.length }),
3804
- " \xB7 \u5F52\u6863\u4EFB\u52A1 ",
3737
+ " ",
3738
+ tr(" \xB7 \u5F52\u6863\u4EFB\u52A1 "),
3805
3739
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("b", { children: gcReport.archivedTasks.length }),
3806
- " \xB7 \u6E05\u7406\u94FE\u63A5 ",
3740
+ " ",
3741
+ tr(" \xB7 \u6E05\u7406\u94FE\u63A5 "),
3807
3742
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("b", { children: gcReport.removedLinks.length }),
3808
- " \xB7 \u4FDD\u62A4 ",
3743
+ " ",
3744
+ tr(" \xB7 \u4FDD\u62A4 "),
3809
3745
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("b", { children: gcReport.protectedMemories })
3810
3746
  ] }),
3811
3747
  gcReport.archivedMemories.slice(0, 5).map((e) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: s3.mono, children: [
@@ -3836,10 +3772,10 @@ function EngramSection({ api, t, scope }) {
3836
3772
  ] }),
3837
3773
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: s3.subPanel, children: [
3838
3774
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 10, flexWrap: "wrap" }, children: [
3839
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { fontWeight: 700, fontSize: 13 }, children: "\u6570\u636E\u5907\u4EFD\uFF08export / import\uFF09" }),
3840
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btn, title: "\u4E0B\u8F7D\u5F53\u524D\u5DE5\u4F5C\u533A\uFF08\u6216\u5168\u90E8\uFF09\u7684 dsh-engram/export v1 \u8F6C\u50A8", onClick: () => void downloadExport(), children: "\u5BFC\u51FA JSON" }),
3775
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { fontWeight: 700, fontSize: 13 }, children: tr("\u6570\u636E\u5907\u4EFD\uFF08export / import\uFF09") }),
3776
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btn, title: tr("\u4E0B\u8F7D\u5F53\u524D\u5DE5\u4F5C\u533A\uFF08\u6216\u5168\u90E8\uFF09\u7684 dsh-engram/export v1 \u8F6C\u50A8"), onClick: () => void downloadExport(), children: tr("\u5BFC\u51FA JSON") }),
3841
3777
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("label", { style: { ...s3.btn, display: "inline-flex", alignItems: "center", gap: 6, cursor: "pointer" }, children: [
3842
- "\u9009\u62E9\u5BFC\u5165\u6587\u4EF6\u2026",
3778
+ tr("\u9009\u62E9\u5BFC\u5165\u6587\u4EF6\u2026"),
3843
3779
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
3844
3780
  "input",
3845
3781
  {
@@ -3856,17 +3792,19 @@ function EngramSection({ api, t, scope }) {
3856
3792
  importName && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: s3.mono, children: importName })
3857
3793
  ] }),
3858
3794
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { fontSize: 11.5, color: "var(--dsh-color-muted, #6b7280)", marginTop: 4 }, children: [
3859
- "\u5BFC\u51FA\u5373\u53EF\u79FB\u690D\u5907\u4EFD\uFF08\u8BB0\u5FC6/\u4EFB\u52A1/\u5173\u7CFB/\u8282\u70B9\uFF0C\u542B\u5F52\u6863\uFF09\uFF1B",
3795
+ tr("\u5BFC\u51FA\u5373\u53EF\u79FB\u690D\u5907\u4EFD\uFF08\u8BB0\u5FC6/\u4EFB\u52A1/\u5173\u7CFB/\u8282\u70B9\uFF0C\u542B\u5F52\u6863\uFF09\uFF1B"),
3860
3796
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("b", { children: "merge" }),
3861
- " \u53EA\u8865\u7F3A\u5931\uFF08\u5E42\u7B49\uFF09\uFF0C",
3797
+ " ",
3798
+ tr(" \u53EA\u8865\u7F3A\u5931\uFF08\u5E42\u7B49\uFF09\uFF0C"),
3862
3799
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("b", { children: "replace" }),
3863
- " \u5148\u6E05\u7A7A\u76EE\u6807\u5DE5\u4F5C\u533A\u518D\u6062\u590D\u3002\u8BB0\u5FC6\u6B63\u6587\u4E0E\u6240\u6709\u5199\u5165\u8DEF\u5F84\u4E00\u6837\u8FC7\u8131\u654F\u3002"
3800
+ " ",
3801
+ tr(" \u5148\u6E05\u7A7A\u76EE\u6807\u5DE5\u4F5C\u533A\u518D\u6062\u590D\u3002\u8BB0\u5FC6\u6B63\u6587\u4E0E\u6240\u6709\u5199\u5165\u8DEF\u5F84\u4E00\u6837\u8FC7\u8131\u654F\u3002")
3864
3802
  ] }),
3865
3803
  importDump !== null && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { marginTop: 8, display: "flex", flexDirection: "column", gap: 6 }, children: [
3866
3804
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { display: "flex", gap: 10, alignItems: "center", flexWrap: "wrap", fontSize: 12.5 }, children: [
3867
3805
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("label", { style: { display: "inline-flex", gap: 4, alignItems: "center" }, children: [
3868
3806
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("input", { type: "checkbox", checked: importDryRun, onChange: (e) => setImportDryRun(e.target.checked) }),
3869
- "\u4EC5\u9884\u89C8\uFF08dry run\uFF09"
3807
+ tr("\u4EC5\u9884\u89C8\uFF08dry run\uFF09")
3870
3808
  ] }),
3871
3809
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
3872
3810
  "select",
@@ -3879,15 +3817,14 @@ function EngramSection({ api, t, scope }) {
3879
3817
  if (mode !== "replace") setImportReplaceOk(false);
3880
3818
  },
3881
3819
  children: [
3882
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "merge", children: "\u5408\u5E76\uFF08merge\uFF0C\u5E42\u7B49\uFF09" }),
3883
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "replace", children: "\u66FF\u6362\uFF08replace\uFF0C\u5148\u6E05\u7A7A\u5DE5\u4F5C\u533A\uFF09" })
3820
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "merge", children: tr("\u5408\u5E76\uFF08merge\uFF0C\u5E42\u7B49\uFF09") }),
3821
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "replace", children: tr("\u66FF\u6362\uFF08replace\uFF0C\u5148\u6E05\u7A7A\u5DE5\u4F5C\u533A\uFF09") })
3884
3822
  ]
3885
3823
  }
3886
3824
  ),
3887
3825
  importMode === "replace" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("label", { style: { display: "inline-flex", gap: 4, alignItems: "center", color: "#b45309" }, children: [
3888
3826
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("input", { type: "checkbox", checked: importReplaceOk, onChange: (e) => setImportReplaceOk(e.target.checked) }),
3889
- "\u6211\u786E\u8BA4\u66FF\u6362",
3890
- workspace ? `\uFF08${workspace}\uFF09` : "\uFF08\u9700\u5148\u9009\u5DE5\u4F5C\u533A\uFF09"
3827
+ tr("\u6211\u786E\u8BA4\u66FF\u6362{0}", { "0": workspace ? `\uFF08${workspace}\uFF09` : tr("\uFF08\u9700\u5148\u9009\u5DE5\u4F5C\u533A\uFF09") })
3891
3828
  ] }),
3892
3829
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
3893
3830
  "button",
@@ -3895,16 +3832,16 @@ function EngramSection({ api, t, scope }) {
3895
3832
  style: s3.btnPrimary,
3896
3833
  disabled: importBusy || importMode === "replace" && (!importReplaceOk || !workspace),
3897
3834
  onClick: () => void runImport(),
3898
- children: importBusy ? "\u2026" : importDryRun ? "\u9884\u89C8\u5BFC\u5165" : "\u6267\u884C\u5BFC\u5165"
3835
+ children: importBusy ? "\u2026" : importDryRun ? tr("\u9884\u89C8\u5BFC\u5165") : tr("\u6267\u884C\u5BFC\u5165")
3899
3836
  }
3900
3837
  )
3901
3838
  ] }),
3902
3839
  importReport && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { fontSize: 12.5 }, children: [
3903
3840
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { children: [
3904
- importReport.dryRun ? "dry-run \u9884\u89C8\uFF1A" : "\u5DF2\u5BFC\u5165\uFF1A",
3841
+ importReport.dryRun ? tr("dry-run \u9884\u89C8\uFF1A") : tr("\u5DF2\u5BFC\u5165\uFF1A"),
3905
3842
  " ",
3906
3843
  Object.entries(importReport.written).map(([k, v]) => `${k} ${v}`).join(" \xB7 ") || "\u2014",
3907
- importReport.skipped.length > 0 ? ` \xB7 \u8DF3\u8FC7 ${importReport.skipped.length}` : ""
3844
+ importReport.skipped.length > 0 ? tr(" \xB7 \u8DF3\u8FC7 {0}", { "0": importReport.skipped.length }) : ""
3908
3845
  ] }),
3909
3846
  importReport.skipped.slice(0, 5).map((x, i) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: s3.mono, children: [
3910
3847
  "- ",
@@ -3920,19 +3857,19 @@ function EngramSection({ api, t, scope }) {
3920
3857
  ] }),
3921
3858
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: s3.row, children: [
3922
3859
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("select", { style: s3.input, value: kind, onChange: (e) => setKind(e.target.value), children: [
3923
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "", children: "\u5168\u90E8\u7C7B\u578B" }),
3924
- kindsPresent.map((k) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: k, children: KIND_LABEL2[k] ?? k }, k))
3860
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "", children: tr("\u5168\u90E8\u7C7B\u578B") }),
3861
+ kindsPresent.map((k) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: k, children: kindLabel2(k) }, k))
3925
3862
  ] }),
3926
3863
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("select", { style: s3.input, value: status, onChange: (e) => setStatus(e.target.value), children: [
3927
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "active", children: "\u4EC5\u6D3B\u52A8" }),
3928
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "all", children: "\u5168\u90E8\u72B6\u6001" }),
3929
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "archived", children: "\u5DF2\u5F52\u6863" })
3864
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "active", children: tr("\u4EC5\u6D3B\u52A8") }),
3865
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "all", children: tr("\u5168\u90E8\u72B6\u6001") }),
3866
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "archived", children: tr("\u5DF2\u5F52\u6863") })
3930
3867
  ] }),
3931
3868
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
3932
3869
  "input",
3933
3870
  {
3934
3871
  style: { ...s3.input, width: 180 },
3935
- placeholder: "\u641C\u7D22\u8BB0\u5FC6\u2026",
3872
+ placeholder: tr("\u641C\u7D22\u8BB0\u5FC6\u2026"),
3936
3873
  value: q,
3937
3874
  onChange: (e) => setQ(e.target.value),
3938
3875
  onKeyDown: (e) => {
@@ -3959,9 +3896,8 @@ function EngramSection({ api, t, scope }) {
3959
3896
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: s3.tag, children: [
3960
3897
  "index ",
3961
3898
  cfg.indexMaxLines,
3962
- " \u884C / ",
3963
- cfg.indexMaxChars,
3964
- " \u5B57\u7B26"
3899
+ " ",
3900
+ tr(" \u884C / {0} \u5B57\u7B26", { "0": cfg.indexMaxChars })
3965
3901
  ] }),
3966
3902
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: s3.tag, children: [
3967
3903
  "promote \u2265",
@@ -3976,23 +3912,24 @@ function EngramSection({ api, t, scope }) {
3976
3912
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("col", { style: { width: 72 } })
3977
3913
  ] }),
3978
3914
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("tr", { children: [
3979
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("th", { style: s3.th, children: "\u7C7B\u578B" }),
3980
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("th", { style: s3.th, children: "\u5185\u5BB9" }),
3915
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("th", { style: s3.th, children: tr("\u7C7B\u578B") }),
3916
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("th", { style: s3.th, children: tr("\u5185\u5BB9") }),
3981
3917
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("th", { style: s3.th })
3982
3918
  ] }) }),
3983
3919
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("tbody", { children: [
3984
- flatRows.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("tr", { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("td", { colSpan: 3, style: s3.empty, children: "\u6682\u65E0\u8BB0\u5FC6 \u2014 \u4F7F\u7528 engram_store \u663E\u5F0F\u8BB0\u5F55\uFF0C\u6216\u8BA9\u81EA\u52A8\u6355\u83B7\u5DE5\u4F5C\uFF08git \u63D0\u4EA4 / \u5173\u952E\u6587\u4EF6\u7F16\u8F91 / \u5DE5\u5177\u9519\u8BEF\uFF09" }) }),
3920
+ flatRows.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("tr", { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("td", { colSpan: 3, style: s3.empty, children: tr("\u6682\u65E0\u8BB0\u5FC6 \u2014 \u4F7F\u7528 engram_store \u663E\u5F0F\u8BB0\u5F55\uFF0C\u6216\u8BA9\u81EA\u52A8\u6355\u83B7\u5DE5\u4F5C\uFF08git \u63D0\u4EA4 / \u5173\u952E\u6587\u4EF6\u7F16\u8F91 / \u5DE5\u5177\u9519\u8BEF\uFF09") }) }),
3985
3921
  memPageRows.map(
3986
3922
  (r) => r.kind === "head" ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("tr", { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("td", { colSpan: 3, style: s3.wsHead, children: [
3987
3923
  r.ws,
3988
3924
  " \xB7 ",
3989
3925
  r.count,
3990
- " \u6761"
3926
+ " ",
3927
+ tr(" \u6761")
3991
3928
  ] }) }, `h-${r.ws}`) : /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("tr", { children: [
3992
3929
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("td", { style: { ...s3.td, whiteSpace: "nowrap" }, children: [
3993
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { ...s3.badge, background: KIND_COLORS2[r.m.kind] ?? "#6b7280" }, children: KIND_LABEL2[r.m.kind] ?? r.m.kind }),
3930
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { ...s3.badge, background: KIND_COLORS2[r.m.kind] ?? "#6b7280" }, children: kindLabel2(r.m.kind) }),
3994
3931
  r.m.status === "archived" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { ...s3.tag, color: "#b45309", background: "#fef3c7" }, children: "archived" }),
3995
- supersedeIndex.replacedBy.has(r.m.id) && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { ...s3.tag, color: "#b45309", background: "#fef3c7" }, title: `\u5DF2\u88AB ${(supersedeIndex.replacedBy.get(r.m.id) ?? []).map((x) => `#${x.id.slice(0, 8)}`).join(", ")} \u66FF\u4EE3\uFF08\u65E7\u884C\u4FDD\u7559\u3001\u53EC\u56DE\u964D\u7EA7\uFF09`, children: "\u5DF2\u66FF\u6362" })
3932
+ supersedeIndex.replacedBy.has(r.m.id) && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { ...s3.tag, color: "#b45309", background: "#fef3c7" }, title: tr("\u5DF2\u88AB {0} \u66FF\u4EE3\uFF08\u65E7\u884C\u4FDD\u7559\u3001\u53EC\u56DE\u964D\u7EA7\uFF09", { "0": (supersedeIndex.replacedBy.get(r.m.id) ?? []).map((x) => `#${x.id.slice(0, 8)}`).join(", ") }), children: tr("\u5DF2\u66FF\u6362") })
3996
3933
  ] }),
3997
3934
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("td", { style: { ...s3.td, minWidth: 0 }, children: [
3998
3935
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { title: r.m.text, style: expandedRows.has(r.m.id) ? s3.expanded : s3.clamp3, children: r.m.text }),
@@ -4009,57 +3946,46 @@ function EngramSection({ api, t, scope }) {
4009
3946
  " \xB7 ",
4010
3947
  daysLeft2(r.m.expiresAt)
4011
3948
  ] }),
4012
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.linkBtn, onClick: () => toggleExpand(r.m.id), children: expandedRows.has(r.m.id) ? "\u6536\u8D77" : "\u5C55\u5F00\u5168\u6587" }),
4013
- r.m.supersedes && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("button", { style: s3.linkBtn, title: `\u6253\u5F00\u88AB\u66FF\u4EE3\u7684\u65E7\u8BB0\u5FC6 ${r.m.supersedes}`, onClick: () => openMemory(r.m.supersedes), children: [
4014
- "\u66FF\u4EE3 #",
4015
- r.m.supersedes.slice(0, 8)
4016
- ] })
3949
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.linkBtn, onClick: () => toggleExpand(r.m.id), children: expandedRows.has(r.m.id) ? tr("\u6536\u8D77") : tr("\u5C55\u5F00\u5168\u6587") }),
3950
+ r.m.supersedes && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.linkBtn, title: tr("\u6253\u5F00\u88AB\u66FF\u4EE3\u7684\u65E7\u8BB0\u5FC6 {0}", { "0": r.m.supersedes }), onClick: () => openMemory(r.m.supersedes), children: tr("\u66FF\u4EE3 #{0}", { "0": r.m.supersedes.slice(0, 8) }) })
4017
3951
  ] }),
4018
3952
  r.m.tags.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { marginTop: 3, display: "flex", flexWrap: "wrap", gap: 4 }, children: r.m.tags.map((tag) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: s3.tag, children: tag }, tag)) })
4019
3953
  ] }),
4020
3954
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("td", { style: s3.td, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: 4, alignItems: "flex-start" }, children: [
4021
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.linkBtn, title: "\u5728\u4FA7\u680F\u6253\u5F00\u8BE6\u60C5", onClick: () => {
3955
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.linkBtn, title: tr("\u5728\u4FA7\u680F\u6253\u5F00\u8BE6\u60C5"), onClick: () => {
4022
3956
  setDetail({ kind: "memory", memory: r.m });
4023
3957
  setDetailNotice(null);
4024
- }, children: "\u8BE6\u60C5" }),
4025
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btn, title: "\u5F52\u6863\uFF08TTL/\u8F6F\u5220\uFF0C\u53EF\u6062\u590D\u4E0D\u8F7D\u5165\u7D22\u5F15\uFF09", onClick: () => void act(() => api.archive(r.m.id, r.m.workspace)), children: "\u5F52\u6863" }),
4026
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btn, title: "\u6C38\u4E45\u5220\u9664", onClick: () => {
4027
- if (window.confirm(`\u5220\u9664\u8FD9\u6761\u8BB0\u5FC6?
4028
- ${r.m.text.slice(0, 60)}`)) void act(() => api.remove(r.m.id, r.m.workspace));
4029
- }, children: "\u5220\u9664" })
3958
+ }, children: tr("\u8BE6\u60C5") }),
3959
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btn, title: tr("\u5F52\u6863\uFF08TTL/\u8F6F\u5220\uFF0C\u53EF\u6062\u590D\u4E0D\u8F7D\u5165\u7D22\u5F15\uFF09"), onClick: () => void act(() => api.archive(r.m.id, r.m.workspace)), children: tr("\u5F52\u6863") }),
3960
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btn, title: tr("\u6C38\u4E45\u5220\u9664"), onClick: () => {
3961
+ if (window.confirm(tr("\u5220\u9664\u8FD9\u6761\u8BB0\u5FC6?\n{0}", { "0": r.m.text.slice(0, 60) }))) void act(() => api.remove(r.m.id, r.m.workspace));
3962
+ }, children: tr("\u5220\u9664") })
4030
3963
  ] }) })
4031
3964
  ] }, r.m.id)
4032
3965
  )
4033
3966
  ] })
4034
3967
  ] }),
4035
3968
  flatRows.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: s3.pageBar, children: [
4036
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btn, disabled: memPageSafe === 0, onClick: () => setMemPage(memPageSafe - 1), children: "\u2039 \u4E0A\u4E00\u9875" }),
4037
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
4038
- "\u7B2C ",
4039
- memPageSafe + 1,
4040
- " / ",
4041
- memPageCount,
4042
- " \u9875 \xB7 \u5171 ",
4043
- flatRows.length,
4044
- " \u6761"
4045
- ] }),
4046
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btn, disabled: memPageSafe >= memPageCount - 1, onClick: () => setMemPage(memPageSafe + 1), children: "\u4E0B\u4E00\u9875 \u203A" })
3969
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btn, disabled: memPageSafe === 0, onClick: () => setMemPage(memPageSafe - 1), children: tr("\u2039 \u4E0A\u4E00\u9875") }),
3970
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { children: tr("\u7B2C {0} / {1} \u9875 \xB7 \u5171 {2} \u6761", { "0": memPageSafe + 1, "1": memPageCount, "2": flatRows.length }) }),
3971
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btn, disabled: memPageSafe >= memPageCount - 1, onClick: () => setMemPage(memPageSafe + 1), children: tr("\u4E0B\u4E00\u9875 \u203A") })
4047
3972
  ] })
4048
3973
  ] }),
4049
3974
  view === "esr" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
4050
3975
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, flexWrap: "wrap", marginBottom: 6 }, children: [
4051
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { fontSize: 11.5, color: "var(--dsh-color-muted, #6b7280)" }, children: "\u5DE5\u5177\u8C03\u7528\u4E0E\u547D\u4E2D\u7EDF\u8BA1\u89C1\u300C\u9065\u6D4B\u300Dtab\uFF1B[ESR] \u6CE8\u5165\u5757\u7684 escalate \u63D0\u9192\u4F9D\u636E\u771F\u5B9E\u6570\u636E\u52A8\u6001\u51FA\u73B0\u3002" }),
3976
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { fontSize: 11.5, color: "var(--dsh-color-muted, #6b7280)" }, children: tr("\u5DE5\u5177\u8C03\u7528\u4E0E\u547D\u4E2D\u7EDF\u8BA1\u89C1\u300C\u9065\u6D4B\u300Dtab\uFF1B[ESR] \u6CE8\u5165\u5757\u7684 escalate \u63D0\u9192\u4F9D\u636E\u771F\u5B9E\u6570\u636E\u52A8\u6001\u51FA\u73B0\u3002") }),
4052
3977
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { marginLeft: "auto", display: "inline-flex", gap: 6 }, children: [
4053
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { type: "button", style: esrGraph ? s3.tab : s3.tabActive, onClick: () => setEsrGraph(false), children: "\u5217\u8868" }),
4054
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { type: "button", style: esrGraph ? s3.tabActive : s3.tab, onClick: () => setEsrGraph(true), children: "\u56FE\u8C31" })
3978
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { type: "button", style: esrGraph ? s3.tab : s3.tabActive, onClick: () => setEsrGraph(false), children: tr("\u5217\u8868") }),
3979
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { type: "button", style: esrGraph ? s3.tabActive : s3.tab, onClick: () => setEsrGraph(true), children: tr("\u56FE\u8C31") })
4055
3980
  ] })
4056
3981
  ] }),
4057
3982
  esrGraph ? /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: s3.subPanel, children: [
4058
3983
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
4059
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { fontWeight: 700, fontSize: 13 }, children: "\u5173\u7CFB\u56FE\u8C31\uFF08esr_link \u529B\u5BFC\u5411\u56FE\uFF09" }),
3984
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { fontWeight: 700, fontSize: 13 }, children: tr("\u5173\u7CFB\u56FE\u8C31\uFF08esr_link \u529B\u5BFC\u5411\u56FE\uFF09") }),
4060
3985
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { fontSize: 11.5, fontWeight: 400, color: "var(--dsh-color-muted, #6b7280)" }, children: [
4061
- workspace === "" ? "\u5168\u90E8\u5DE5\u4F5C\u533A" : `\u5DE5\u4F5C\u533A\uFF1A${workspace}`,
4062
- " \xB7 \u5B9E\u4F53\u4E3A\u5706\u5F62\u8282\u70B9\uFF0C\u4EFB\u52A1\u4E3A\u52FE\u9009\u5FBD\u6807\uFF1B\u70B9\u9009\u8282\u70B9\u67E5\u770B\u5173\u7CFB\u660E\u7EC6"
3986
+ workspace === "" ? tr("\u5168\u90E8\u5DE5\u4F5C\u533A") : tr("\u5DE5\u4F5C\u533A\uFF1A{0}", { "0": workspace }),
3987
+ " ",
3988
+ tr(" \xB7 \u5B9E\u4F53\u4E3A\u5706\u5F62\u8282\u70B9\uFF0C\u4EFB\u52A1\u4E3A\u52FE\u9009\u5FBD\u6807\uFF1B\u70B9\u9009\u8282\u70B9\u67E5\u770B\u5173\u7CFB\u660E\u7EC6")
4063
3989
  ] })
4064
3990
  ] }),
4065
3991
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
@@ -4074,27 +4000,28 @@ ${r.m.text.slice(0, 60)}`)) void act(() => api.remove(r.m.id, r.m.workspace));
4074
4000
  )
4075
4001
  ] }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
4076
4002
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: s3.panelTitle, children: [
4077
- "ESR \u4EFB\u52A1\uFF08\u8BC1\u636E\u95ED\u73AF\uFF09",
4078
- workspace === "" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { fontSize: 12, fontWeight: 400, color: "var(--dsh-color-muted, #9ca3af)" }, children: "\xB7 \u5168\u90E8\u5DE5\u4F5C\u533A" })
4003
+ tr("ESR \u4EFB\u52A1\uFF08\u8BC1\u636E\u95ED\u73AF\uFF09"),
4004
+ workspace === "" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { fontSize: 12, fontWeight: 400, color: "var(--dsh-color-muted, #9ca3af)" }, children: tr("\xB7 \u5168\u90E8\u5DE5\u4F5C\u533A") })
4079
4005
  ] }),
4080
4006
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: s3.subPanel, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, flexWrap: "wrap" }, children: [
4081
4007
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("select", { style: s3.input, value: newTaskWs, onChange: (e) => setNewTaskWs(e.target.value), children: [
4082
4008
  workspaces.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "", children: "(no workspaces)" }),
4083
4009
  workspaces.map((ws) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: ws, children: ws }, ws))
4084
4010
  ] }),
4085
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("input", { style: { ...s3.input, width: 170 }, placeholder: "\u4EFB\u52A1\u540D\u2026", value: newTaskName, onChange: (e) => setNewTaskName(e.target.value), onKeyDown: (e) => {
4011
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("input", { style: { ...s3.input, width: 170 }, placeholder: tr("\u4EFB\u52A1\u540D\u2026"), value: newTaskName, onChange: (e) => setNewTaskName(e.target.value), onKeyDown: (e) => {
4086
4012
  if (e.key === "Enter") void createNewTask();
4087
4013
  } }),
4088
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("input", { style: { ...s3.input, width: 240 }, placeholder: "\u8981\u4EA7\u51FA / \u6EE1\u8DB3\u4EC0\u4E48\uFF08\u53EF\u9009\uFF09", value: newTaskDesc, onChange: (e) => setNewTaskDesc(e.target.value) }),
4089
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btnPrimary, disabled: newTaskBusy || newTaskName.trim() === "", onClick: () => void createNewTask(), children: newTaskBusy ? "\u2026" : "\u65B0\u5EFA\u4EFB\u52A1" })
4014
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("input", { style: { ...s3.input, width: 240 }, placeholder: tr("\u8981\u4EA7\u51FA / \u6EE1\u8DB3\u4EC0\u4E48\uFF08\u53EF\u9009\uFF09"), value: newTaskDesc, onChange: (e) => setNewTaskDesc(e.target.value) }),
4015
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btnPrimary, disabled: newTaskBusy || newTaskName.trim() === "", onClick: () => void createNewTask(), children: newTaskBusy ? "\u2026" : tr("\u65B0\u5EFA\u4EFB\u52A1") })
4090
4016
  ] }) }),
4091
- tasks.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: s3.empty, children: "\u6682\u65E0\u4EFB\u52A1 \u2014 \u7528\u4E0A\u65B9\u300C\u65B0\u5EFA\u4EFB\u52A1\u300D\u6216 esr_task \u5DE5\u5177\u521B\u5EFA" }),
4017
+ tasks.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: s3.empty, children: tr("\u6682\u65E0\u4EFB\u52A1 \u2014 \u7528\u4E0A\u65B9\u300C\u65B0\u5EFA\u4EFB\u52A1\u300D\u6216 esr_task \u5DE5\u5177\u521B\u5EFA") }),
4092
4018
  taskGroups.map(([ws, items]) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react8.Fragment, { children: [
4093
4019
  workspace === "" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: s3.groupLabel, children: [
4094
4020
  ws,
4095
4021
  " \xB7 ",
4096
4022
  items.length,
4097
- " \u4E2A\u4EFB\u52A1"
4023
+ " ",
4024
+ tr(" \u4E2A\u4EFB\u52A1")
4098
4025
  ] }),
4099
4026
  items.map((task) => {
4100
4027
  const gaps = taskGaps(task);
@@ -4116,45 +4043,42 @@ ${r.m.text.slice(0, 60)}`)) void act(() => api.remove(r.m.id, r.m.workspace));
4116
4043
  task.name,
4117
4044
  " ",
4118
4045
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { ...s3.badge, background: isStable ? "#059669" : gaps.length === 0 ? "#2563eb" : "#d97706" }, children: isStable ? "STABLE" : gaps.length === 0 ? "READY" : "ACTIVE" }),
4119
- !isStable && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btn, onClick: () => setCloseFor(closeFor === task.id ? null : task.id), children: closeFor === task.id ? "\u6536\u8D77" : "\u586B\u5199\u8BC1\u636E\u5173\u95ED\u2026" }),
4120
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.linkBtn, title: "\u5728\u4FA7\u680F\u6253\u5F00\u8BE6\u60C5", onClick: () => openTask(task.id), children: "\u8BE6\u60C5" })
4121
- ] }),
4122
- !isStable && gaps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { fontSize: 12, color: "var(--dsh-color-muted, #6b7280)", marginTop: 4 }, children: [
4123
- "\u7F3A\u53E3\uFF1A",
4124
- gaps.join(", "),
4125
- " \u2014 \u63D0\u4F9B artifact / evaluation / memory_ref \u540E\u8F6C\u4E3A STABLE"
4046
+ !isStable && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btn, onClick: () => setCloseFor(closeFor === task.id ? null : task.id), children: closeFor === task.id ? tr("\u6536\u8D77") : tr("\u586B\u5199\u8BC1\u636E\u5173\u95ED\u2026") }),
4047
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.linkBtn, title: tr("\u5728\u4FA7\u680F\u6253\u5F00\u8BE6\u60C5"), onClick: () => openTask(task.id), children: tr("\u8BE6\u60C5") })
4126
4048
  ] }),
4049
+ !isStable && gaps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { fontSize: 12, color: "var(--dsh-color-muted, #6b7280)", marginTop: 4 }, children: tr("\u7F3A\u53E3\uFF1A{0} \u2014 \u63D0\u4F9B artifact / evaluation / memory_ref \u540E\u8F6C\u4E3A STABLE", { "0": gaps.join(", ") }) }),
4127
4050
  task.description && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { fontSize: 12, color: "var(--dsh-color-muted-strong, #4b5563)", marginTop: 4 }, children: task.description }),
4128
4051
  task.memoryRefs.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { fontSize: 12, marginTop: 4 }, children: [
4129
- "\u8BB0\u5FC6\u5F15\u7528\uFF1A",
4052
+ tr("\u8BB0\u5FC6\u5F15\u7528\uFF1A"),
4130
4053
  task.memoryRefs.map((r) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: s3.tag, children: r.slice(0, 8) }, r))
4131
4054
  ] }),
4132
4055
  closeFor === task.id && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { marginTop: 8, padding: 8, border: "1px solid var(--dsh-color-border, #e5e7eb)", borderRadius: 8 }, children: [
4133
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { fontSize: 11, color: "var(--dsh-color-muted, #6b7280)", marginBottom: 6 }, children: "\u63D0\u4F9B\u8BC1\u636E\u540E\u5173\u95ED\uFF08\u4E09\u9879\u5168\u9F50\u624D\u8F6C STABLE\uFF09" }),
4056
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { fontSize: 11, color: "var(--dsh-color-muted, #6b7280)", marginBottom: 6 }, children: tr("\u63D0\u4F9B\u8BC1\u636E\u540E\u5173\u95ED\uFF08\u4E09\u9879\u5168\u9F50\u624D\u8F6C STABLE\uFF09") }),
4134
4057
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { display: "flex", gap: 6, flexWrap: "wrap", alignItems: "center" }, children: [
4135
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("input", { style: { ...s3.input, width: 150 }, placeholder: "artifact \u8DEF\u5F84/URL", value: closeArtifact, onChange: (e) => setCloseArtifact(e.target.value) }),
4136
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("input", { style: { ...s3.input, width: 150 }, placeholder: "evaluation \u9A8C\u8BC1\u8BC1\u636E", value: closeEval, onChange: (e) => setCloseEval(e.target.value) }),
4137
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("input", { style: { ...s3.input, width: 150 }, placeholder: "memory_refs \u9017\u53F7\u5206\u9694", value: closeRefs, onChange: (e) => setCloseRefs(e.target.value) }),
4138
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btnPrimary, disabled: closeBusy, onClick: () => void submitClose(task), children: closeBusy ? "\u2026" : "\u63D0\u4EA4\u5173\u95ED" }),
4139
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btn, onClick: () => setCloseFor(null), children: "\u53D6\u6D88" })
4058
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("input", { style: { ...s3.input, width: 150 }, placeholder: tr("artifact \u8DEF\u5F84/URL"), value: closeArtifact, onChange: (e) => setCloseArtifact(e.target.value) }),
4059
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("input", { style: { ...s3.input, width: 150 }, placeholder: tr("evaluation \u9A8C\u8BC1\u8BC1\u636E"), value: closeEval, onChange: (e) => setCloseEval(e.target.value) }),
4060
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("input", { style: { ...s3.input, width: 150 }, placeholder: tr("memory_refs \u9017\u53F7\u5206\u9694"), value: closeRefs, onChange: (e) => setCloseRefs(e.target.value) }),
4061
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btnPrimary, disabled: closeBusy, onClick: () => void submitClose(task), children: closeBusy ? "\u2026" : tr("\u63D0\u4EA4\u5173\u95ED") }),
4062
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: s3.btn, onClick: () => setCloseFor(null), children: tr("\u53D6\u6D88") })
4140
4063
  ] })
4141
4064
  ] })
4142
4065
  ] }, task.id);
4143
4066
  })
4144
4067
  ] }, ws)),
4145
4068
  /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: s3.panelTitle, children: [
4146
- "\u8282\u70B9\u4E0E\u5173\u7CFB\uFF08esr_node / esr_link\uFF09",
4147
- workspace === "" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { fontSize: 12, fontWeight: 400, color: "var(--dsh-color-muted, #9ca3af)" }, children: "\xB7 \u5168\u90E8\u5DE5\u4F5C\u533A" })
4069
+ tr("\u8282\u70B9\u4E0E\u5173\u7CFB\uFF08esr_node / esr_link\uFF09"),
4070
+ workspace === "" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { fontSize: 12, fontWeight: 400, color: "var(--dsh-color-muted, #9ca3af)" }, children: tr("\xB7 \u5168\u90E8\u5DE5\u4F5C\u533A") })
4148
4071
  ] }),
4149
- nodes.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: s3.empty, children: "\u6682\u65E0\u8282\u70B9 \u2014 \u6A21\u578B\u4F1A\u4E3A\u53CD\u590D\u51FA\u73B0\u7684\u9886\u57DF\u5BF9\u8C61\u4E3B\u52A8\u767B\u8BB0\uFF08esr_node\uFF09\uFF0C\u6B64\u5904\u4E5F\u53EF\u67E5\u770B\u5173\u7CFB" }),
4072
+ nodes.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: s3.empty, children: tr("\u6682\u65E0\u8282\u70B9 \u2014 \u6A21\u578B\u4F1A\u4E3A\u53CD\u590D\u51FA\u73B0\u7684\u9886\u57DF\u5BF9\u8C61\u4E3B\u52A8\u767B\u8BB0\uFF08esr_node\uFF09\uFF0C\u6B64\u5904\u4E5F\u53EF\u67E5\u770B\u5173\u7CFB") }),
4150
4073
  nodeGroups.map(([ws, items]) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react8.Fragment, { children: [
4151
4074
  workspace === "" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: s3.groupLabel, children: [
4152
4075
  ws,
4153
4076
  " \xB7 ",
4154
4077
  items.length,
4155
- " \u4E2A\u8282\u70B9"
4078
+ " ",
4079
+ tr(" \u4E2A\u8282\u70B9")
4156
4080
  ] }),
4157
- items.map((n) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { fontSize: 12.5, padding: "2px 0", cursor: "pointer", borderRadius: 6 }, title: "\u5728\u4FA7\u680F\u6253\u5F00\u8282\u70B9\u8BE6\u60C5", onClick: () => openNode(n.id), children: [
4081
+ items.map((n) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { fontSize: 12.5, padding: "2px 0", cursor: "pointer", borderRadius: 6 }, title: tr("\u5728\u4FA7\u680F\u6253\u5F00\u8282\u70B9\u8BE6\u60C5"), onClick: () => openNode(n.id), children: [
4158
4082
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "mono", style: { ...s3.mono, color: "#4338ca" }, children: n.id.slice(0, 24) }),
4159
4083
  " ",
4160
4084
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { fontWeight: 600 }, children: n.name }),
@@ -4165,16 +4089,17 @@ ${r.m.text.slice(0, 60)}`)) void act(() => api.remove(r.m.id, r.m.workspace));
4165
4089
  ] })
4166
4090
  ] }, n.id))
4167
4091
  ] }, ws)),
4168
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { fontSize: 12, color: "var(--dsh-color-muted, #6b7280)", marginTop: 6 }, children: "\u5173\u7CFB\uFF1A" }),
4169
- links.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: s3.empty, children: "\u6682\u65E0\u5173\u7CFB \u2014 esr_link \u521B\u5EFA" }),
4092
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { fontSize: 12, color: "var(--dsh-color-muted, #6b7280)", marginTop: 6 }, children: tr("\u5173\u7CFB\uFF1A") }),
4093
+ links.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: s3.empty, children: tr("\u6682\u65E0\u5173\u7CFB \u2014 esr_link \u521B\u5EFA") }),
4170
4094
  linkGroups.map(([ws, items]) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react8.Fragment, { children: [
4171
4095
  workspace === "" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: s3.groupLabel, children: [
4172
4096
  ws,
4173
4097
  " \xB7 ",
4174
4098
  items.length,
4175
- " \u6761\u5173\u7CFB"
4099
+ " ",
4100
+ tr(" \u6761\u5173\u7CFB")
4176
4101
  ] }),
4177
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: 6, marginTop: 4 }, children: items.map((l) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { ...s3.relRow, cursor: "pointer" }, title: "\u5728\u4FA7\u680F\u6253\u5F00\u5173\u7CFB\u8BE6\u60C5", onClick: () => {
4102
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: 6, marginTop: 4 }, children: items.map((l) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { ...s3.relRow, cursor: "pointer" }, title: tr("\u5728\u4FA7\u680F\u6253\u5F00\u5173\u7CFB\u8BE6\u60C5"), onClick: () => {
4178
4103
  setDetail({ kind: "link", link: l });
4179
4104
  setDetailNotice(null);
4180
4105
  }, children: [
@@ -4202,7 +4127,7 @@ ${r.m.text.slice(0, 60)}`)) void act(() => api.remove(r.m.id, r.m.workspace));
4202
4127
  }
4203
4128
  ) }),
4204
4129
  view === "telemetry" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: s3.subPanel, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(EngramTelemetry, { api, workspace }) }),
4205
- view === "config" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: s3.subPanel, children: scope ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(EngramConfigCard, { scope, defaultOpen: true }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: s3.error, children: "\u8BBE\u7F6E\u9762\u677F\u4E0D\u53EF\u7528\uFF1Ahost \u6CA1\u6709\u4E3A dsh-engram \u63D0\u4F9B\u8BBE\u7F6E\u547D\u540D\u7A7A\u95F4\uFF08\u65E7\u7248 DSH \u8D70\u300C\u63D2\u4EF6\u300D\u2192 \u914D\u7F6E tab\uFF09\u3002" }) })
4130
+ view === "config" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: s3.subPanel, children: scope ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(EngramConfigCard, { scope, defaultOpen: true }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: s3.error, children: tr("\u8BBE\u7F6E\u9762\u677F\u4E0D\u53EF\u7528\uFF1Ahost \u6CA1\u6709\u4E3A dsh-engram \u63D0\u4F9B\u8BBE\u7F6E\u547D\u540D\u7A7A\u95F4\uFF08\u65E7\u7248 DSH \u8D70\u300C\u63D2\u4EF6\u300D\u2192 \u914D\u7F6E tab\uFF09\u3002") }) })
4206
4131
  ] }),
4207
4132
  detail && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { flex: "0 0 320px", maxWidth: "38%", position: "sticky", top: 8 }, children: [
4208
4133
  detailNotice && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { fontSize: 11.5, padding: "6px 10px", marginBottom: 6, borderRadius: 8, background: "rgba(245,158,11,.14)", color: "#b45309", border: "1px solid rgba(245,158,11,.35)" }, children: detailNotice }),
@@ -4306,11 +4231,11 @@ var import_client = require("react-dom/client");
4306
4231
  // client/src/EngramBoard.tsx
4307
4232
  var import_react9 = require("react");
4308
4233
  var import_jsx_runtime9 = require("react/jsx-runtime");
4309
- var COLUMNS = [
4310
- { key: "draft", title: "\u8349\u7A3F", sub: "\u672A\u88AB\u6FC0\u6D3B", color: "#94a3b8", match: (t) => t.state === "draft" },
4311
- { key: "gapped", title: "\u8FDB\u884C\u4E2D", sub: "\u8BC1\u636E\u6709\u7F3A\u53E3", color: "#f59e0b", match: (t) => t.state === "active" && taskGaps(t).length > 0 },
4312
- { key: "ready", title: "\u5C31\u7EEA", sub: "\u8BC1\u636E\u9F50\uFF0C\u53EF\u95ED\u73AF", color: "#10b981", match: (t) => t.state === "active" && taskGaps(t).length === 0 },
4313
- { key: "stable", title: "\u5DF2\u95ED\u73AF", sub: "\u51ED\u636E\u9F50\u5907", color: "#6366f1", match: (t) => t.state === "stable" }
4234
+ var columns = () => [
4235
+ { key: "draft", title: tr("\u8349\u7A3F"), sub: tr("\u672A\u88AB\u6FC0\u6D3B"), color: "#94a3b8", match: (t) => t.state === "draft" },
4236
+ { key: "gapped", title: tr("\u8FDB\u884C\u4E2D"), sub: tr("\u8BC1\u636E\u6709\u7F3A\u53E3"), color: "#f59e0b", match: (t) => t.state === "active" && taskGaps(t).length > 0 },
4237
+ { key: "ready", title: tr("\u5C31\u7EEA"), sub: tr("\u8BC1\u636E\u9F50\uFF0C\u53EF\u95ED\u73AF"), color: "#10b981", match: (t) => t.state === "active" && taskGaps(t).length === 0 },
4238
+ { key: "stable", title: tr("\u5DF2\u95ED\u73AF"), sub: tr("\u51ED\u636E\u9F50\u5907"), color: "#6366f1", match: (t) => t.state === "stable" }
4314
4239
  ];
4315
4240
  function buildCloseEvidence(bulkArtifact, bulkEval, bulkRefs, task) {
4316
4241
  const refs = bulkRefs.split(/[,\s]+/).map((x) => x.trim()).filter(Boolean);
@@ -4320,25 +4245,32 @@ function buildCloseEvidence(bulkArtifact, bulkEval, bulkRefs, task) {
4320
4245
  memoryRefs: refs.length > 0 ? refs : task.memoryRefs
4321
4246
  };
4322
4247
  }
4323
- var TREND_LABEL = {
4324
- new: "\u65B0",
4325
- strengthening: "\u589E\u5F3A",
4326
- stable: "\u7A33\u5B9A",
4327
- weakening: "\u51CF\u5F31",
4328
- stale: "\u9648\u65E7"
4248
+ var trendLabel = (trend) => {
4249
+ switch (trend) {
4250
+ case "new":
4251
+ return tr("\u65B0");
4252
+ case "strengthening":
4253
+ return tr("\u589E\u5F3A");
4254
+ case "stable":
4255
+ return tr("\u7A33\u5B9A");
4256
+ case "weakening":
4257
+ return tr("\u51CF\u5F31");
4258
+ case "stale":
4259
+ return tr("\u9648\u65E7");
4260
+ default:
4261
+ return trend ?? "";
4262
+ }
4329
4263
  };
4330
4264
  function ContextGcChip({ compaction }) {
4331
4265
  const host = compaction?.host ?? "unknown";
4332
- const hostLabel = host === "context-gc" ? "Context GC\xB7\u4E3B\u673A" : host === "default" ? "\u9ED8\u8BA4\u6458\u8981" : host === "unavailable" ? "GC \u4E0D\u53EF\u7528" : "GC \u72B6\u6001\u2026";
4266
+ const hostLabel = host === "context-gc" ? tr("Context GC\xB7\u4E3B\u673A") : host === "default" ? tr("\u9ED8\u8BA4\u6458\u8981") : host === "unavailable" ? tr("GC \u4E0D\u53EF\u7528") : tr("GC \u72B6\u6001\u2026");
4333
4267
  const wired = (compaction?.web?.presets ?? []).filter((p) => p.action === "swapped" || p.action === "already").length;
4334
- const webLabel = wired > 0 ? `\xB7${wired} \u9884\u8BBE` : "";
4268
+ const webLabel = wired > 0 ? tr("\xB7{0} \u9884\u8BBE", { "0": wired }) : "";
4335
4269
  const color = host === "context-gc" ? "var(--dsw-alias-success-strong, #059669)" : host === "default" || host === "unavailable" ? "var(--dsw-alias-label-secondary, var(--dsh-color-muted, #6b7280))" : "var(--dsw-alias-label-tertiary, #9ca3af)";
4336
4270
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
4337
4271
  "span",
4338
4272
  {
4339
- title: `host \u5E73\u9762\uFF1A${host}
4340
- web \u5E73\u9762\uFF1A${compaction?.web?.action ?? "?"}\uFF08${wired} \u4E2A\u9884\u8BBE\u5DF2\u63A5\u7BA1\uFF09
4341
- \u5173\u6389\u81EA\u52A8\u88C5\u914D\u89C1\u8BBE\u7F6E\u5361\u300Cweb \u9762\u81EA\u52A8\u542F\u7528 Context GC\u300D\uFF1B\u8FD8\u539F\u7528 npx dsh-engram revert`,
4273
+ title: tr("host \u5E73\u9762\uFF1A{0}\nweb \u5E73\u9762\uFF1A{1}\uFF08{2} \u4E2A\u9884\u8BBE\u5DF2\u63A5\u7BA1\uFF09\n\u5173\u6389\u81EA\u52A8\u88C5\u914D\u89C1\u8BBE\u7F6E\u5361\u300Cweb \u9762\u81EA\u52A8\u542F\u7528 Context GC\u300D\uFF1B\u8FD8\u539F\u7528 npx dsh-engram revert", { "0": host, "1": compaction?.web?.action ?? "?", "2": wired }),
4342
4274
  style: { fontSize: 11, fontWeight: 600, color, border: `1px solid ${color}55`, borderRadius: 999, padding: "2px 8px", whiteSpace: "nowrap" },
4343
4275
  children: [
4344
4276
  hostLabel,
@@ -4473,7 +4405,7 @@ function EngramBoard({ api, onRequestClose }) {
4473
4405
  }, [allTasks, ws, q]);
4474
4406
  const columnCounts = (0, import_react9.useMemo)(() => {
4475
4407
  const counts = {};
4476
- for (const col of COLUMNS) counts[col.key] = filtered.filter(col.match).length;
4408
+ for (const col of columns()) counts[col.key] = filtered.filter(col.match).length;
4477
4409
  counts.all = filtered.length;
4478
4410
  return counts;
4479
4411
  }, [filtered]);
@@ -4522,7 +4454,7 @@ function EngramBoard({ api, onRequestClose }) {
4522
4454
  fail += 1;
4523
4455
  }
4524
4456
  }
4525
- setBulkMsg(ok > 0 ? `\u6279\u91CF\u5B8C\u6210\uFF1A${ok} \u4E2A\u4EFB\u52A1\u5DF2\u95ED\u73AF${fail > 0 ? ` \xB7 ${fail} \u4E2A\u672A\u8FBE\u8BC1\u636E\u95E8\uFF08\u89C1\u5355\u5361\u8868\u5355\u8865\uFF09` : ""}` : `\u672A\u95ED\u73AF\uFF1A${fail} \u4E2A\u672A\u8FBE\u8BC1\u636E\u95E8\uFF08\u89C1\u5355\u5361\u8868\u5355\u8865\uFF09`);
4457
+ setBulkMsg(ok > 0 ? tr("\u6279\u91CF\u5B8C\u6210\uFF1A{0} \u4E2A\u4EFB\u52A1\u5DF2\u95ED\u73AF{1}", { "0": ok, "1": fail > 0 ? tr(" \xB7 {0} \u4E2A\u672A\u8FBE\u8BC1\u636E\u95E8\uFF08\u89C1\u5355\u5361\u8868\u5355\u8865\uFF09", { "0": fail }) : "" }) : tr("\u672A\u95ED\u73AF\uFF1A{0} \u4E2A\u672A\u8FBE\u8BC1\u636E\u95E8\uFF08\u89C1\u5355\u5361\u8868\u5355\u8865\uFF09", { "0": fail }));
4526
4458
  setBulkBusy(false);
4527
4459
  setSelectedIds(/* @__PURE__ */ new Set());
4528
4460
  setBulkOpen(false);
@@ -4549,7 +4481,7 @@ function EngramBoard({ api, onRequestClose }) {
4549
4481
  const refs = closeRefs.split(/[,\s]+/).map((x) => x.trim()).filter(Boolean);
4550
4482
  const res = await api.closeTask(t.workspace, t.id, { artifact: closeArtifact, evaluation: closeEval, memoryRefs: refs });
4551
4483
  if (res.state === "active") {
4552
- setError(`\u8BC1\u636E\u4ECD\u6709\u7F3A\u53E3\uFF1A${(res.gaps ?? []).join(", ") || "\u2014"}${res.artifactReason ? `\uFF08${res.artifactReason}\uFF09` : ""} \u2014 \u4EFB\u52A1\u4FDD\u6301 ACTIVE`);
4484
+ setError(tr("\u8BC1\u636E\u4ECD\u6709\u7F3A\u53E3\uFF1A{0}{1} \u2014 \u4EFB\u52A1\u4FDD\u6301 ACTIVE", { "0": (res.gaps ?? []).join(", ") || "\u2014", "1": res.artifactReason ? `\uFF08${res.artifactReason}\uFF09` : "" }));
4553
4485
  return;
4554
4486
  }
4555
4487
  setClosingFor(null);
@@ -4570,112 +4502,92 @@ function EngramBoard({ api, onRequestClose }) {
4570
4502
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("rect", { x: "2", y: "2.5", width: "12", height: "11", rx: "2.5", stroke: "currentColor", strokeWidth: "1.3" }),
4571
4503
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("path", { d: "M5.2 8.1l1.8 1.8 3.8-4", stroke: "currentColor", strokeWidth: "1.4", strokeLinecap: "round", strokeLinejoin: "round" })
4572
4504
  ] }),
4573
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.title, children: "ESR \u4EFB\u52A1\u770B\u677F" }),
4574
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.sub, children: "draft \u2192 active(\u8BC1\u636E) \u2192 stable \xB7 \u8DE8\u5DE5\u4F5C\u533A \xB7 \u4E0E esr_task/esr_close \u540C\u4E00\u8BC1\u636E\u95E8" }),
4575
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.legendChip, children: "\u4EC5 ESR \xB7 \u4F1A\u8BDD\u5185 todo \u89C1\u8F93\u5165\u6846\u4E0A\u65B9\u4EFB\u52A1\u6761" }),
4505
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.title, children: tr("ESR \u4EFB\u52A1\u770B\u677F") }),
4506
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.sub, children: tr("draft \u2192 active(\u8BC1\u636E) \u2192 stable \xB7 \u8DE8\u5DE5\u4F5C\u533A \xB7 \u4E0E esr_task/esr_close \u540C\u4E00\u8BC1\u636E\u95E8") }),
4507
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.legendChip, children: tr("\u4EC5 ESR \xB7 \u4F1A\u8BDD\u5185 todo \u89C1\u8F93\u5165\u6846\u4E0A\u65B9\u4EFB\u52A1\u6761") }),
4576
4508
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(ContextGcChip, { compaction: overview?.compaction }),
4577
4509
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: hb.seg, children: [
4578
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: viewMode === "board" ? hb.segActive : hb.segBtn, onClick: () => setViewMode("board"), title: "\u56DB\u5217\u4EFB\u52A1\u770B\u677F", children: "\u770B\u677F" }),
4579
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: viewMode === "graph" ? hb.segActive : hb.segBtn, onClick: () => setViewMode("graph"), title: "\u5B9E\u4F53\u5173\u7CFB\u56FE\u8C31\uFF08esr_node / esr_link\uFF09", children: "\u56FE\u8C31" })
4510
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: viewMode === "board" ? hb.segActive : hb.segBtn, onClick: () => setViewMode("board"), title: tr("\u56DB\u5217\u4EFB\u52A1\u770B\u677F"), children: tr("\u770B\u677F") }),
4511
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: viewMode === "graph" ? hb.segActive : hb.segBtn, onClick: () => setViewMode("graph"), title: tr("\u5B9E\u4F53\u5173\u7CFB\u56FE\u8C31\uFF08esr_node / esr_link\uFF09"), children: tr("\u56FE\u8C31") })
4580
4512
  ] }),
4581
4513
  loading && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.loading, children: "\u2026" }),
4582
4514
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { flex: "1 1 auto" } }),
4583
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { display: "inline-flex", alignItems: "center", gap: 6 }, title: `\u8BC1\u636E\u5B8C\u5907\u5EA6 ${Math.round(evidenceGauge.frac * 100)}% \xB7 ${evidenceGauge.ready}/${evidenceGauge.active} \u4E2A\u8FDB\u884C\u4E2D\u4EFB\u52A1\u8BC1\u636E\u9F50 \xB7 ${evidenceGauge.stable} \u5DF2\u95ED\u73AF`, children: [
4515
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { display: "inline-flex", alignItems: "center", gap: 6 }, title: tr("\u8BC1\u636E\u5B8C\u5907\u5EA6 {0}% \xB7 {1}/{2} \u4E2A\u8FDB\u884C\u4E2D\u4EFB\u52A1\u8BC1\u636E\u9F50 \xB7 {3} \u5DF2\u95ED\u73AF", { "0": Math.round(evidenceGauge.frac * 100), "1": evidenceGauge.ready, "2": evidenceGauge.active, "3": evidenceGauge.stable }), children: [
4584
4516
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(EvidenceRing, { artifact: false, evaluation: false, refs: false, size: 30, showLabel: false, fraction: evidenceGauge.frac }),
4585
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { fontSize: 11.5, color: "var(--dsw-alias-label-secondary, var(--dsh-color-muted, #6b7280))", fontWeight: 600 }, children: evidenceGauge.active === 0 ? "\u65E0\u8FDB\u884C\u4E2D" : `${evidenceGauge.ready} \u5C31\u7EEA \xB7 \u5B8C\u5907 ${Math.round(evidenceGauge.frac * 100)}%` })
4517
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { fontSize: 11.5, color: "var(--dsw-alias-label-secondary, var(--dsh-color-muted, #6b7280))", fontWeight: 600 }, children: evidenceGauge.active === 0 ? tr("\u65E0\u8FDB\u884C\u4E2D") : tr("{0} \u5C31\u7EEA \xB7 \u5B8C\u5907 {1}%", { "0": evidenceGauge.ready, "1": Math.round(evidenceGauge.frac * 100) }) })
4586
4518
  ] }),
4587
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("select", { style: hb.select, value: ws, onChange: (e) => setWs(e.target.value), title: "\u5DE5\u4F5C\u533A\u7B5B\u9009", children: [
4588
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("option", { value: "", children: [
4589
- "\u5168\u90E8\u5DE5\u4F5C\u533A \xB7 ",
4590
- totalActive,
4591
- " \u8FDB\u884C\u4E2D"
4592
- ] }),
4519
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("select", { style: hb.select, value: ws, onChange: (e) => setWs(e.target.value), title: tr("\u5DE5\u4F5C\u533A\u7B5B\u9009"), children: [
4520
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("option", { value: "", children: tr("\u5168\u90E8\u5DE5\u4F5C\u533A \xB7 {0} \u8FDB\u884C\u4E2D", { "0": totalActive }) }),
4593
4521
  workspaces.map(([w, c]) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("option", { value: w, children: [
4594
4522
  w.replace(/^.*[\\/]/, ""),
4595
4523
  " \xB7 ",
4596
4524
  c.tasks,
4597
- " \u8FDB\u884C\u4E2D"
4525
+ " ",
4526
+ tr(" \u8FDB\u884C\u4E2D")
4598
4527
  ] }, w))
4599
4528
  ] }),
4600
4529
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
4601
4530
  "input",
4602
4531
  {
4603
4532
  style: { ...hb.input, width: 170 },
4604
- placeholder: "\u641C\u7D22\u4EFB\u52A1\u2026",
4533
+ placeholder: tr("\u641C\u7D22\u4EFB\u52A1\u2026"),
4605
4534
  value: q,
4606
4535
  onChange: (e) => setQ(e.target.value)
4607
4536
  }
4608
4537
  ),
4609
4538
  viewMode === "board" && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
4610
- selectedIds.size > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("button", { type: "button", style: { ...hb.btn, background: "var(--dsw-alias-state-business-tertiary, rgba(99,102,241,.12))" }, onClick: () => {
4539
+ selectedIds.size > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: { ...hb.btn, background: "var(--dsw-alias-state-business-tertiary, rgba(99,102,241,.12))" }, onClick: () => {
4611
4540
  setBulkOpen(true);
4612
4541
  setCreating(false);
4613
- }, children: [
4614
- "\u6279\u91CF\u95ED\u73AF\uFF08",
4615
- selectedIds.size,
4616
- "\uFF09"
4617
- ] }),
4618
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.btn, onClick: exportMd, title: "\u5BFC\u51FA\u5F53\u524D\u7B5B\u9009\u4E3A markdown", children: "\u5BFC\u51FA" }),
4542
+ }, children: tr("\u6279\u91CF\u95ED\u73AF\uFF08{0}\uFF09", { "0": selectedIds.size }) }),
4543
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.btn, onClick: exportMd, title: tr("\u5BFC\u51FA\u5F53\u524D\u7B5B\u9009\u4E3A markdown"), children: tr("\u5BFC\u51FA") }),
4619
4544
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.btn, onClick: () => {
4620
4545
  setCreating((v) => !v);
4621
4546
  setClosingFor(null);
4622
- }, children: "\uFF0B \u65B0\u5EFA" })
4547
+ }, children: tr("\uFF0B \u65B0\u5EFA") })
4623
4548
  ] }),
4624
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.btn, onClick: () => void refresh(), disabled: loading, title: "\u5237\u65B0", children: "\u5237\u65B0" }),
4625
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.close, onClick: onRequestClose, "aria-label": "\u5173\u95ED\u770B\u677F", children: "\u2715" })
4549
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.btn, onClick: () => void refresh(), disabled: loading, title: tr("\u5237\u65B0"), children: tr("\u5237\u65B0") }),
4550
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.close, onClick: onRequestClose, "aria-label": tr("\u5173\u95ED\u770B\u677F"), children: "\u2715" })
4626
4551
  ] }) }),
4627
4552
  viewMode === "board" ? /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
4628
4553
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: hb.partition, children: [
4629
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.partitionTag, children: "\u539F\u751F todo \xB7 \u4F1A\u8BDD\u5185" }),
4554
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.partitionTag, children: tr("\u539F\u751F todo \xB7 \u4F1A\u8BDD\u5185") }),
4630
4555
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
4631
- "\u7531 todo_write \u9A71\u52A8\uFF0C\u968F\u4F1A\u8BDD\u7ED3\u675F\uFF0C\u4E0D\u8DE8\u4F1A\u8BDD\u4FDD\u7559\uFF1B\u8981\u957F\u671F\u6C89\u6DC0\u7684\u591A\u6B65\u5DE5\u4F5C\uFF0C\u8BF7\u7528",
4632
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("strong", { children: " esr_task / \u672C\u677F\u300C\u65B0\u5EFA\u300D" }),
4633
- "\u5EFA\u4E3A ESR \u4EFB\u52A1\uFF08",
4634
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.partitionTagEsr, children: "ESR \xB7 \u8DE8\u4F1A\u8BDD\u95ED\u73AF" }),
4635
- "\uFF09\uFF0C\u95ED\u73AF\uFF08artifact + evaluation + memory_refs \u8BC1\u636E\u95E8\uFF09\u540E\u8FDB [ENGRAM]\u3002"
4556
+ tr("\u7531 todo_write \u9A71\u52A8\uFF0C\u968F\u4F1A\u8BDD\u7ED3\u675F\uFF0C\u4E0D\u8DE8\u4F1A\u8BDD\u4FDD\u7559\uFF1B\u8981\u957F\u671F\u6C89\u6DC0\u7684\u591A\u6B65\u5DE5\u4F5C\uFF0C\u8BF7\u7528"),
4557
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("strong", { children: [
4558
+ " ",
4559
+ tr(" esr_task / \u672C\u677F\u300C\u65B0\u5EFA\u300D")
4560
+ ] }),
4561
+ tr("\u5EFA\u4E3A ESR \u4EFB\u52A1\uFF08"),
4562
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.partitionTagEsr, children: tr("ESR \xB7 \u8DE8\u4F1A\u8BDD\u95ED\u73AF") }),
4563
+ tr("\uFF09\uFF0C\u95ED\u73AF\uFF08artifact + evaluation + memory_refs \u8BC1\u636E\u95E8\uFF09\u540E\u8FDB [ENGRAM]\u3002")
4636
4564
  ] })
4637
4565
  ] }),
4638
4566
  showModelHint && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: hb.modelHint, children: [
4639
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.partitionTagEsr, children: "\u5B9E\u4F53\u5EFA\u6A21" }),
4567
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.partitionTagEsr, children: tr("\u5B9E\u4F53\u5EFA\u6A21") }),
4640
4568
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
4641
- "\u8BE5\u8303\u56F4\u8FD8\u6CA1\u6709\u5B9E\u4F53\u56FE \u2014 \u7528 ",
4569
+ tr("\u8BE5\u8303\u56F4\u8FD8\u6CA1\u6709\u5B9E\u4F53\u56FE \u2014 \u7528 "),
4642
4570
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("strong", { children: "esr_node" }),
4643
- " \u5EFA\u6A21\u53CD\u590D\u51FA\u73B0\u7684\u9886\u57DF\u5BF9\u8C61\uFF08\u5305/\u670D\u52A1/\u6587\u6863/\u6982\u5FF5\uFF09\uFF0C \u518D\u7528 ",
4571
+ " ",
4572
+ tr(" \u5EFA\u6A21\u53CD\u590D\u51FA\u73B0\u7684\u9886\u57DF\u5BF9\u8C61\uFF08\u5305/\u670D\u52A1/\u6587\u6863/\u6982\u5FF5\uFF09\uFF0C \u518D\u7528 "),
4644
4573
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("strong", { children: "esr_link" }),
4645
- " \u5173\u8054\u5230\u4EFB\u52A1\u4E0E\u8282\u70B9\uFF0C\u4E0A\u65B9\u5207\u5230\u300C\u56FE\u8C31\u300D\u5373\u53EF\u67E5\u770B\u5B8C\u6574\u5B9E\u4F53\u5173\u7CFB\u56FE\u3002"
4574
+ " ",
4575
+ tr(" \u5173\u8054\u5230\u4EFB\u52A1\u4E0E\u8282\u70B9\uFF0C\u4E0A\u65B9\u5207\u5230\u300C\u56FE\u8C31\u300D\u5373\u53EF\u67E5\u770B\u5B8C\u6574\u5B9E\u4F53\u5173\u7CFB\u56FE\u3002")
4646
4576
  ] })
4647
4577
  ] }),
4648
4578
  model && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: hb.obsBar, children: [
4649
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("button", { type: "button", style: hb.obsHead, onClick: () => setModelOpen((v) => !v), "aria-expanded": modelOpen, "aria-label": "\u5207\u6362\u5E38\u9A7B\u6458\u8981", children: [
4650
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: hb.partitionTagEsr, children: [
4651
- "\u5E38\u9A7B\u6458\u8981 \xB7 ",
4652
- String(model.ws || "\u5168\u90E8\u5DE5\u4F5C\u533A").replace(/^.*[\\/]/, "") || "\u5168\u90E8"
4653
- ] }),
4654
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: hb.obsMeta, children: [
4655
- "\u751F\u6210\u4E8E ",
4656
- Math.max(0, Math.floor((Date.now() - model.generated_at) / 6e4)),
4657
- " \u5206\u949F\u524D ",
4658
- modelOpen ? "\u25BE" : "\u25B8"
4659
- ] })
4579
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("button", { type: "button", style: hb.obsHead, onClick: () => setModelOpen((v) => !v), "aria-expanded": modelOpen, "aria-label": tr("\u5207\u6362\u5E38\u9A7B\u6458\u8981"), children: [
4580
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.partitionTagEsr, children: tr("\u5E38\u9A7B\u6458\u8981 \xB7 {0}", { "0": String(model.ws || tr("\u5168\u90E8\u5DE5\u4F5C\u533A")).replace(/^.*[\\/]/, "") || tr("\u5168\u90E8") }) }),
4581
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.obsMeta, children: tr("\u751F\u6210\u4E8E {0} \u5206\u949F\u524D {1}", { "0": Math.max(0, Math.floor((Date.now() - model.generated_at) / 6e4)), "1": modelOpen ? "\u25BE" : "\u25B8" }) })
4660
4582
  ] }),
4661
4583
  modelOpen && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { ...hb.obsBody, whiteSpace: "pre-wrap", fontFamily: "monospace", fontSize: 11, lineHeight: "16px" }, children: model.content })
4662
4584
  ] }),
4663
4585
  obsItems && obsItems.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: hb.obsBar, children: [
4664
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("button", { type: "button", style: hb.obsHead, onClick: () => setObsOpen((v) => !v), "aria-expanded": obsOpen, "aria-label": "\u5207\u6362\u89C2\u6D4B\u5217\u8868", children: [
4665
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: hb.partitionTagEsr, children: [
4666
- "\u89C2\u6D4B \xB7 \u4FE1\u5FF5 ",
4667
- obsItems.length
4668
- ] }),
4669
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: hb.obsMeta, children: [
4670
- "\u7D2F\u8BA1 ",
4671
- obsItems.reduce((sum, o) => sum + (o.proof?.count ?? 0), 0),
4672
- " \u6761\u8BC1\u636E \xB7 ",
4673
- TREND_LABEL[obsItems[0]?.trend ?? "new"],
4674
- " ",
4675
- obsOpen ? "\u25BE" : "\u25B8"
4676
- ] })
4586
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("button", { type: "button", style: hb.obsHead, onClick: () => setObsOpen((v) => !v), "aria-expanded": obsOpen, "aria-label": tr("\u5207\u6362\u89C2\u6D4B\u5217\u8868"), children: [
4587
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.partitionTagEsr, children: tr("\u89C2\u6D4B \xB7 \u4FE1\u5FF5 {0}", { "0": obsItems.length }) }),
4588
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.obsMeta, children: tr("\u7D2F\u8BA1 {0} \u6761\u8BC1\u636E \xB7 {1} {2}", { "0": obsItems.reduce((sum, o) => sum + (o.proof?.count ?? 0), 0), "1": trendLabel(obsItems[0]?.trend ?? "new"), "2": obsOpen ? "\u25BE" : "\u25B8" }) })
4677
4589
  ] }),
4678
- obsOpen && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: hb.obsBody, children: obsItems.slice(0, 20).map((o) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: hb.obsRow, title: `\u8BC1\u636E ${o.proof.count} \u6761\uFF1A${(o.proof.sources ?? []).join(", ")}`, children: [
4590
+ obsOpen && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: hb.obsBody, children: obsItems.slice(0, 20).map((o) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: hb.obsRow, title: tr("\u8BC1\u636E {0} \u6761\uFF1A{1}", { "0": o.proof.count, "1": (o.proof.sources ?? []).join(", ") }), children: [
4679
4591
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
4680
4592
  (o.negations ?? 0) > 0 ? "\xAC " : "",
4681
4593
  o.text
@@ -4684,49 +4596,45 @@ function EngramBoard({ api, onRequestClose }) {
4684
4596
  "\xD7",
4685
4597
  o.proof.count,
4686
4598
  " \xB7 ",
4687
- TREND_LABEL[o.trend] ?? o.trend,
4688
- (o.negations ?? 0) > 0 ? ` \xB7 \u53CD\u8BC1${o.negations}` : ""
4599
+ trendLabel(o.trend),
4600
+ (o.negations ?? 0) > 0 ? tr(" \xB7 \u53CD\u8BC1{0}", { "0": o.negations }) : ""
4689
4601
  ] })
4690
4602
  ] }, o.id)) })
4691
4603
  ] }),
4692
4604
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { padding: "0 14px" }, children: [
4693
- denied && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: hb.warn, children: "ESR \u770B\u677F\u6570\u636E\u4E0D\u53EF\u8FBE\uFF08loopback-only \u5B88\u536B\uFF09\u2014 \u4EFB\u52A1/\u5173\u7CFB\u5C06\u65E0\u6CD5\u52A0\u8F7D\uFF1B\u8BF7\u901A\u8FC7\u672C\u673A\u8BBF\u95EE GUI\uFF0C\u6216\u653E\u5165\u53D7\u4FE1\u7F51\u7EDC\u8BBF\u95EE\u3002" }),
4605
+ denied && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: hb.warn, children: tr("ESR \u770B\u677F\u6570\u636E\u4E0D\u53EF\u8FBE\uFF08loopback-only \u5B88\u536B\uFF09\u2014 \u4EFB\u52A1/\u5173\u7CFB\u5C06\u65E0\u6CD5\u52A0\u8F7D\uFF1B\u8BF7\u901A\u8FC7\u672C\u673A\u8BBF\u95EE GUI\uFF0C\u6216\u653E\u5165\u53D7\u4FE1\u7F51\u7EDC\u8BBF\u95EE\u3002") }),
4694
4606
  error && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: hb.error, children: [
4695
4607
  "\u26A0 ",
4696
4608
  error
4697
4609
  ] }),
4698
4610
  creating && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: hb.createForm, children: [
4699
4611
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("select", { style: hb.select, value: newWs, onChange: (e) => setNewWs(e.target.value), children: [
4700
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("option", { value: "", children: "\u9009\u62E9\u5DE5\u4F5C\u533A\u2026" }),
4612
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("option", { value: "", children: tr("\u9009\u62E9\u5DE5\u4F5C\u533A\u2026") }),
4701
4613
  workspaces.map(([w]) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("option", { value: w, children: w.replace(/^.*[\\/]/, "") }, w))
4702
4614
  ] }),
4703
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("input", { style: { ...hb.input, flex: "1 1 200px" }, placeholder: "\u4EFB\u52A1\u540D\u2026", value: newName, onChange: (e) => setNewName(e.target.value), onKeyDown: (e) => {
4615
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("input", { style: { ...hb.input, flex: "1 1 200px" }, placeholder: tr("\u4EFB\u52A1\u540D\u2026"), value: newName, onChange: (e) => setNewName(e.target.value), onKeyDown: (e) => {
4704
4616
  if (e.key === "Enter") void submitCreate();
4705
4617
  }, autoFocus: true }),
4706
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("input", { style: { ...hb.input, flex: "1 1 240px" }, placeholder: "\u8981\u4EA7\u51FA / \u6EE1\u8DB3\u4EC0\u4E48\uFF08\u53EF\u9009\uFF09", value: newDesc, onChange: (e) => setNewDesc(e.target.value) }),
4707
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.btnSolid, disabled: busy || !newName.trim() || !(newWs || workspaces.length > 0), onClick: () => void submitCreate(), children: busy ? "\u2026" : "\u521B\u5EFA" }),
4708
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.btn, onClick: () => setCreating(false), children: "\u53D6\u6D88" })
4618
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("input", { style: { ...hb.input, flex: "1 1 240px" }, placeholder: tr("\u8981\u4EA7\u51FA / \u6EE1\u8DB3\u4EC0\u4E48\uFF08\u53EF\u9009\uFF09"), value: newDesc, onChange: (e) => setNewDesc(e.target.value) }),
4619
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.btnSolid, disabled: busy || !newName.trim() || !(newWs || workspaces.length > 0), onClick: () => void submitCreate(), children: busy ? "\u2026" : tr("\u521B\u5EFA") }),
4620
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.btn, onClick: () => setCreating(false), children: tr("\u53D6\u6D88") })
4709
4621
  ] }),
4710
4622
  bulkOpen && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: hb.createForm, children: [
4711
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { fontSize: 11, color: "var(--dsw-alias-label-tertiary, var(--dsh-color-muted, #6b7280))" }, children: [
4712
- "\u6279\u91CF\u95ED\u73AF ",
4713
- selectedIds.size,
4714
- " \u4E2A\u4EFB\u52A1 \u2014 \u4E09\u9879\u8BC1\u636E\u5E94\u7528\u5230\u6240\u6709\u9009\u4E2D\u9879\uFF08\u5355\u5361\u5DF2\u6709\u7684\u8BC1\u636E\u81EA\u52A8\u4FDD\u7559\uFF09"
4715
- ] }),
4716
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("input", { style: hb.input, placeholder: "\u4EA7\u7269 artifact\uFF08\u6587\u4EF6/PR/\u8DEF\u5F84\uFF09", value: bulkArtifact, onChange: (e) => setBulkArtifact(e.target.value) }),
4717
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("input", { style: hb.input, placeholder: "\u8BC4\u4F30 evaluation\uFF08\u6D4B\u8BD5/\u8BC4\u5BA1/\u5206\u6570\uFF09", value: bulkEval, onChange: (e) => setBulkEval(e.target.value) }),
4718
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("input", { style: hb.input, placeholder: "\u8BB0\u5FC6\u5F15\u7528 memory_refs\uFF08#id, \u9017\u53F7\u5206\u9694\uFF09", value: bulkRefs, onChange: (e) => setBulkRefs(e.target.value) }),
4719
- bulkMsg && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { fontSize: 11, color: bulkMsg.startsWith("\u6279\u91CF\u5B8C\u6210") ? "#059669" : "#b45309" }, children: bulkMsg }),
4623
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { fontSize: 11, color: "var(--dsw-alias-label-tertiary, var(--dsh-color-muted, #6b7280))" }, children: tr("\u6279\u91CF\u95ED\u73AF {0} \u4E2A\u4EFB\u52A1 \u2014 \u4E09\u9879\u8BC1\u636E\u5E94\u7528\u5230\u6240\u6709\u9009\u4E2D\u9879\uFF08\u5355\u5361\u5DF2\u6709\u7684\u8BC1\u636E\u81EA\u52A8\u4FDD\u7559\uFF09", { "0": selectedIds.size }) }),
4624
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("input", { style: hb.input, placeholder: tr("\u4EA7\u7269 artifact\uFF08\u6587\u4EF6/PR/\u8DEF\u5F84\uFF09"), value: bulkArtifact, onChange: (e) => setBulkArtifact(e.target.value) }),
4625
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("input", { style: hb.input, placeholder: tr("\u8BC4\u4F30 evaluation\uFF08\u6D4B\u8BD5/\u8BC4\u5BA1/\u5206\u6570\uFF09"), value: bulkEval, onChange: (e) => setBulkEval(e.target.value) }),
4626
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("input", { style: hb.input, placeholder: tr("\u8BB0\u5FC6\u5F15\u7528 memory_refs\uFF08#id, \u9017\u53F7\u5206\u9694\uFF09"), value: bulkRefs, onChange: (e) => setBulkRefs(e.target.value) }),
4627
+ bulkMsg && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { fontSize: 11, color: bulkMsg.startsWith(tr("\u6279\u91CF\u5B8C\u6210")) ? "#059669" : "#b45309" }, children: bulkMsg }),
4720
4628
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { display: "flex", gap: 6 }, children: [
4721
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.btnSolid, disabled: bulkBusy || selectedIds.size === 0, onClick: () => void closeSelected(), children: bulkBusy ? "\u2026" : "\u6309\u8BC1\u636E\u6279\u91CF\u95ED\u73AF" }),
4629
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.btnSolid, disabled: bulkBusy || selectedIds.size === 0, onClick: () => void closeSelected(), children: bulkBusy ? "\u2026" : tr("\u6309\u8BC1\u636E\u6279\u91CF\u95ED\u73AF") }),
4722
4630
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.btn, onClick: () => {
4723
4631
  setBulkOpen(false);
4724
4632
  setBulkMsg(null);
4725
- }, children: "\u53D6\u6D88" })
4633
+ }, children: tr("\u53D6\u6D88") })
4726
4634
  ] })
4727
4635
  ] })
4728
4636
  ] }),
4729
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: hb.columns, children: COLUMNS.map((col) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { "data-col": col.key, style: { ...hb.column, borderTop: `2px solid ${col.color}` }, children: [
4637
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: hb.columns, children: columns().map((col) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { "data-col": col.key, style: { ...hb.column, borderTop: `2px solid ${col.color}` }, children: [
4730
4638
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: hb.colHead, children: [
4731
4639
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { fontWeight: 700, fontSize: 12.5 }, children: col.title }),
4732
4640
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { ...hb.count, color: col.color, background: `${col.color}1f` }, children: columnCounts[col.key] })
@@ -4739,7 +4647,7 @@ function EngramBoard({ api, onRequestClose }) {
4739
4647
  "input",
4740
4648
  {
4741
4649
  type: "checkbox",
4742
- "aria-label": `\u9009\u62E9 ${t.name}`,
4650
+ "aria-label": tr("\u9009\u62E9 {0}", { "0": t.name }),
4743
4651
  checked: selectedIds.has(t.id),
4744
4652
  disabled: col.key === "stable" || col.key === "draft",
4745
4653
  onChange: () => toggleSelect(t.id),
@@ -4749,7 +4657,7 @@ function EngramBoard({ api, onRequestClose }) {
4749
4657
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { ...hb.state, background: col.color }, children: col.key === "stable" ? "\u2713" : "\u25CF" }),
4750
4658
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
4751
4659
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { fontWeight: 600, fontSize: 12.5, lineHeight: "17px", overflowWrap: "anywhere" }, children: t.name }),
4752
- t.summary && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: hb.compacted, title: "\u5DF2\u538B\u7F29 \xB7 \u539F\u6587\u4FDD\u7559\u5728\u5FEB\u7167\u4E2D\uFF08\u53EF\u56DE\u770B\uFF09", children: [
4660
+ t.summary && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: hb.compacted, title: tr("\u5DF2\u538B\u7F29 \xB7 \u539F\u6587\u4FDD\u7559\u5728\u5FEB\u7167\u4E2D\uFF08\u53EF\u56DE\u770B\uFF09"), children: [
4753
4661
  "\u{1F5DC} ",
4754
4662
  t.summary
4755
4663
  ] }),
@@ -4766,7 +4674,7 @@ function EngramBoard({ api, onRequestClose }) {
4766
4674
  ),
4767
4675
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.meta, children: shortId(t.id) }),
4768
4676
  ws === "" && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: hb.meta, children: t.workspace.replace(/^.*[\\/]/, "") }),
4769
- blockedBy(t, allTasks) > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: hb.lock, title: `\u88AB ${blockedBy(t, allTasks)} \u4E2A\u672A\u95ED\u73AF\u4EFB\u52A1\u963B\u585E\uFF0C\u5148\u5B8C\u6210\u5B83\u4EEC\u7684 deps`, children: [
4677
+ blockedBy(t, allTasks) > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: hb.lock, title: tr("\u88AB {0} \u4E2A\u672A\u95ED\u73AF\u4EFB\u52A1\u963B\u585E\uFF0C\u5148\u5B8C\u6210\u5B83\u4EEC\u7684 deps", { "0": blockedBy(t, allTasks) }), children: [
4770
4678
  "\u{1F512} ",
4771
4679
  blockedBy(t, allTasks)
4772
4680
  ] }),
@@ -4790,45 +4698,47 @@ function EngramBoard({ api, onRequestClose }) {
4790
4698
  ] })
4791
4699
  ] })
4792
4700
  ] }),
4793
- col.key === "draft" && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: hb.cardHint, children: "\u8349\u7A3F \xB7 \u7528 esr_task \u53EF\u5C06\u5176\u63A8\u8FDB\u4E3A active" }),
4701
+ col.key === "draft" && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: hb.cardHint, children: tr("\u8349\u7A3F \xB7 \u7528 esr_task \u53EF\u5C06\u5176\u63A8\u8FDB\u4E3A active") }),
4794
4702
  (col.key === "gapped" || col.key === "ready") && closingFor === t.id ? /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { ...hb.closeForm, borderColor: col.color }, children: [
4795
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("input", { style: hb.input, placeholder: "\u4EA7\u7269 artifact\uFF08\u6587\u4EF6/PR/\u8DEF\uFF09", value: closeArtifact, onChange: (e) => setCloseArtifact(e.target.value) }),
4796
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("input", { style: hb.input, placeholder: "\u8BC4\u4F30 evaluation\uFF08\u6D4B\u8BD5/\u8BC4\u5BA1/\u5206\u6570\uFF09", value: closeEval, onChange: (e) => setCloseEval(e.target.value) }),
4797
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("input", { style: hb.input, placeholder: "\u8BB0\u5FC6\u5F15\u7528 memory_refs\uFF08#id, \u9017\u53F7\u5206\u9694\uFF09", value: closeRefs, onChange: (e) => setCloseRefs(e.target.value) }),
4703
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("input", { style: hb.input, placeholder: tr("\u4EA7\u7269 artifact\uFF08\u6587\u4EF6/PR/\u8DEF\uFF09"), value: closeArtifact, onChange: (e) => setCloseArtifact(e.target.value) }),
4704
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("input", { style: hb.input, placeholder: tr("\u8BC4\u4F30 evaluation\uFF08\u6D4B\u8BD5/\u8BC4\u5BA1/\u5206\u6570\uFF09"), value: closeEval, onChange: (e) => setCloseEval(e.target.value) }),
4705
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("input", { style: hb.input, placeholder: tr("\u8BB0\u5FC6\u5F15\u7528 memory_refs\uFF08#id, \u9017\u53F7\u5206\u9694\uFF09"), value: closeRefs, onChange: (e) => setCloseRefs(e.target.value) }),
4798
4706
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { display: "flex", gap: 6 }, children: [
4799
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.btnSolid, disabled: busy, onClick: () => void submitClose(t), children: busy ? "\u2026" : "\u6309\u8BC1\u636E\u95ED\u73AF" }),
4800
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.btn, onClick: () => setClosingFor(null), children: "\u53D6\u6D88" })
4707
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.btnSolid, disabled: busy, onClick: () => void submitClose(t), children: busy ? "\u2026" : tr("\u6309\u8BC1\u636E\u95ED\u73AF") }),
4708
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.btn, onClick: () => setClosingFor(null), children: tr("\u53D6\u6D88") })
4801
4709
  ] })
4802
4710
  ] }) : (col.key === "gapped" || col.key === "ready") && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", style: hb.advance, onClick: () => {
4803
4711
  setClosingFor(t.id);
4804
- }, children: "\u8865\u9F50\u8BC1\u636E \u2192 \u5173\u95ED" })
4712
+ }, children: tr("\u8865\u9F50\u8BC1\u636E \u2192 \u5173\u95ED") })
4805
4713
  ] }, t.id)),
4806
4714
  filtered.filter(col.match).length > 20 && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: hb.more, children: [
4807
4715
  "+",
4808
4716
  filtered.filter(col.match).length - 20,
4809
- " \u66F4\u591A\u2026"
4717
+ " ",
4718
+ tr(" \u66F4\u591A\u2026")
4810
4719
  ] }),
4811
- filtered.filter(col.match).length === 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: hb.empty, children: col.key === "stable" ? "\u8FD8\u6CA1\u6709\u95ED\u73AF\u4EFB\u52A1" : "\u6682\u65E0\u4EFB\u52A1" })
4720
+ filtered.filter(col.match).length === 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: hb.empty, children: col.key === "stable" ? tr("\u8FD8\u6CA1\u6709\u95ED\u73AF\u4EFB\u52A1") : tr("\u6682\u65E0\u4EFB\u52A1") })
4812
4721
  ] })
4813
4722
  ] }, col.key)) })
4814
4723
  ] }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: hb.graphWrap, children: [
4815
- denied && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: hb.warn, children: "ESR \u770B\u677F\u6570\u636E\u4E0D\u53EF\u8FBE\uFF08loopback-only \u5B88\u536B\uFF09\u2014 \u4EFB\u52A1/\u5173\u7CFB/\u56FE\u8C31\u5C06\u65E0\u6CD5\u52A0\u8F7D\uFF1B\u8BF7\u901A\u8FC7\u672C\u673A\u8BBF\u95EE GUI\uFF0C\u6216\u653E\u5165\u53D7\u4FE1\u7F51\u7EDC\u8BBF\u95EE\u3002" }),
4724
+ denied && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: hb.warn, children: tr("ESR \u770B\u677F\u6570\u636E\u4E0D\u53EF\u8FBE\uFF08loopback-only \u5B88\u536B\uFF09\u2014 \u4EFB\u52A1/\u5173\u7CFB/\u56FE\u8C31\u5C06\u65E0\u6CD5\u52A0\u8F7D\uFF1B\u8BF7\u901A\u8FC7\u672C\u673A\u8BBF\u95EE GUI\uFF0C\u6216\u653E\u5165\u53D7\u4FE1\u7F51\u7EDC\u8BBF\u95EE\u3002") }),
4816
4725
  error && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: hb.error, children: [
4817
4726
  "\u26A0 ",
4818
4727
  error
4819
4728
  ] }),
4820
4729
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: hb.graphPanel, children: [
4821
4730
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: hb.graphHead, children: [
4822
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { fontWeight: 700, fontSize: 13 }, children: "\u5173\u7CFB\u56FE\u8C31\uFF08esr_node / esr_link \u529B\u5BFC\u5411\u56FE\uFF09" }),
4731
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { fontWeight: 700, fontSize: 13 }, children: tr("\u5173\u7CFB\u56FE\u8C31\uFF08esr_node / esr_link \u529B\u5BFC\u5411\u56FE\uFF09") }),
4823
4732
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { fontSize: 11.5, fontWeight: 400, color: "var(--dsw-alias-label-tertiary, var(--dsh-color-muted, #6b7280))" }, children: [
4824
- ws === "" ? "\u5168\u90E8\u5DE5\u4F5C\u533A" : ws.replace(/^.*[\\/]/, ""),
4825
- " \xB7 \u5B9E\u4F53\u4E3A\u5706\u5F62\u8282\u70B9\uFF0C\u4EFB\u52A1\u4E3A\u52FE\u9009\u5FBD\u6807\uFF1B\u70B9\u9009\u8282\u70B9\u67E5\u770B\u5173\u7CFB\u660E\u7EC6"
4733
+ ws === "" ? tr("\u5168\u90E8\u5DE5\u4F5C\u533A") : ws.replace(/^.*[\\/]/, ""),
4734
+ " ",
4735
+ tr(" \xB7 \u5B9E\u4F53\u4E3A\u5706\u5F62\u8282\u70B9\uFF0C\u4EFB\u52A1\u4E3A\u52FE\u9009\u5FBD\u6807\uFF1B\u70B9\u9009\u8282\u70B9\u67E5\u770B\u5173\u7CFB\u660E\u7EC6")
4826
4736
  ] })
4827
4737
  ] }),
4828
4738
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(EngramGraph, { workspace: ws, entities: allNodes, tasks: allTasks, links: allLinks, nameOf })
4829
4739
  ] })
4830
4740
  ] }),
4831
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: hb.footer, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: viewMode === "board" ? `${columnCounts.all} \u4E2A\u4EFB\u52A1\uFF08\u5F53\u524D\u7B5B\u9009\uFF09\xB7 \u6BCF 20s \u81EA\u52A8\u5237\u65B0 \xB7 \u6570\u636E\u6E90 ~/.dsh/storages/dsh_engram.json` : `${allNodes.length} \u4E2A\u5B9E\u4F53 \xB7 ${allLinks.length} \u6761\u5173\u7CFB \xB7 ${allTasks.length} \u4E2A\u4EFB\u52A1 \xB7 \u6BCF 20s \u81EA\u52A8\u5237\u65B0 \xB7 \u6570\u636E\u6E90 ~/.dsh/storages/dsh_engram.json` }) })
4741
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: hb.footer, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: viewMode === "board" ? tr("{0} \u4E2A\u4EFB\u52A1\uFF08\u5F53\u524D\u7B5B\u9009\uFF09\xB7 \u6BCF 20s \u81EA\u52A8\u5237\u65B0 \xB7 \u6570\u636E\u6E90 ~/.dsh/storages/dsh_engram.json", { "0": columnCounts.all }) : tr("{0} \u4E2A\u5B9E\u4F53 \xB7 {1} \u6761\u5173\u7CFB \xB7 {2} \u4E2A\u4EFB\u52A1 \xB7 \u6BCF 20s \u81EA\u52A8\u5237\u65B0 \xB7 \u6570\u636E\u6E90 ~/.dsh/storages/dsh_engram.json", { "0": allNodes.length, "1": allLinks.length, "2": allTasks.length }) }) })
4832
4742
  ] });
4833
4743
  }
4834
4744
  var hb = {
@@ -5205,7 +5115,7 @@ function newSessionButton(root) {
5205
5115
  function centerColumn() {
5206
5116
  return document.querySelector(CENTER_COLUMN_SELECTOR) ?? void 0;
5207
5117
  }
5208
- function mountEngramBoard(api) {
5118
+ function mountEngramBoard(api, subscribeLocale) {
5209
5119
  ensureBoardStyles();
5210
5120
  if (typeof document === "undefined") return () => {
5211
5121
  };
@@ -5214,6 +5124,7 @@ function mountEngramBoard(api) {
5214
5124
  let container;
5215
5125
  let entry;
5216
5126
  let boardUnmounted = false;
5127
+ let lastTotal = 0;
5217
5128
  const close = () => {
5218
5129
  if (!open) return;
5219
5130
  open = false;
@@ -5227,12 +5138,13 @@ function mountEngramBoard(api) {
5227
5138
  document.dispatchEvent(new CustomEvent(ACTIVATE_EVENT, { detail: PANEL_NAME }));
5228
5139
  };
5229
5140
  const toggle = () => open ? close() : openPanel();
5141
+ const entryLabel = () => tr("ESR \u770B\u677F");
5230
5142
  const createEntryRow = () => {
5231
5143
  const row = document.createElement("button");
5232
5144
  row.type = "button";
5233
5145
  row.dataset.dshEngramEntry = "";
5234
- row.setAttribute("aria-label", "ESR \u770B\u677F");
5235
- row.innerHTML = `<span style="display:inline-flex;flex:0 0 auto;color:var(--dsw-alias-label-primary-bluish,#4338ca);">${ICON}</span><span class="engram-entry-label">ESR \u770B\u677F</span><span class="engram-entry-badge">0</span>`;
5146
+ row.setAttribute("aria-label", entryLabel());
5147
+ row.innerHTML = `<span style="display:inline-flex;flex:0 0 auto;color:var(--dsw-alias-label-primary-bluish,#4338ca);">${ICON}</span><span class="engram-entry-label"></span><span class="engram-entry-badge">0</span>`;
5236
5148
  row.addEventListener("click", (e) => {
5237
5149
  e.stopPropagation();
5238
5150
  toggle();
@@ -5240,6 +5152,14 @@ function mountEngramBoard(api) {
5240
5152
  return row;
5241
5153
  };
5242
5154
  entry = createEntryRow();
5155
+ const refreshEntryText = () => {
5156
+ if (entry === void 0) return;
5157
+ entry.setAttribute("aria-label", entryLabel());
5158
+ const label = entry.querySelector(".engram-entry-label");
5159
+ if (label !== null) label.textContent = entryLabel();
5160
+ entry.title = tr("ESR \u770B\u677F \xB7 {0} \u4E2A\u8FDB\u884C\u4E2D\u4EFB\u52A1", { "0": lastTotal });
5161
+ };
5162
+ refreshEntryText();
5243
5163
  const placeEntry = (rootEl) => {
5244
5164
  const button = newSessionButton(rootEl);
5245
5165
  if (button === void 0) return false;
@@ -5282,12 +5202,12 @@ function mountEngramBoard(api) {
5282
5202
  if (!entry || !entry.isConnected) return;
5283
5203
  try {
5284
5204
  const ov = await api.overview();
5285
- const total = Object.values(ov.workspaces).reduce((a, w) => a + (w.tasks ?? 0), 0);
5205
+ lastTotal = Object.values(ov.workspaces).reduce((a, w) => a + (w.tasks ?? 0), 0);
5286
5206
  const badge = entry.querySelector(".engram-entry-badge");
5287
5207
  if (badge) {
5288
- badge.textContent = String(total);
5289
- entry.toggleAttribute("data-dsh-engram-idle", total === 0);
5290
- entry.title = `ESR \u770B\u677F \xB7 ${total} \u4E2A\u8FDB\u884C\u4E2D\u4EFB\u52A1`;
5208
+ badge.textContent = String(lastTotal);
5209
+ entry.toggleAttribute("data-dsh-engram-idle", lastTotal === 0);
5210
+ entry.title = tr("ESR \u770B\u677F \xB7 {0} \u4E2A\u8FDB\u884C\u4E2D\u4EFB\u52A1", { "0": lastTotal });
5291
5211
  }
5292
5212
  } catch {
5293
5213
  entry.toggleAttribute("data-dsh-engram-idle", true);
@@ -5303,11 +5223,18 @@ function mountEngramBoard(api) {
5303
5223
  container.dataset.dshEngramBoard = "";
5304
5224
  column.appendChild(container);
5305
5225
  root = (0, import_client.createRoot)(container);
5306
- root.render(/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(EngramBoard, { api, onRequestClose: close }));
5226
+ renderBoard();
5227
+ };
5228
+ const renderBoard = () => {
5229
+ root?.render(/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(EngramBoard, { api, onRequestClose: close }));
5307
5230
  };
5308
5231
  const boardWatcher = new MutationObserver(() => ensureContainer());
5309
5232
  boardWatcher.observe(document.body, { childList: true, subtree: true });
5310
5233
  ensureContainer();
5234
+ const offLocale = subscribeLocale?.(() => {
5235
+ refreshEntryText();
5236
+ renderBoard();
5237
+ });
5311
5238
  const onOtherActivate = (event) => {
5312
5239
  if (event.detail !== PANEL_NAME && open) close();
5313
5240
  };
@@ -5320,6 +5247,7 @@ function mountEngramBoard(api) {
5320
5247
  document.addEventListener("click", onClickSidebarRow, true);
5321
5248
  return () => {
5322
5249
  boardUnmounted = true;
5250
+ offLocale?.();
5323
5251
  window.clearInterval(badgeTimer);
5324
5252
  bodyObserver.disconnect();
5325
5253
  boardWatcher.disconnect();
@@ -5335,6 +5263,467 @@ function mountEngramBoard(api) {
5335
5263
  };
5336
5264
  }
5337
5265
 
5266
+ // client/src/i18n/ru.ts
5267
+ var ru = {
5268
+ "nav": "\u041F\u0430\u043C\u044F\u0442\u044C Engram",
5269
+ "refresh": "\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C",
5270
+ "error": "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C",
5271
+ "\u8349\u7A3F": "\u0427\u0435\u0440\u043D\u043E\u0432\u0438\u043A",
5272
+ "\u672A\u88AB\u6FC0\u6D3B": "\u041D\u0435 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D\u0430",
5273
+ "\u8FDB\u884C\u4E2D": "\u0412 \u0440\u0430\u0431\u043E\u0442\u0435",
5274
+ "\u8BC1\u636E\u6709\u7F3A\u53E3": "\u041D\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432",
5275
+ "\u5C31\u7EEA": "\u0413\u043E\u0442\u043E\u0432\u0430",
5276
+ "\u8BC1\u636E\u9F50\uFF0C\u53EF\u95ED\u73AF": "\u0414\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430 \u0441\u043E\u0431\u0440\u0430\u043D\u044B",
5277
+ "\u5DF2\u95ED\u73AF": "\u0417\u0430\u043A\u0440\u044B\u0442\u0430",
5278
+ "\u51ED\u636E\u9F50\u5907": "\u0412\u0441\u0435 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430",
5279
+ "\u65B0": "\u041D\u043E\u0432\u043E\u0435",
5280
+ "\u589E\u5F3A": "\u0423\u0441\u0438\u043B\u0438\u0432\u0430\u0435\u0442\u0441\u044F",
5281
+ "\u7A33\u5B9A": "\u0421\u0442\u0430\u0431\u0438\u043B\u044C\u043D\u043E",
5282
+ "\u51CF\u5F31": "\u041E\u0441\u043B\u0430\u0431\u0435\u0432\u0430\u0435\u0442",
5283
+ "\u9648\u65E7": "\u0423\u0441\u0442\u0430\u0440\u0435\u043B\u043E",
5284
+ "Context GC\xB7\u4E3B\u673A": "Context GC \xB7 \u0445\u043E\u0441\u0442",
5285
+ "\u9ED8\u8BA4\u6458\u8981": "\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u043E\u0435 \u0440\u0435\u0437\u044E\u043C\u0435",
5286
+ "GC \u4E0D\u53EF\u7528": "GC \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D",
5287
+ "GC \u72B6\u6001\u2026": "\u0421\u0442\u0430\u0442\u0443\u0441 GC\u2026",
5288
+ "\xB7{0} \u9884\u8BBE": "\xB7{0} \u043F\u0440\u0435\u0441\u0435\u0442\u043E\u0432",
5289
+ "host \u5E73\u9762\uFF1A{0}\nweb \u5E73\u9762\uFF1A{1}\uFF08{2} \u4E2A\u9884\u8BBE\u5DF2\u63A5\u7BA1\uFF09\n\u5173\u6389\u81EA\u52A8\u88C5\u914D\u89C1\u8BBE\u7F6E\u5361\u300Cweb \u9762\u81EA\u52A8\u542F\u7528 Context GC\u300D\uFF1B\u8FD8\u539F\u7528 npx dsh-engram revert": "\u041F\u043B\u043E\u0441\u043A\u043E\u0441\u0442\u044C host: {0}\n\u041F\u043B\u043E\u0441\u043A\u043E\u0441\u0442\u044C web: {1} ({2} \u043F\u0440\u0435\u0441\u0435\u0442\u043E\u0432 \u043F\u0435\u0440\u0435\u0445\u0432\u0430\u0447\u0435\u043D\u043E)\n\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0430\u0432\u0442\u043E\u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u2014 \u0432 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A \xAB\u0410\u0432\u0442\u043E\u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 Context GC \u043D\u0430 web-\u043F\u043B\u043E\u0441\u043A\u043E\u0441\u0442\u0438\xBB; \u043E\u0442\u043A\u0430\u0442: npx dsh-engram revert",
5290
+ "\u6279\u91CF\u5B8C\u6210\uFF1A{0} \u4E2A\u4EFB\u52A1\u5DF2\u95ED\u73AF{1}": "\u041C\u0430\u0441\u0441\u043E\u0432\u043E\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u0435: \u0437\u0430\u043A\u0440\u044B\u0442\u043E \u0437\u0430\u0434\u0430\u0447 \u2014 {0}{1}",
5291
+ " \xB7 {0} \u4E2A\u672A\u8FBE\u8BC1\u636E\u95E8\uFF08\u89C1\u5355\u5361\u8868\u5355\u8865\uFF09": " \xB7 \u043D\u0435 \u043F\u0440\u043E\u0448\u043B\u0438 \u0432\u043E\u0440\u043E\u0442\u0430 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432: {0} (\u0434\u043E\u0437\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u0432 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435)",
5292
+ "\u672A\u95ED\u73AF\uFF1A{0} \u4E2A\u672A\u8FBE\u8BC1\u636E\u95E8\uFF08\u89C1\u5355\u5361\u8868\u5355\u8865\uFF09": "\u041D\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u043E: {0} \u043D\u0435 \u043F\u0440\u043E\u0448\u043B\u0438 \u0432\u043E\u0440\u043E\u0442\u0430 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432 (\u0434\u043E\u0437\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u0432 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435)",
5293
+ "\u8BC1\u636E\u4ECD\u6709\u7F3A\u53E3\uFF1A{0}{1} \u2014 \u4EFB\u52A1\u4FDD\u6301 ACTIVE": "\u0414\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432 \u0432\u0441\u0451 \u0435\u0449\u0451 \u043D\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442: {0}{1} \u2014 \u0437\u0430\u0434\u0430\u0447\u0430 \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F ACTIVE",
5294
+ "ESR \u4EFB\u52A1\u770B\u677F": "\u0414\u043E\u0441\u043A\u0430 \u0437\u0430\u0434\u0430\u0447 ESR",
5295
+ "draft \u2192 active(\u8BC1\u636E) \u2192 stable \xB7 \u8DE8\u5DE5\u4F5C\u533A \xB7 \u4E0E esr_task/esr_close \u540C\u4E00\u8BC1\u636E\u95E8": "draft \u2192 active (\u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430) \u2192 stable \xB7 \u043C\u0435\u0436\u0434\u0443 \u0440\u0430\u0431\u043E\u0447\u0438\u043C\u0438 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430\u043C\u0438 \xB7 \u0442\u0435 \u0436\u0435 \u0432\u043E\u0440\u043E\u0442\u0430 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432, \u0447\u0442\u043E \u0443 esr_task/esr_close",
5296
+ "\u4EC5 ESR \xB7 \u4F1A\u8BDD\u5185 todo \u89C1\u8F93\u5165\u6846\u4E0A\u65B9\u4EFB\u52A1\u6761": "\u0422\u043E\u043B\u044C\u043A\u043E ESR \xB7 todo \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u2014 \u0432 \u043F\u043E\u043B\u043E\u0441\u0435 \u043D\u0430\u0434 \u043F\u043E\u043B\u0435\u043C \u0432\u0432\u043E\u0434\u0430",
5297
+ "\u56DB\u5217\u4EFB\u52A1\u770B\u677F": "\u0414\u043E\u0441\u043A\u0430 \u0437\u0430\u0434\u0430\u0447 \u0432 \u0447\u0435\u0442\u044B\u0440\u0435 \u043A\u043E\u043B\u043E\u043D\u043A\u0438",
5298
+ "\u770B\u677F": "\u0414\u043E\u0441\u043A\u0430",
5299
+ "\u5B9E\u4F53\u5173\u7CFB\u56FE\u8C31\uFF08esr_node / esr_link\uFF09": "\u0413\u0440\u0430\u0444 \u0441\u0432\u044F\u0437\u0435\u0439 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439 (esr_node / esr_link)",
5300
+ "\u56FE\u8C31": "\u0413\u0440\u0430\u0444",
5301
+ "\u8BC1\u636E\u5B8C\u5907\u5EA6 {0}% \xB7 {1}/{2} \u4E2A\u8FDB\u884C\u4E2D\u4EFB\u52A1\u8BC1\u636E\u9F50 \xB7 {3} \u5DF2\u95ED\u73AF": "\u0413\u043E\u0442\u043E\u0432\u043D\u043E\u0441\u0442\u044C \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432 {0}% \xB7 {1}/{2} \u0437\u0430\u0434\u0430\u0447 \u0432 \u0440\u0430\u0431\u043E\u0442\u0435 \u0441 \u043F\u043E\u043B\u043D\u044B\u043C\u0438 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430\u043C\u0438 \xB7 \u0437\u0430\u043A\u0440\u044B\u0442\u043E: {3}",
5302
+ "\u65E0\u8FDB\u884C\u4E2D": "\u041D\u0435\u0442 \u0437\u0430\u0434\u0430\u0447 \u0432 \u0440\u0430\u0431\u043E\u0442\u0435",
5303
+ "{0} \u5C31\u7EEA \xB7 \u5B8C\u5907 {1}%": "{0} \u0433\u043E\u0442\u043E\u0432\u044B \xB7 \u043F\u043E\u043B\u043D\u043E\u0442\u0430 {1}%",
5304
+ "\u5DE5\u4F5C\u533A\u7B5B\u9009": "\u0424\u0438\u043B\u044C\u0442\u0440 \u043F\u043E \u0440\u0430\u0431\u043E\u0447\u0435\u043C\u0443 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0443",
5305
+ "\u5168\u90E8\u5DE5\u4F5C\u533A \xB7 {0} \u8FDB\u884C\u4E2D": "\u0412\u0441\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430 \xB7 {0} \u0432 \u0440\u0430\u0431\u043E\u0442\u0435",
5306
+ " \u8FDB\u884C\u4E2D": " \u0432 \u0440\u0430\u0431\u043E\u0442\u0435",
5307
+ "\u641C\u7D22\u4EFB\u52A1\u2026": "\u041F\u043E\u0438\u0441\u043A \u0437\u0430\u0434\u0430\u0447\u2026",
5308
+ "\u6279\u91CF\u95ED\u73AF\uFF08{0}\uFF09": "\u041C\u0430\u0441\u0441\u043E\u0432\u043E\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u0435 ({0})",
5309
+ "\u5BFC\u51FA\u5F53\u524D\u7B5B\u9009\u4E3A markdown": "\u042D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u0444\u0438\u043B\u044C\u0442\u0440 \u0432 Markdown",
5310
+ "\u5BFC\u51FA": "\u042D\u043A\u0441\u043F\u043E\u0440\u0442",
5311
+ "\uFF0B \u65B0\u5EFA": "\uFF0B \u0421\u043E\u0437\u0434\u0430\u0442\u044C",
5312
+ "\u5237\u65B0": "\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C",
5313
+ "\u5173\u95ED\u770B\u677F": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0434\u043E\u0441\u043A\u0443",
5314
+ "\u539F\u751F todo \xB7 \u4F1A\u8BDD\u5185": "\u0420\u043E\u0434\u043D\u043E\u0439 todo \xB7 \u0432 \u0441\u0435\u0441\u0441\u0438\u0438",
5315
+ "\u7531 todo_write \u9A71\u52A8\uFF0C\u968F\u4F1A\u8BDD\u7ED3\u675F\uFF0C\u4E0D\u8DE8\u4F1A\u8BDD\u4FDD\u7559\uFF1B\u8981\u957F\u671F\u6C89\u6DC0\u7684\u591A\u6B65\u5DE5\u4F5C\uFF0C\u8BF7\u7528": "\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F todo_write, \u0436\u0438\u0432\u0451\u0442 \u0434\u043E \u043A\u043E\u043D\u0446\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 \u0438 \u043D\u0435 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442\u0441\u044F \u043C\u0435\u0436\u0434\u0443 \u0441\u0435\u0441\u0441\u0438\u044F\u043C\u0438. \u0414\u043B\u044F \u043C\u043D\u043E\u0433\u043E\u0448\u0430\u0433\u043E\u0432\u043E\u0439 \u0440\u0430\u0431\u043E\u0442\u044B, \u043A\u043E\u0442\u043E\u0440\u0443\u044E \u043D\u0443\u0436\u043D\u043E \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 ",
5316
+ " esr_task / \u672C\u677F\u300C\u65B0\u5EFA\u300D": " esr_task \u0438\u043B\u0438 \u043A\u043D\u043E\u043F\u043A\u0443 \xAB\u0421\u043E\u0437\u0434\u0430\u0442\u044C\xBB \u043D\u0430 \u0434\u043E\u0441\u043A\u0435",
5317
+ "\u5EFA\u4E3A ESR \u4EFB\u52A1\uFF08": ", \u0447\u0442\u043E\u0431\u044B \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0437\u0430\u0434\u0430\u0447\u0443 ESR (",
5318
+ "ESR \xB7 \u8DE8\u4F1A\u8BDD\u95ED\u73AF": "\u043A\u0440\u043E\u0441\u0441-\u0441\u0435\u0441\u0441\u0438\u043E\u043D\u043D\u043E\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u0435",
5319
+ "\uFF09\uFF0C\u95ED\u73AF\uFF08artifact + evaluation + memory_refs \u8BC1\u636E\u95E8\uFF09\u540E\u8FDB [ENGRAM]\u3002": "). \u041F\u043E\u0441\u043B\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u044F (\u0432\u043E\u0440\u043E\u0442\u0430: artifact + evaluation + memory_refs) \u043E\u043D\u0430 \u043F\u043E\u043F\u0430\u0434\u0451\u0442 \u0432 [ENGRAM].",
5320
+ "\u5B9E\u4F53\u5EFA\u6A21": "\u041C\u043E\u0434\u0435\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439",
5321
+ "\u8BE5\u8303\u56F4\u8FD8\u6CA1\u6709\u5B9E\u4F53\u56FE \u2014 \u7528 ": "\u0412 \u044D\u0442\u043E\u0439 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u0435\u0449\u0451 \u043D\u0435\u0442 \u0433\u0440\u0430\u0444\u0430 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439 \u2014 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 ",
5322
+ " \u5EFA\u6A21\u53CD\u590D\u51FA\u73B0\u7684\u9886\u57DF\u5BF9\u8C61\uFF08\u5305/\u670D\u52A1/\u6587\u6863/\u6982\u5FF5\uFF09\uFF0C \u518D\u7528 ": ", \u0447\u0442\u043E\u0431\u044B \u0441\u043C\u043E\u0434\u0435\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u044E\u0449\u0438\u0435\u0441\u044F \u043E\u0431\u044A\u0435\u043A\u0442\u044B (\u043F\u0430\u043A\u0435\u0442\u044B/\u0441\u0435\u0440\u0432\u0438\u0441\u044B/\u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u044B/\u043A\u043E\u043D\u0446\u0435\u043F\u0446\u0438\u0438), \u0437\u0430\u0442\u0435\u043C ",
5323
+ " \u5173\u8054\u5230\u4EFB\u52A1\u4E0E\u8282\u70B9\uFF0C\u4E0A\u65B9\u5207\u5230\u300C\u56FE\u8C31\u300D\u5373\u53EF\u67E5\u770B\u5B8C\u6574\u5B9E\u4F53\u5173\u7CFB\u56FE\u3002": " \u0441\u0432\u044F\u0436\u0438\u0442\u0435 \u0438\u0445 \u0441 \u0437\u0430\u0434\u0430\u0447\u0430\u043C\u0438 \u0438 \u0443\u0437\u043B\u0430\u043C\u0438 \u0438 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u0435\u0441\u044C \u043D\u0430 \xAB\u0413\u0440\u0430\u0444\xBB \u0432\u044B\u0448\u0435 \u2014 \u0442\u0430\u043C \u043F\u043E\u043B\u043D\u044B\u0439 \u0433\u0440\u0430\u0444 \u0441\u0432\u044F\u0437\u0435\u0439.",
5324
+ "\u5207\u6362\u5E38\u9A7B\u6458\u8981": "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u043E\u0441\u0442\u043E\u044F\u043D\u043D\u0443\u044E \u0441\u0432\u043E\u0434\u043A\u0443",
5325
+ "\u5E38\u9A7B\u6458\u8981 \xB7 {0}": "\u041F\u043E\u0441\u0442\u043E\u044F\u043D\u043D\u0430\u044F \u0441\u0432\u043E\u0434\u043A\u0430 \xB7 {0}",
5326
+ "\u5168\u90E8\u5DE5\u4F5C\u533A": "\u0412\u0441\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430",
5327
+ "\u5168\u90E8": "\u0412\u0441\u0435",
5328
+ "\u751F\u6210\u4E8E {0} \u5206\u949F\u524D {1}": "\u0421\u043E\u0437\u0434\u0430\u043D\u043E {0} \u043C\u0438\u043D \u043D\u0430\u0437\u0430\u0434 {1}",
5329
+ "\u5207\u6362\u89C2\u6D4B\u5217\u8868": "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0441\u043F\u0438\u0441\u043E\u043A \u043D\u0430\u0431\u043B\u044E\u0434\u0435\u043D\u0438\u0439",
5330
+ "\u89C2\u6D4B \xB7 \u4FE1\u5FF5 {0}": "\u041D\u0430\u0431\u043B\u044E\u0434\u0435\u043D\u0438\u044F \xB7 \u0443\u0431\u0435\u0436\u0434\u0435\u043D\u0438\u044F {0}",
5331
+ "\u7D2F\u8BA1 {0} \u6761\u8BC1\u636E \xB7 {1} {2}": "\u0412\u0441\u0435\u0433\u043E \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432: {0} \xB7 {1} {2}",
5332
+ "\u8BC1\u636E {0} \u6761\uFF1A{1}": "\u0414\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432: {0} \u2014 {1}",
5333
+ " \xB7 \u53CD\u8BC1{0}": " \xB7 \u043A\u043E\u043D\u0442\u0440\u0434\u043E\u0432\u043E\u0434\u043E\u0432: {0}",
5334
+ "ESR \u770B\u677F\u6570\u636E\u4E0D\u53EF\u8FBE\uFF08loopback-only \u5B88\u536B\uFF09\u2014 \u4EFB\u52A1/\u5173\u7CFB\u5C06\u65E0\u6CD5\u52A0\u8F7D\uFF1B\u8BF7\u901A\u8FC7\u672C\u673A\u8BBF\u95EE GUI\uFF0C\u6216\u653E\u5165\u53D7\u4FE1\u7F51\u7EDC\u8BBF\u95EE\u3002": "\u0414\u0430\u043D\u043D\u044B\u0435 \u0434\u043E\u0441\u043A\u0438 ESR \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B (\u0437\u0430\u0449\u0438\u0442\u0430 loopback-only) \u2014 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0441\u0432\u044F\u0437\u0438 \u043D\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u044F\u0442\u0441\u044F; \u043E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 GUI \u0441 \u044D\u0442\u043E\u0439 \u043C\u0430\u0448\u0438\u043D\u044B \u0438\u043B\u0438 \u0434\u043E\u0431\u0430\u0432\u044C\u0442\u0435 \u0445\u043E\u0441\u0442 \u0432 \u0434\u043E\u0432\u0435\u0440\u0435\u043D\u043D\u044B\u0435.",
5335
+ "\u9009\u62E9\u5DE5\u4F5C\u533A\u2026": "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0430\u0431\u043E\u0447\u0435\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E\u2026",
5336
+ "\u4EFB\u52A1\u540D\u2026": "\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438\u2026",
5337
+ "\u8981\u4EA7\u51FA / \u6EE1\u8DB3\u4EC0\u4E48\uFF08\u53EF\u9009\uFF09": "\u0427\u0442\u043E \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u0441\u043E\u0437\u0434\u0430\u043D\u043E / \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u043E (\u043D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E)",
5338
+ "\u521B\u5EFA": "\u0421\u043E\u0437\u0434\u0430\u0442\u044C",
5339
+ "\u53D6\u6D88": "\u041E\u0442\u043C\u0435\u043D\u0430",
5340
+ "\u6279\u91CF\u95ED\u73AF {0} \u4E2A\u4EFB\u52A1 \u2014 \u4E09\u9879\u8BC1\u636E\u5E94\u7528\u5230\u6240\u6709\u9009\u4E2D\u9879\uFF08\u5355\u5361\u5DF2\u6709\u7684\u8BC1\u636E\u81EA\u52A8\u4FDD\u7559\uFF09": "\u041C\u0430\u0441\u0441\u043E\u0432\u043E\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u0435: {0} \u0437\u0430\u0434\u0430\u0447 \u2014 \u0442\u0440\u0438 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0442\u0441\u044F \u043A\u043E \u0432\u0441\u0435\u043C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u043C (\u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u043D\u044B\u0435 \u0432 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u0441\u044F)",
5341
+ "\u4EA7\u7269 artifact\uFF08\u6587\u4EF6/PR/\u8DEF\u5F84\uFF09": "\u0410\u0440\u0442\u0435\u0444\u0430\u043A\u0442 artifact (\u0444\u0430\u0439\u043B/PR/\u043F\u0443\u0442\u044C)",
5342
+ "\u8BC4\u4F30 evaluation\uFF08\u6D4B\u8BD5/\u8BC4\u5BA1/\u5206\u6570\uFF09": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 evaluation (\u0442\u0435\u0441\u0442\u044B/\u0440\u0435\u0432\u044C\u044E/\u043E\u0446\u0435\u043D\u043A\u0430)",
5343
+ "\u8BB0\u5FC6\u5F15\u7528 memory_refs\uFF08#id, \u9017\u53F7\u5206\u9694\uFF09": "\u0421\u0441\u044B\u043B\u043A\u0438 \u043D\u0430 \u043F\u0430\u043C\u044F\u0442\u044C memory_refs (#id \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043F\u044F\u0442\u0443\u044E)",
5344
+ "\u6279\u91CF\u5B8C\u6210": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0432\u0441\u0435",
5345
+ "\u6309\u8BC1\u636E\u6279\u91CF\u95ED\u73AF": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0432\u0441\u0435 \u0441 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430\u043C\u0438",
5346
+ "\u9009\u62E9 {0}": "\u0412\u044B\u0431\u0440\u0430\u0442\u044C {0}",
5347
+ "\u5DF2\u538B\u7F29 \xB7 \u539F\u6587\u4FDD\u7559\u5728\u5FEB\u7167\u4E2D\uFF08\u53EF\u56DE\u770B\uFF09": "\u0421\u0436\u0430\u0442\u043E \xB7 \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D \u0432 \u0441\u043D\u0438\u043C\u043A\u0435 (\u043C\u043E\u0436\u043D\u043E \u043E\u0442\u043A\u0440\u044B\u0442\u044C)",
5348
+ "\u88AB {0} \u4E2A\u672A\u95ED\u73AF\u4EFB\u52A1\u963B\u585E\uFF0C\u5148\u5B8C\u6210\u5B83\u4EEC\u7684 deps": "\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043E \u043D\u0435\u0437\u0430\u043A\u0440\u044B\u0442\u044B\u043C\u0438 \u0437\u0430\u0434\u0430\u0447\u0430\u043C\u0438: {0} \u2014 \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0437\u0430\u043A\u0440\u043E\u0439\u0442\u0435 \u0438\u0445 deps",
5349
+ "\u8349\u7A3F \xB7 \u7528 esr_task \u53EF\u5C06\u5176\u63A8\u8FDB\u4E3A active": "\u0427\u0435\u0440\u043D\u043E\u0432\u0438\u043A \xB7 esr_task \u043F\u0435\u0440\u0435\u0432\u0435\u0434\u0451\u0442 \u0435\u0451 \u0432 active",
5350
+ "\u4EA7\u7269 artifact\uFF08\u6587\u4EF6/PR/\u8DEF\uFF09": "\u0410\u0440\u0442\u0435\u0444\u0430\u043A\u0442 artifact (\u0444\u0430\u0439\u043B/PR/\u043F\u0443\u0442\u044C)",
5351
+ "\u6309\u8BC1\u636E\u95ED\u73AF": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0441 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430\u043C\u0438",
5352
+ "\u8865\u9F50\u8BC1\u636E \u2192 \u5173\u95ED": "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430 \u2192 \u0437\u0430\u043A\u0440\u044B\u0442\u044C",
5353
+ " \u66F4\u591A\u2026": " \u0435\u0449\u0451\u2026",
5354
+ "\u8FD8\u6CA1\u6709\u95ED\u73AF\u4EFB\u52A1": "\u0417\u0430\u043A\u0440\u044B\u0442\u044B\u0445 \u0437\u0430\u0434\u0430\u0447 \u043F\u043E\u043A\u0430 \u043D\u0435\u0442",
5355
+ "\u6682\u65E0\u4EFB\u52A1": "\u0417\u0430\u0434\u0430\u0447 \u043F\u043E\u043A\u0430 \u043D\u0435\u0442",
5356
+ "ESR \u770B\u677F\u6570\u636E\u4E0D\u53EF\u8FBE\uFF08loopback-only \u5B88\u536B\uFF09\u2014 \u4EFB\u52A1/\u5173\u7CFB/\u56FE\u8C31\u5C06\u65E0\u6CD5\u52A0\u8F7D\uFF1B\u8BF7\u901A\u8FC7\u672C\u673A\u8BBF\u95EE GUI\uFF0C\u6216\u653E\u5165\u53D7\u4FE1\u7F51\u7EDC\u8BBF\u95EE\u3002": "\u0414\u0430\u043D\u043D\u044B\u0435 \u0434\u043E\u0441\u043A\u0438 ESR \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B (\u0437\u0430\u0449\u0438\u0442\u0430 loopback-only) \u2014 \u0437\u0430\u0434\u0430\u0447\u0438, \u0441\u0432\u044F\u0437\u0438 \u0438 \u0433\u0440\u0430\u0444 \u043D\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u044F\u0442\u0441\u044F; \u043E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 GUI \u0441 \u044D\u0442\u043E\u0439 \u043C\u0430\u0448\u0438\u043D\u044B \u0438\u043B\u0438 \u0434\u043E\u0431\u0430\u0432\u044C\u0442\u0435 \u0445\u043E\u0441\u0442 \u0432 \u0434\u043E\u0432\u0435\u0440\u0435\u043D\u043D\u044B\u0435.",
5357
+ "\u5173\u7CFB\u56FE\u8C31\uFF08esr_node / esr_link \u529B\u5BFC\u5411\u56FE\uFF09": "\u0413\u0440\u0430\u0444 \u0441\u0432\u044F\u0437\u0435\u0439 (\u0441\u0438\u043B\u043E\u0432\u043E\u0439 \u0433\u0440\u0430\u0444 esr_node / esr_link)",
5358
+ " \xB7 \u5B9E\u4F53\u4E3A\u5706\u5F62\u8282\u70B9\uFF0C\u4EFB\u52A1\u4E3A\u52FE\u9009\u5FBD\u6807\uFF1B\u70B9\u9009\u8282\u70B9\u67E5\u770B\u5173\u7CFB\u660E\u7EC6": " \xB7 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 \u2014 \u043A\u0440\u0443\u0433\u043B\u044B\u0435 \u0443\u0437\u043B\u044B, \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u0431\u0435\u0439\u0434\u0436\u0438 \u0441 \u0433\u0430\u043B\u043E\u0447\u043A\u043E\u0439; \u0449\u0451\u043B\u043A\u043D\u0438\u0442\u0435 \u0443\u0437\u0435\u043B, \u0447\u0442\u043E\u0431\u044B \u0443\u0432\u0438\u0434\u0435\u0442\u044C \u0441\u0432\u044F\u0437\u0438",
5359
+ "{0} \u4E2A\u4EFB\u52A1\uFF08\u5F53\u524D\u7B5B\u9009\uFF09\xB7 \u6BCF 20s \u81EA\u52A8\u5237\u65B0 \xB7 \u6570\u636E\u6E90 ~/.dsh/storages/dsh_engram.json": "\u0417\u0430\u0434\u0430\u0447: {0} (\u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u0444\u0438\u043B\u044C\u0442\u0440) \xB7 \u0430\u0432\u0442\u043E\u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 \u043A\u0430\u0436\u0434\u044B\u0435 20 \u0441 \xB7 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A ~/.dsh/storages/dsh_engram.json",
5360
+ "{0} \u4E2A\u5B9E\u4F53 \xB7 {1} \u6761\u5173\u7CFB \xB7 {2} \u4E2A\u4EFB\u52A1 \xB7 \u6BCF 20s \u81EA\u52A8\u5237\u65B0 \xB7 \u6570\u636E\u6E90 ~/.dsh/storages/dsh_engram.json": "\u0421\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439: {0} \xB7 \u0441\u0432\u044F\u0437\u0435\u0439: {1} \xB7 \u0437\u0430\u0434\u0430\u0447: {2} \xB7 \u0430\u0432\u0442\u043E\u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 \u043A\u0430\u0436\u0434\u044B\u0435 20 \u0441 \xB7 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A ~/.dsh/storages/dsh_engram.json",
5361
+ "ESR \u770B\u677F": "\u0414\u043E\u0441\u043A\u0430 ESR",
5362
+ "ESR \u770B\u677F \xB7 {0} \u4E2A\u8FDB\u884C\u4E2D\u4EFB\u52A1": "\u0414\u043E\u0441\u043A\u0430 ESR \xB7 \u0437\u0430\u0434\u0430\u0447 \u0432 \u0440\u0430\u0431\u043E\u0442\u0435: {0}",
5363
+ "\u81EA\u52A8\u6355\u83B7": "\u0410\u0432\u0442\u043E\u0437\u0430\u0445\u0432\u0430\u0442",
5364
+ "\u96F6 LLM \u4ECE\u5DE5\u5177\u7ED3\u679C\u63D0\u53D6\u8BB0\u5FC6\uFF08git/\u5173\u952E\u6587\u4EF6/\u9519\u8BEF\uFF09": "\u0418\u0437\u0432\u043B\u0435\u0447\u0435\u043D\u0438\u0435 \u043F\u0430\u043C\u044F\u0442\u0438 \u0438\u0437 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0431\u0435\u0437 LLM (git / \u043A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 \u0444\u0430\u0439\u043B\u044B / \u043E\u0448\u0438\u0431\u043A\u0438)",
5365
+ "\u504F\u597D\u6355\u83B7": "\u0417\u0430\u0445\u0432\u0430\u0442 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0435\u043D\u0438\u0439",
5366
+ "\u7528\u6237\u7EA0\u6B63/\u504F\u597D\u5B66\u4E60\uFF1A\u68C0\u6D4B\u6D88\u606F\u91CC\u7684\u300C\u4E0D\u8981\u7528X/\u6539\u7528Y/prefer/never use\u300D\u53E5\u5F0F\uFF0C\u81EA\u52A8\u6C89\u6DC0\u4E3A preference \u8BB0\u5FC6\u5E76\u7F6E\u9876 [ENGRAM]\uFF08correx/PAHF \u5F0F\uFF0C\u96F6 LLM\uFF09": "\u041E\u0431\u0443\u0447\u0435\u043D\u0438\u0435 \u043D\u0430 \u043F\u0440\u0430\u0432\u043A\u0430\u0445 \u0438 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0435\u043D\u0438\u044F\u0445: \u043D\u0430\u0445\u043E\u0434\u0438\u0442 \u0432 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\u0445 \u043A\u043E\u043D\u0441\u0442\u0440\u0443\u043A\u0446\u0438\u0438 \xAB\u043D\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 X / \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439 Y / prefer / never use\xBB, \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442 \u0438\u0445 \u043A\u0430\u043A \u043F\u0430\u043C\u044F\u0442\u044C \u0442\u0438\u043F\u0430 preference \u0438 \u0432\u044B\u0432\u043E\u0434\u0438\u0442 \u0432 \u043D\u0430\u0447\u0430\u043B\u043E [ENGRAM] (\u0432 \u0434\u0443\u0445\u0435 correx/PAHF, \u0431\u0435\u0437 LLM)",
5367
+ "\u8FB9\u754C\u526A\u679D": "\u041E\u0431\u0440\u0435\u0437\u043A\u0430 \u043D\u0430 \u0433\u0440\u0430\u043D\u0438\u0446\u0430\u0445",
5368
+ "ResultPack L1\uFF1Atodo \u5B8C\u6210/goal \u7EC8\u6001\u8FB9\u754C\u4E3B\u52A8\u526A\u6389\u8D85\u9608\u503C\u65E7\u5DE5\u5177\u7ED3\u679C\uFF08DSH \u786E\u5B9A\u6027 surface-replace\u3001\u507F\u8FD8\u95E8\u3001\u96F6 LLM\uFF1B\u9ED8\u8BA4\u5F00\uFF0C\u5173=opt-out\uFF09": "ResultPack L1: \u043D\u0430 \u0433\u0440\u0430\u043D\u0438\u0446\u0430\u0445 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F todo / \u0444\u0438\u043D\u0430\u043B\u044C\u043D\u043E\u0433\u043E goal \u043E\u0431\u0440\u0435\u0437\u0430\u0435\u0442 \u0441\u0442\u0430\u0440\u044B\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0441\u0432\u0435\u0440\u0445 \u043F\u043E\u0440\u043E\u0433\u0430 (\u0434\u0435\u0442\u0435\u0440\u043C\u0438\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u0430\u044F \u0437\u0430\u043C\u0435\u043D\u0430 surface-replace \u0432 DSH, \u043F\u043E\u0440\u043E\u0433 \u043E\u043A\u0443\u043F\u0430\u0435\u043C\u043E\u0441\u0442\u0438, \u0431\u0435\u0437 LLM; \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E, \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 = opt-out)",
5369
+ "\u526A\u679D\u81EA\u9002\u5E94": "\u0410\u0434\u0430\u043F\u0442\u0438\u0432\u043D\u0430\u044F \u043E\u0431\u0440\u0435\u0437\u043A\u0430",
5370
+ "\u8D26\u672C\u5426\u51B3\uFF1A\u8BE5 workspace \u771F\u5B9E\u526A\u679D\u540E\u51C0\u6536\u76CA\u4E3A\u8D1F\uFF08\u22653 \u6B21\uFF09\u65F6\u81EA\u52A8\u505C\u6B62\u7EE7\u7EED\u526A\uFF1B\u8BC1\u636E\u53EA\u80FD\u5173\u3001\u4E0D\u4F1A\u81EA\u884C\u5F00": "\u0412\u0435\u0442\u043E \u043F\u043E \u0436\u0443\u0440\u043D\u0430\u043B\u0443: \u0435\u0441\u043B\u0438 \u043F\u043E\u0441\u043B\u0435 \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u0439 \u043E\u0431\u0440\u0435\u0437\u043A\u0438 \u0447\u0438\u0441\u0442\u044B\u0439 \u0432\u044B\u0438\u0433\u0440\u044B\u0448 \u0432 \u044D\u0442\u043E\u043C workspace \u043E\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043B\u0435\u043D (\u22653 \u0440\u0430\u0437), \u043E\u0431\u0440\u0435\u0437\u043A\u0430 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u0442\u0441\u044F; \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430 \u043C\u043E\u0433\u0443\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u0432\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0435\u0451, \u043D\u043E \u043D\u0435 \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0441\u0430\u043C\u0438",
5371
+ "\u526A\u679D\u9608\u503C(\u5B57\u7B26)": "\u041F\u043E\u0440\u043E\u0433 \u043E\u0431\u0440\u0435\u0437\u043A\u0438 (\u0441\u0438\u043C\u0432\u043E\u043B\u044B)",
5372
+ "\u8986\u76D6\u5BBF\u4E3B 8192\uFF1A\u8BBE 2048 \u53EF\u66F4\u65E9\u5F00\u526A\uFF0C\u5E76\u914D L2 \u5F52\u6863\u627E\u56DE\u88AB\u526A\u4E2D\u6BB5\uFF1B\u7559\u7A7A=\u5BBF\u4E3B\u9ED8\u8BA4\u3002\u5EFA\u8BAE\u540C\u65F6\u628A\u4FDD\u7559\u8FB9\u7F18\u8C03\u5C0F\uFF08\u5982 1024/256\uFF09\u4EE5\u83B7\u5F97\u6700\u5927\u8282\u7701": "\u041F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043F\u043E\u0440\u043E\u0433 host 8192: \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 2048 \u043D\u0430\u0447\u043D\u0451\u0442 \u043E\u0431\u0440\u0435\u0437\u0430\u0442\u044C \u0440\u0430\u043D\u044C\u0448\u0435 \u2014 \u0432 \u043F\u0430\u0440\u0435 \u0441 \u0430\u0440\u0445\u0438\u0432\u043E\u043C L2, \u0447\u0442\u043E\u0431\u044B \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044C \u0432\u044B\u0440\u0435\u0437\u0430\u043D\u043D\u0443\u044E \u0441\u0435\u0440\u0435\u0434\u0438\u043D\u0443. \u041F\u0443\u0441\u0442\u043E = \u043F\u043E\u0440\u043E\u0433 host. \u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u0442\u0441\u044F \u0443\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C \u0438 \u043A\u0440\u0430\u044F (1024/256) \u0434\u043B\u044F \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0439 \u044D\u043A\u043E\u043D\u043E\u043C\u0438\u0438",
5373
+ "\u7ED3\u679C\u5F52\u6863\u53EC\u56DE": "\u0410\u0440\u0445\u0438\u0432 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432",
5374
+ "ResultPack L2\uFF1A\u526A\u6389\u7684\u4E2D\u6BB5\u8131\u654F\u5F52\u6863\uFF0C\u8282\u70B9\u5C3E\u90E8\u9644 handle\uFF0C\u6A21\u578B\u53EF\u7528 result_recall(callId) \u6309\u9875\u53EC\u56DE\uFF08\u5B8C\u6574 ObservationPack\uFF1B\u9ED8\u8BA4\u5F00\uFF0C\u4FDD\u8BC1\u9ED8\u8BA4\u526A\u679D\u65E0\u635F\uFF1B\u9700\u4E0E\u8FB9\u754C\u526A\u679D\u4E00\u8D77\u5F00\uFF09": "ResultPack L2: \u0432\u044B\u0440\u0435\u0437\u0430\u043D\u043D\u0430\u044F \u0441\u0435\u0440\u0435\u0434\u0438\u043D\u0430 \u0434\u0435\u043F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044F, \u0432 \u043A\u043E\u043D\u0446\u0435 \u0443\u0437\u043B\u0430 \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F handle; \u043C\u043E\u0434\u0435\u043B\u044C \u043C\u043E\u0436\u0435\u0442 \u043B\u0438\u0441\u0442\u0430\u0442\u044C \u0435\u0451 \u0447\u0435\u0440\u0435\u0437 result_recall(callId) (\u043F\u043E\u043B\u043D\u044B\u0439 ObservationPack; \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E, \u0447\u0442\u043E\u0431\u044B \u043E\u0431\u0440\u0435\u0437\u043A\u0430 \u0431\u044B\u043B\u0430 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0439; \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u043A\u043B\u044E\u0447\u0451\u043D\u043D\u043E\u0439 \u043E\u0431\u0440\u0435\u0437\u043A\u0438 \u043D\u0430 \u0433\u0440\u0430\u043D\u0438\u0446\u0430\u0445)",
5375
+ "\u4F1A\u8BDD\u542F\u52A8\u81EA\u52A8\u53EC\u56DE": "\u0410\u0432\u0442\u043E\u043F\u043E\u0434\u0431\u043E\u0440 \u043F\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0441\u0435\u0441\u0441\u0438\u0438",
5376
+ "\u65B0\u4F1A\u8BDD\u6309\u9996\u6761\u6D88\u606F\u81EA\u52A8\u628A\u6700\u76F8\u5173\u8BB0\u5FC6\u6CE8\u5165 [RECALL] \u5757\uFF08\u65E0\u9700\u6A21\u578B\u60F3\u8D77\u8C03 engram_recall\uFF09\uFF1B\u5173\u6389=\u56DE\u5230\u7EAF\u62C9\u53D6": "\u041F\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043D\u043E\u0432\u043E\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u043F\u043E \u043F\u0435\u0440\u0432\u043E\u043C\u0443 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044E \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0430\u043C\u044B\u0435 \u0440\u0435\u043B\u0435\u0432\u0430\u043D\u0442\u043D\u044B\u0435 \u0432\u043E\u0441\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u044F \u0432 \u0431\u043B\u043E\u043A [RECALL] (\u043C\u043E\u0434\u0435\u043B\u0438 \u043D\u0435 \u043D\u0443\u0436\u043D\u043E \u0432\u0441\u043F\u043E\u043C\u0438\u043D\u0430\u0442\u044C \u043F\u0440\u043E engram_recall); \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043E = \u0442\u043E\u043B\u044C\u043A\u043E \u0440\u0443\u0447\u043D\u043E\u0439 \u043F\u043E\u0434\u0431\u043E\u0440",
5377
+ "JIT \u63A8\u9001": "JIT-\u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438",
5378
+ "\u9519\u8BEF\u590D\u53D1 / \u6587\u4EF6\u7126\u70B9 / goal \u5B8C\u6210\u65F6\uFF0C\u628A\u5DF2\u6709\u8BB0\u5FC6\u538B\u6210\u4E00\u884C\u63A8\u8FDB\u4E0A\u4E0B\u6587\uFF08append-only\u3001\u6BCF\u4F1A\u8BDD\u22643 \u884C\u3001\u65E0\u547D\u4E2D\u6C89\u9ED8\uFF1B\u6BCF\u6B21\u63A8\u9001\u6309\u524D\u7F00\u91CD\u5199\u8BA1\u5165\u8D26\u672C\uFF09": "\u041F\u0440\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u043E\u0439 \u043E\u0448\u0438\u0431\u043A\u0435 / \u0444\u043E\u043A\u0443\u0441\u0435 \u043D\u0430 \u0444\u0430\u0439\u043B\u0435 / \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u0438 goal \u043F\u043E\u0434\u0442\u0430\u043B\u043A\u0438\u0432\u0430\u0435\u0442 \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0443\u044E \u043F\u0430\u043C\u044F\u0442\u044C \u043E\u0434\u043D\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439 \u0432 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442 (append-only, \u22643 \u0441\u0442\u0440\u043E\u043A \u043D\u0430 \u0441\u0435\u0441\u0441\u0438\u044E, \u043C\u043E\u043B\u0447\u0438\u0442 \u043F\u0440\u0438 \u043F\u0440\u043E\u043C\u0430\u0445\u0435; \u043A\u0430\u0436\u0434\u0430\u044F \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430 \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u0432 \u0436\u0443\u0440\u043D\u0430\u043B\u0435 \u043A\u0430\u043A \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u044C \u043F\u0440\u0435\u0444\u0438\u043A\u0441\u0430)",
5379
+ "\u4F1A\u8BDD\u7EAA\u8981": "\u0418\u0442\u043E\u0433\u0438 \u0441\u0435\u0441\u0441\u0438\u0438",
5380
+ "\u4F1A\u8BDD\u7ED3\u675F\u65F6\u7528\u96F6 LLM \u89C4\u5219\u751F\u6210\u4E00\u6761 episode\uFF08\u6587\u4EF6/\u547D\u4EE4/\u5931\u8D25\u2192\u4FEE\u590D/\u51B3\u7B56/\u672A\u95ED\u73AF\uFF09\uFF0C\u4E0D\u8FDB\u7D22\u5F15\uFF0C\u4F9B\u6062\u590D\u7B80\u62A5\u4F7F\u7528\uFF1B\u6BCF workspace \u4FDD\u7559\u6700\u8FD1 20 \u6761": "\u0412 \u043A\u043E\u043D\u0446\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u043F\u043E \u043F\u0440\u0430\u0432\u0438\u043B\u0430\u043C \u0431\u0435\u0437 LLM \u0441\u043E\u0437\u0434\u0430\u0451\u0442 \u043E\u0434\u043D\u0443 \u0437\u0430\u043F\u0438\u0441\u044C episode (\u0444\u0430\u0439\u043B\u044B/\u043A\u043E\u043C\u0430\u043D\u0434\u044B/\u0441\u0431\u043E\u0438\u2192\u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F/\u0440\u0435\u0448\u0435\u043D\u0438\u044F/\u043D\u0435\u0437\u0430\u043A\u0440\u044B\u0442\u043E\u0435), \u043D\u0435 \u043F\u043E\u043F\u0430\u0434\u0430\u0435\u0442 \u0432 \u0438\u043D\u0434\u0435\u043A\u0441 \u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0432 \u0441\u0432\u043E\u0434\u043A\u0435 \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F; \u043D\u0430 \u043A\u0430\u0436\u0434\u043E\u0435 \u0440\u0430\u0431\u043E\u0447\u0435\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u0445\u0440\u0430\u043D\u0438\u0442\u0441\u044F 20 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0445",
5381
+ "\u6062\u590D\u7B80\u62A5": "\u0421\u0432\u043E\u0434\u043A\u0430 \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F",
5382
+ "\u65B0\u4F1A\u8BDD\u542F\u52A8\u65F6\u6CE8\u5165\u6700\u8FD1 7 \u5929\u7684\u6700\u65B0 episode\uFF08\u2264240 \u5B57\u7B26 + engram_detail \u6307\u9488\uFF09\uFF0C\u9694\u5929\u7EE7\u7EED\u4E0D\u7528\u91CD\u65B0\u4EA4\u4EE3\u80CC\u666F": "\u041F\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043D\u043E\u0432\u043E\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0439 episode \u0437\u0430 7 \u0434\u043D\u0435\u0439 (\u2264240 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 + \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C engram_detail), \u0447\u0442\u043E\u0431\u044B \u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439 \u0434\u0435\u043D\u044C \u043D\u0435 \u043F\u0435\u0440\u0435\u0441\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442",
5383
+ "\u5B9E\u4F53\u5361": "\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439",
5384
+ "[ENGRAM] \u7D22\u5F15\u4E3A\u6D3B\u8DC3\u5B9E\u4F53\uFF08\u6709\u951A\u5B9A\u8BB0\u5FC6\u6216\u672A\u95ED\u73AF\u4EFB\u52A1\uFF09\u6E32\u67D3\u4E00\u884C\u300C\u5F53\u524D\u771F\u76F8 + \u6253\u5F00\u4EFB\u52A1 + engram_detail(entity=\u2026) \u6307\u9488\u300D\uFF0C\u6700\u591A 2 \u5F20\uFF0C\u66FF\u4EE3\u8FD9\u4E9B\u5B9E\u4F53\u7684\u5E73\u94FA\u8BB0\u5FC6\u884C": "[ENGRAM] \u0434\u043B\u044F \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0435\u0439 (\u0441 \u043F\u0440\u0438\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0439 \u043F\u0430\u043C\u044F\u0442\u044C\u044E \u0438\u043B\u0438 \u043D\u0435\u0437\u0430\u043A\u0440\u044B\u0442\u044B\u043C\u0438 \u0437\u0430\u0434\u0430\u0447\u0430\u043C\u0438) \u0432\u044B\u0432\u043E\u0434\u0438\u0442 \u0441\u0442\u0440\u043E\u043A\u0443 \xAB\u0442\u0435\u043A\u0443\u0449\u0430\u044F \u0438\u0441\u0442\u0438\u043D\u0430 + \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 + \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C engram_detail(entity=\u2026)\xBB, \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C 2 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432\u043C\u0435\u0441\u0442\u043E \u043F\u043B\u043E\u0441\u043A\u0438\u0445 \u0441\u0442\u0440\u043E\u043A \u043F\u0430\u043C\u044F\u0442\u0438 \u043F\u043E \u044D\u0442\u0438\u043C \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u044F\u043C",
5385
+ "\u6BCF\u4F1A\u8BDD\u53BB\u91CD\u4E0A\u9650": "\u041B\u0438\u043C\u0438\u0442 \u0434\u0435\u0434\u0443\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0438 \u043D\u0430 \u0441\u0435\u0441\u0441\u0438\u044E",
5386
+ "recall \u6BCF\u4F1A\u8BDD\u6700\u591A\u4FDD\u7559 N \u6761\uFF08\u8DE8\u4F1A\u8BDD\u53BB\u91CD\uFF09": "\u041F\u043E\u0434\u0431\u043E\u0440: \u043D\u0435 \u0431\u043E\u043B\u0435\u0435 N \u0437\u0430\u043F\u0438\u0441\u0435\u0439 \u043D\u0430 \u0441\u0435\u0441\u0441\u0438\u044E (\u0434\u0435\u0434\u0443\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u044F \u043C\u0435\u0436\u0434\u0443 \u0441\u0435\u0441\u0441\u0438\u044F\u043C\u0438)",
5387
+ "TTL\uFF08\u5929\uFF09": "TTL (\u0434\u043D\u0435\u0439)",
5388
+ "0 = \u4E0D\u8FC7\u671F": "0 = \u0431\u0435\u0437 \u0441\u0440\u043E\u043A\u0430 \u0438\u0441\u0442\u0435\u0447\u0435\u043D\u0438\u044F",
5389
+ "\u7D22\u5F15\u5B57\u7B26\u4E0A\u9650": "\u041B\u0438\u043C\u0438\u0442 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0432 \u0438\u043D\u0434\u0435\u043A\u0441\u0435",
5390
+ "[ENGRAM] \u5757 token \u9884\u7B97": "\u0411\u044E\u0434\u0436\u0435\u0442 \u0442\u043E\u043A\u0435\u043D\u043E\u0432 \u0431\u043B\u043E\u043A\u0430 [ENGRAM]",
5391
+ "\u6355\u83B7\u4E0E\u68C0\u7D22\uFF08\u9AD8\u7EA7\uFF09": "\u0417\u0430\u0445\u0432\u0430\u0442 \u0438 \u043F\u043E\u0438\u0441\u043A (\u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E)",
5392
+ "\u5176\u4F59\u6355\u83B7/\u641C\u7D22\u65CB\u94AE": "\u041E\u0441\u0442\u0430\u043B\u044C\u043D\u044B\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u0438 \u043F\u043E\u0438\u0441\u043A\u0430",
5393
+ "\u6BCF\u4F1A\u8BDD\u6355\u83B7\u4E0A\u9650": "\u041B\u0438\u043C\u0438\u0442 \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u043D\u0430 \u0441\u0435\u0441\u0441\u0438\u044E",
5394
+ "\u5355\u4F1A\u8BDD\u81EA\u52A8\u6355\u83B7\u6761\u6570\u4E0A\u9650": "\u0421\u043A\u043E\u043B\u044C\u043A\u043E \u0437\u0430\u043F\u0438\u0441\u0435\u0439 \u0430\u0432\u0442\u043E\u0437\u0430\u0445\u0432\u0430\u0442 \u043C\u043E\u0436\u0435\u0442 \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0437\u0430 \u043E\u0434\u043D\u0443 \u0441\u0435\u0441\u0441\u0438\u044E",
5395
+ "\u526A\u679D\u4FDD\u7559\u5934\u90E8(\u5B57\u7B26)": "\u041E\u0431\u0440\u0435\u0437\u043A\u0430: \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043D\u0430\u0447\u0430\u043B\u043E (\u0441\u0438\u043C\u0432\u043E\u043B\u044B)",
5396
+ "\u9608\u503C\u8986\u76D6\u751F\u6548\u65F6\u7ED3\u679C\u5F00\u5934\u4FDD\u7559\u957F\u5EA6\uFF08\u9ED8\u8BA4 4096\uFF09\uFF1B\u8C03\u5C0F\uFF08\u5982 1024\uFF09\u914D\u5408 T2048 \u66F4\u7701": "\u0414\u043B\u0438\u043D\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u043C\u043E\u0433\u043E \u043D\u0430\u0447\u0430\u043B\u0430 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0430 \u043F\u0440\u0438 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0438 \u043F\u043E\u0440\u043E\u0433\u0430 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E 4096); \u043C\u0435\u043D\u044C\u0448\u0435\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 1024) \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 T2048 \u044D\u043A\u043E\u043D\u043E\u043C\u0438\u0442 \u0431\u043E\u043B\u044C\u0448\u0435",
5397
+ "\u526A\u679D\u4FDD\u7559\u5C3E\u90E8(\u5B57\u7B26)": "\u041E\u0431\u0440\u0435\u0437\u043A\u0430: \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043A\u043E\u043D\u0435\u0446 (\u0441\u0438\u043C\u0432\u043E\u043B\u044B)",
5398
+ "\u9608\u503C\u8986\u76D6\u751F\u6548\u65F6\u7ED3\u679C\u7ED3\u5C3E\u4FDD\u7559\u957F\u5EA6\uFF08\u9ED8\u8BA4 1024\uFF09\uFF1B\u8C03\u5C0F\uFF08\u5982 256\uFF09\u914D\u5408 T2048 \u66F4\u7701": "\u0414\u043B\u0438\u043D\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u043C\u043E\u0433\u043E \u043A\u043E\u043D\u0446\u0430 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0430 \u043F\u0440\u0438 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0438 \u043F\u043E\u0440\u043E\u0433\u0430 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E 1024); \u043C\u0435\u043D\u044C\u0448\u0435\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 256) \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 T2048 \u044D\u043A\u043E\u043D\u043E\u043C\u0438\u0442 \u0431\u043E\u043B\u044C\u0448\u0435",
5399
+ "\u7A7A\u95F2\u6B65\u6570\u8FB9\u754C": "\u0413\u0440\u0430\u043D\u0438\u0446\u0430 \u043F\u043E \u0447\u0438\u0441\u043B\u0443 \u043F\u0443\u0441\u0442\u044B\u0445 \u0448\u0430\u0433\u043E\u0432",
5400
+ "\u6700\u591A\u6BCF N \u8BF7\u6C42\u89E6\u53D1\u4E00\u6B21\u526A\u679D\uFF0C\u8986\u76D6\u65E0 todo/goal \u7684\u4F1A\u8BDD\uFF08\u7EA6 62% \u4F1A\u8BDD\uFF09\uFF1B\u4ECD\u53D7\u507F\u8FD8\u95E8\u7EA6\u675F\uFF1B\u7559\u7A7A=\u4EC5\u4E8B\u4EF6\u8FB9\u754C": "\u041E\u0431\u0440\u0435\u0437\u0430\u0442\u044C \u043D\u0435 \u0447\u0430\u0449\u0435 \u043E\u0434\u043D\u043E\u0433\u043E \u0440\u0430\u0437\u0430 \u043D\u0430 N \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 \u2014 \u043F\u043E\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u0438 \u0431\u0435\u0437 todo/goal (\u043E\u043A\u043E\u043B\u043E 62%); \u043F\u043E-\u043F\u0440\u0435\u0436\u043D\u0435\u043C\u0443 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u043E \u043F\u043E\u0440\u043E\u0433\u043E\u043C \u043E\u043A\u0443\u043F\u0430\u0435\u043C\u043E\u0441\u0442\u0438; \u043F\u0443\u0441\u0442\u043E = \u0442\u043E\u043B\u044C\u043A\u043E \u0441\u043E\u0431\u044B\u0442\u0438\u0439\u043D\u044B\u0435 \u0433\u0440\u0430\u043D\u0438\u0446\u044B",
5401
+ "\u81EA\u52A8\u53EC\u56DE\u6761\u6570": "\u0421\u043A\u043E\u043B\u044C\u043A\u043E \u0437\u0430\u043F\u0438\u0441\u0435\u0439 \u043F\u043E\u0434\u0431\u0438\u0440\u0430\u0442\u044C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438",
5402
+ "[RECALL] \u5757\u6700\u591A\u6CE8\u5165\u7684\u8BB0\u5FC6\u6761\u6570\uFF08\u5C11\u800C\u51C6\uFF09": "\u0421\u043A\u043E\u043B\u044C\u043A\u043E \u0432\u043E\u0441\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u0439 \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u0432 \u0431\u043B\u043E\u043A [RECALL] (\u043C\u0430\u043B\u043E \u0438 \u0442\u043E\u0447\u043D\u043E)",
5403
+ "\u4F1A\u8BDD\u5386\u53F2\u641C\u7D22": "\u041F\u043E\u0438\u0441\u043A \u043F\u043E \u0438\u0441\u0442\u043E\u0440\u0438\u0438 \u0441\u0435\u0441\u0441\u0438\u0439",
5404
+ "engram_recall \u652F\u6301\u8DE8\u4F1A\u8BDD FTS \u515C\u5E95": "engram_recall \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u0438\u0449\u0435\u0442 \u043F\u043E FTS \u0432 \u043F\u0440\u043E\u0448\u043B\u044B\u0445 \u0441\u0435\u0441\u0441\u0438\u044F\u0445",
5405
+ "\u53EC\u56DE\u8303\u56F4": "\u041E\u0431\u043B\u0430\u0441\u0442\u044C \u043F\u043E\u0434\u0431\u043E\u0440\u0430",
5406
+ "workspace=\u4E25\u683C\u5F53\u524D\u5DE5\u4F5C\u533A\u9694\u79BB\uFF08\u9ED8\u8BA4\uFF0Ctoken \u7EAA\u5F8B\uFF09\uFF1Bglobal=\u672C\u5DE5\u4F5C\u533A\u547D\u4E2D\u5F31/\u7A7A\u65F6\u4ECE\u5176\u5B83\u5DE5\u4F5C\u533A\u6C60\u53EC\u56DE\u5E76\u6807 [W:<workspace>] \u6765\u6E90\uFF08\u4F1A\u6253\u7834\u9694\u79BB\uFF09": "workspace = \u0441\u0442\u0440\u043E\u0433\u0430\u044F \u0438\u0437\u043E\u043B\u044F\u0446\u0438\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E, \u044D\u043A\u043E\u043D\u043E\u043C\u0438\u044F \u0442\u043E\u043A\u0435\u043D\u043E\u0432); global = \u043F\u0440\u0438 \u0441\u043B\u0430\u0431\u043E\u043C/\u043F\u0443\u0441\u0442\u043E\u043C \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0438 \u0434\u043E\u0431\u0438\u0440\u0430\u0442\u044C \u0438\u0437 \u043F\u0443\u043B\u043E\u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432 \u0441 \u043F\u043E\u043C\u0435\u0442\u043A\u043E\u0439 [W:<workspace>] (\u043D\u0430\u0440\u0443\u0448\u0430\u0435\u0442 \u0438\u0437\u043E\u043B\u044F\u0446\u0438\u044E)",
5407
+ "\u7D22\u5F15\uFF08\u9AD8\u7EA7\uFF09": "\u0418\u043D\u0434\u0435\u043A\u0441 (\u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E)",
5408
+ "\u884C\u6570\u3001\u5165\u7D22\u5F15\u4FE1\u53F7\u4E0E\u664B\u5347\u89C4\u5219": "\u0421\u0442\u0440\u043E\u043A\u0438, \u043F\u043E\u0440\u043E\u0433 \u0441\u0438\u0433\u043D\u0430\u043B\u0430 \u0438 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u043F\u0440\u043E\u0434\u0432\u0438\u0436\u0435\u043D\u0438\u044F",
5409
+ "\u7D22\u5F15\u6700\u5927\u884C\u6570": "\u041C\u0430\u043A\u0441\u0438\u043C\u0443\u043C \u0441\u0442\u0440\u043E\u043A \u0438\u043D\u0434\u0435\u043A\u0441\u0430",
5410
+ "[ENGRAM] \u5757\u6700\u591A\u663E\u793A\u7684\u6761\u76EE\u884C\u6570": "\u0421\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0442\u0440\u043E\u043A \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0432 \u0431\u043B\u043E\u043A\u0435 [ENGRAM]",
5411
+ "\u5165\u7D22\u5F15\u4FE1\u53F7\u9608\u503C": "\u041F\u043E\u0440\u043E\u0433 \u0441\u0438\u0433\u043D\u0430\u043B\u0430 \u0434\u043B\u044F \u0438\u043D\u0434\u0435\u043A\u0441\u0430",
5412
+ "signal \u2265 \u6B64\u503C\u7684\u81EA\u52A8\u6355\u83B7\u624D\u8FDB\u7D22\u5F15": "\u0412 \u0438\u043D\u0434\u0435\u043A\u0441 \u043F\u043E\u043F\u0430\u0434\u0430\u0435\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u0430\u0432\u0442\u043E\u0437\u0430\u0445\u0432\u0430\u0442 \u0441 signal \u2265 \u044D\u0442\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F",
5413
+ "\u664B\u5347\u547D\u4E2D\u6570": "\u0425\u0438\u0442\u044B \u0434\u043B\u044F \u043F\u0440\u043E\u0434\u0432\u0438\u0436\u0435\u043D\u0438\u044F",
5414
+ "hit \u6570\u8FBE\u6B64\u503C\u7684\u4F4E\u4FE1\u53F7\u6761\u76EE\u8FDB\u7D22\u5F15": "\u0417\u0430\u043F\u0438\u0441\u0438 \u0441 \u043D\u0438\u0437\u043A\u0438\u043C \u0441\u0438\u0433\u043D\u0430\u043B\u043E\u043C \u043F\u043E\u043F\u0430\u0434\u0430\u044E\u0442 \u0432 \u0438\u043D\u0434\u0435\u043A\u0441 \u043F\u043E\u0441\u043B\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u043E\u0433\u043E \u0447\u0438\u0441\u043B\u0430 \u043F\u043E\u043F\u0430\u0434\u0430\u043D\u0438\u0439",
5415
+ "\u751F\u547D\u5468\u671F\u4E0E GC\uFF08\u9AD8\u7EA7\uFF09": "\u0416\u0438\u0437\u043D\u0435\u043D\u043D\u044B\u0439 \u0446\u0438\u043A\u043B \u0438 GC (\u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E)",
5416
+ "\u5BB9\u91CF\u4E0A\u9650\u4E0E\u5B9A\u671F\u56DE\u6536\uFF08\u81EA\u52A8 GC = \u66FF\u4EE3 DSH \u81EA\u52A8 compact\uFF09": "\u041B\u0438\u043C\u0438\u0442\u044B \u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F \u0438 \u043F\u0435\u0440\u0438\u043E\u0434\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u043E\u0447\u0438\u0441\u0442\u043A\u0430 (\u0430\u0432\u0442\u043E-GC \u0437\u0430\u043C\u0435\u043D\u044F\u0435\u0442 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0439 compact DSH)",
5417
+ "\u5DE5\u4F5C\u533A\u8BB0\u5FC6\u4E0A\u9650": "\u041B\u0438\u043C\u0438\u0442 \u043F\u0430\u043C\u044F\u0442\u0438 \u043D\u0430 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E",
5418
+ "\u5355\u5DE5\u4F5C\u533A\u5BB9\u91CF\u4E0A\u9650\uFF08GC \u5F52\u6863\u8D85\u9650\u6761\u76EE\uFF09": "\u041C\u0430\u043A\u0441\u0438\u043C\u0443\u043C \u0437\u0430\u043F\u0438\u0441\u0435\u0439 \u043D\u0430 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E (\u043B\u0438\u0448\u043D\u0435\u0435 \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0443\u0435\u0442 GC)",
5419
+ "\u8BB0\u5FC6 GC": "GC \u043F\u0430\u043C\u044F\u0442\u0438",
5420
+ "\u5B9A\u65F6\u56DE\u6536\uFF08\u8FC7\u671F/\u8D85\u5BB9\u91CF/stable \u8D85\u7A97/\u60AC\u7A7A\u94FE\u63A5\uFF09": "\u041F\u0435\u0440\u0438\u043E\u0434\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u043E\u0447\u0438\u0441\u0442\u043A\u0430 (\u0438\u0441\u0442\u0451\u043A\u0448\u0438\u0435 / \u0441\u0432\u0435\u0440\u0445 \u043B\u0438\u043C\u0438\u0442\u0430 / \u0437\u0430\u043A\u0440\u044B\u0442\u044B\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u043D\u0435 \u043E\u043A\u043D\u0430 / \u0432\u0438\u0441\u044F\u0447\u0438\u0435 \u0441\u0432\u044F\u0437\u0438)",
5421
+ "Context GC \u53D9\u4E8B\u515C\u5E95": "\u0420\u0435\u0437\u044E\u043C\u0435-\u0444\u043E\u043B\u0431\u044D\u043A Context GC",
5422
+ "\u81EA\u52A8 compact \u65F6\u65E0\u951A\u8F6E\u6B21\u7528 LLM \u6458\u8981\uFF1B\u5173\u6389=\u7EAF\u673A\u68B0\uFF08\u96F6 LLM\uFF09": "\u041F\u0440\u0438 \u0430\u0432\u0442\u043E\u043A\u043E\u043C\u043F\u0430\u043A\u0446\u0438\u0438 \u0445\u043E\u0434\u044B \u0431\u0435\u0437 \u043F\u0440\u0438\u0432\u044F\u0437\u043A\u0438 \u0441\u0443\u043C\u043C\u0438\u0440\u0443\u044E\u0442\u0441\u044F \u0447\u0435\u0440\u0435\u0437 LLM; \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043E = \u0442\u043E\u043B\u044C\u043A\u043E \u043C\u0435\u0445\u0430\u043D\u0438\u043A\u0430 (\u0431\u0435\u0437 LLM)",
5423
+ "stable \u4EFB\u52A1\u4FDD\u7559\uFF08\u5929\uFF09": "\u0425\u0440\u0430\u043D\u0435\u043D\u0438\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u044B\u0445 \u0437\u0430\u0434\u0430\u0447 (\u0434\u043D\u0435\u0439)",
5424
+ "\u8D85\u7A97\u540E\u7531 GC \u5F52\u6863\u3001\u79BB\u5F00 [ESR] \u8868\u9762": "\u041F\u043E\u0441\u043B\u0435 \u043E\u043A\u043D\u0430 GC \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0438\u0445, \u0438 \u043E\u043D\u0438 \u0443\u0445\u043E\u0434\u044F\u0442 \u0438\u0437 [ESR]",
5425
+ "\u6821\u9A8C artifact \u5B58\u5728": "\u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C \u043D\u0430\u043B\u0438\u0447\u0438\u0435 artifact",
5426
+ "esr_close \u7684 artifact \u987B\u5728\u5DE5\u4F5C\u533A\u78C1\u76D8\u4E0A\u771F\u5B9E\u5B58\u5728\uFF08URL \u8C41\u514D\uFF09\uFF1Bforce:true/\u5173\u6389\u53EF\u8DF3\u8FC7": "artifact \u0432 esr_close \u0434\u043E\u043B\u0436\u0435\u043D \u0440\u0435\u0430\u043B\u044C\u043D\u043E \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043E\u0432\u0430\u0442\u044C \u043D\u0430 \u0434\u0438\u0441\u043A\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430 (URL \u2014 \u0438\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435); force:true \u0438\u043B\u0438 \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u044E\u0442 \u043F\u0440\u043E\u043F\u0443\u0441\u0442\u0438\u0442\u044C",
5427
+ "\u4F1A\u8BDD\u7ED3\u675F\u81EA\u52A8\u6C89\u6DC0 todo": "\u041F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C todo \u043F\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u0438 \u0441\u0435\u0441\u0441\u0438\u0438",
5428
+ "\u4F1A\u8BDD\u7ED3\u675F\u65F6\u4ECD pending \u7684 todo \u81EA\u52A8\u8F6C\u6210 ESR draft\uFF08\u6309\u540D\u53BB\u91CD\u3001\u53D7\u4EFB\u52A1\u4E0A\u9650\u7EA6\u675F\uFF09\uFF1B\u5173\u6389=\u968F\u4F1A\u8BDD\u5F03\u53BB": "\u041F\u043E \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u0438 \u0441\u0435\u0441\u0441\u0438\u0438 \u043D\u0435\u0437\u0430\u043A\u0440\u044B\u0442\u044B\u0435 todo \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0441\u0442\u0430\u043D\u043E\u0432\u044F\u0442\u0441\u044F \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\u0430\u043C\u0438 ESR (\u0434\u0435\u0434\u0443\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u044F \u043F\u043E \u0438\u043C\u0435\u043D\u0438, \u0441 \u0443\u0447\u0451\u0442\u043E\u043C \u043B\u0438\u043C\u0438\u0442\u0430 \u0437\u0430\u0434\u0430\u0447); \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043E = \u043F\u0440\u043E\u043F\u0430\u0434\u0430\u044E\u0442 \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u0441\u0435\u0441\u0441\u0438\u0435\u0439",
5429
+ "web \u9762\u81EA\u52A8\u542F\u7528 Context GC": "\u0410\u0432\u0442\u043E\u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 Context GC \u043D\u0430 web-\u043F\u043B\u043E\u0441\u043A\u043E\u0441\u0442\u0438",
5430
+ "\u542F\u52A8\u65F6\u628A\u5168\u90E8 stock \u5E03\u5C40\u7684 agent \u9884\u8BBE\uFF08shipped + \u81EA\u5B9A\u4E49\u6839\uFF09\u7684 compaction \u7EC4\u81EA\u52A8\u6362\u6210 dsh-engram/compaction\uFF1B\u5173\u6389=\u4E0D\u518D\u81EA\u52A8\u63A5\u7BA1\uFF08\u5DF2\u63A5\u7BA1\u7684\u9700 web-compaction:revert \u8FD8\u539F\uFF09": "\u041F\u0440\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0435 \u0432\u043E \u0432\u0441\u0435\u0445 \u043F\u0440\u0435\u0441\u0435\u0442\u0430\u0445 \u0430\u0433\u0435\u043D\u0442\u0430 \u0441\u043E \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B\u043C (stock) layout (\u043F\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u043C\u044B\u0435 + \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u043A\u043E\u0440\u043D\u0438) \u0433\u0440\u0443\u043F\u043F\u0430 compaction \u0437\u0430\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u043D\u0430 dsh-engram/compaction; \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043E = \u0430\u0432\u0442\u043E\u043F\u0435\u0440\u0435\u0445\u0432\u0430\u0442 \u043D\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F (\u0443\u0436\u0435 \u043F\u0435\u0440\u0435\u0445\u0432\u0430\u0447\u0435\u043D\u043D\u043E\u0435 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044F \u0447\u0435\u0440\u0435\u0437 web-compaction:revert)",
5431
+ "\u8BB0\u5FC6\u8BED\u4E49\uFF08\u9AD8\u7EA7\uFF09": "\u0421\u0435\u043C\u0430\u043D\u0442\u0438\u043A\u0430 \u043F\u0430\u043C\u044F\u0442\u0438 (\u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E)",
5432
+ "supersedes / contradict \u7684\u542F\u53D1\u5F0F": "\u042D\u0432\u0440\u0438\u0441\u0442\u0438\u043A\u0438 supersedes / contradict",
5433
+ "\u81EA\u52A8 supersedes": "\u0410\u0432\u0442\u043E-supersedes",
5434
+ "\u5B9E\u4F53\u951A\u5B9A + \u66FF\u6362\u5F0F\u66F4\u65B0\uFF08\u6539\u7528/\u4E0D\u518D/no longer\u2026\uFF09\u81EA\u52A8\u628A\u65E7\u8BB0\u5FC6\u6807\u4E3A superseded\uFF1B\u65E7\u884C\u4FDD\u7559\u3001\u53EC\u56DE\u964D\u7EA7\u3002\u9ED8\u8BA4\u5173\uFF0C\u663E\u5F0F supersedes \u6C38\u8FDC\u4F18\u5148": "\u041F\u0440\u0438\u0432\u044F\u0437\u043A\u0430 \u043A \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438 + \u0437\u0430\u043C\u0435\u043D\u0430 (\u043F\u0435\u0440\u0435\u0448\u0451\u043B \u043D\u0430 / \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 / no longer\u2026) \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043F\u043E\u043C\u0435\u0447\u0430\u044E\u0442 \u0441\u0442\u0430\u0440\u0443\u044E \u043F\u0430\u043C\u044F\u0442\u044C \u043A\u0430\u043A superseded; \u0441\u0442\u0430\u0440\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442\u0441\u044F, \u043D\u043E \u0445\u0443\u0436\u0435 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F. \u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043E; \u044F\u0432\u043D\u044B\u0439 supersedes \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442\u0435",
5435
+ "\u5B89\u5168": "\u0411\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u044C",
5436
+ "\u8BBF\u95EE\u56F4\u680F\u4E0E\u96A7\u9053\u6388\u6743": "\u041E\u0433\u0440\u0430\u0436\u0434\u0435\u043D\u0438\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u0438 \u0434\u043E\u0432\u0435\u0440\u0438\u0435 \u0442\u0443\u043D\u043D\u0435\u043B\u044F\u043C",
5437
+ "\u53D7\u4FE1\u96A7\u9053\u57DF\u540D": "\u0414\u043E\u0432\u0435\u0440\u0435\u043D\u043D\u044B\u0435 \u0434\u043E\u043C\u0435\u043D\u044B \u0442\u0443\u043D\u043D\u0435\u043B\u044F",
5438
+ "\u5141\u8BB8\u7ECF\u96A7\u9053\u8BBF\u95EE\u8BB0\u5FC6\u67E5\u770B\u5668\u7684\u57DF\u540D\uFF0C\u9017\u53F7\u5206\u9694\uFF1B\u7559\u7A7A = \u4EC5\u672C\u673A\u3002\u6539\u540E\u9700\u91CD\u542F dsh web \u751F\u6548": "\u0414\u043E\u043C\u0435\u043D\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u043C \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043D \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0449\u0438\u043A\u0443 \u043F\u0430\u043C\u044F\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043D\u043D\u0435\u043B\u044C, \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043F\u044F\u0442\u0443\u044E; \u043F\u0443\u0441\u0442\u043E = \u0442\u043E\u043B\u044C\u043A\u043E \u044D\u0442\u0430 \u043C\u0430\u0448\u0438\u043D\u0430. \u041F\u043E\u0441\u043B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0435 dsh web",
5439
+ "\u63A7\u5236 engram \u8BB0\u5FC6\u7684\u6355\u83B7\u3001\u7D22\u5F15\u3001\u4FDD\u7559\u4E0E\u96A7\u9053\u8BBF\u95EE": "\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0437\u0430\u0445\u0432\u0430\u0442\u043E\u043C, \u0438\u043D\u0434\u0435\u043A\u0441\u043E\u043C, \u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435\u043C \u043F\u0430\u043C\u044F\u0442\u0438 engram \u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u043E\u043C \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043D\u043D\u0435\u043B\u044C",
5440
+ "[dsh-engram] settings scope unavailable \u2014 Plugins \u914D\u7F6E\u5361\u5DF2\u9690\u85CF:": "[dsh-engram] settings scope unavailable \u2014 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A \u0432 Plugins \u0441\u043A\u0440\u044B\u0442\u0430:",
5441
+ "host.domain, \u53E6\u4E00\u57DF\u540D\u2026": "host.domain, \u0434\u0440\u0443\u0433\u043E\u0439-\u0434\u043E\u043C\u0435\u043D\u2026",
5442
+ "\u91CD\u7F6E\u4E3A\u9ED8\u8BA4": "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u043A \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044E \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E",
5443
+ "\u91CD\u7F6E": "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C",
5444
+ "{0} dsh-engram \u8BBE\u7F6E": "{0} \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 dsh-engram",
5445
+ "\u6536\u8D77": "\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C",
5446
+ "\u5C55\u5F00": "\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C",
5447
+ "\u672A\u4FDD\u5B58": "\u041D\u0435 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u043E",
5448
+ "\u672C\u90E8\u7F72\u7684\u8BBE\u7F6E\u4E3A\u53EA\u8BFB\uFF08\u5BBF\u4E3B\u672A\u6388\u6743\u5199\u5165\u6216\u9700\u91CD\u542F\u5E94\u7528\uFF09\u3002": "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0432 \u044D\u0442\u043E\u043C \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0447\u0442\u0435\u043D\u0438\u044F (host \u043D\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u043B \u0437\u0430\u043F\u0438\u0441\u044C \u0438\u043B\u0438 \u043D\u0443\u0436\u043D\u043E \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435).",
5449
+ "\u5E38\u7528": "\u041E\u0441\u043D\u043E\u0432\u043D\u044B\u0435",
5450
+ "\u6BCF\u5929\u4F1A\u78B0\u5230\u7684\u65CB\u94AE \xB7 \u5176\u4F59\u6536\u5728\u4E0B\u65B9\u9AD8\u7EA7\u8BBE\u7F6E": "\u0422\u043E, \u0447\u0442\u043E \u043D\u0443\u0436\u043D\u043E \u043A\u0430\u0436\u0434\u044B\u0439 \u0434\u0435\u043D\u044C \xB7 \u043E\u0441\u0442\u0430\u043B\u044C\u043D\u043E\u0435 \u2014 \u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u0445 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0445 \u043D\u0438\u0436\u0435",
5451
+ "\u9AD8\u7EA7\u8BBE\u7F6E\uFF08{0} \u9879\uFF09": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 ({0})",
5452
+ "\u8BBE\u7F6E\u5BF9\u65B0\u5EFA\u4F1A\u8BDD\u5373\u65F6\u751F\u6548\uFF1B\u5DF2\u51BB\u7ED3\u7684 [ENGRAM] \u5757\u4FDD\u6301\u524D\u7F00\u7A33\u5B9A\u3002": "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u044E\u0442\u0441\u044F \u043A \u043D\u043E\u0432\u044B\u043C \u0441\u0435\u0441\u0441\u0438\u044F\u043C \u0441\u0440\u0430\u0437\u0443; \u0443\u0436\u0435 \u0437\u0430\u043C\u043E\u0440\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u0431\u043B\u043E\u043A\u0438 [ENGRAM] \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u044E\u0442 \u0441\u0442\u0430\u0431\u0438\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u0435\u0444\u0438\u043A\u0441.",
5453
+ "\u653E\u5F03\u4FEE\u6539": "\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F",
5454
+ "\u4FDD\u5B58\u4E2D\u2026": "\u0421\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435\u2026",
5455
+ "\u4FDD\u5B58": "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C",
5456
+ "\u504F\u597D": "\u041F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0435\u043D\u0438\u0435",
5457
+ "\u51B3\u5B9A": "\u0420\u0435\u0448\u0435\u043D\u0438\u0435",
5458
+ "\u9519\u8BEF": "\u041E\u0448\u0438\u0431\u043A\u0430",
5459
+ "\u6D41\u7A0B": "\u041F\u0440\u043E\u0446\u0435\u0434\u0443\u0440\u0430",
5460
+ "\u4E8B\u5B9E": "\u0424\u0430\u043A\u0442",
5461
+ "\u6D1E\u5BDF": "\u0418\u043D\u0441\u0430\u0439\u0442",
5462
+ "\u4EA4\u63A5": "\u041F\u0435\u0440\u0435\u0434\u0430\u0447\u0430",
5463
+ "\u4EFB\u52A1": "\u0417\u0430\u0434\u0430\u0447\u0430",
5464
+ "\u5DF2\u8FC7\u671F": "\u041F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u043E",
5465
+ "\u5DF2\u95ED\u73AF \u2192 STABLE \u2713": "\u0417\u0430\u043A\u0440\u044B\u0442\u043E \u2192 STABLE \u2713",
5466
+ "\u4ECD\u6709\u7F3A\u53E3\uFF1A{0}{1}": "\u0412\u0441\u0451 \u0435\u0449\u0451 \u0435\u0441\u0442\u044C \u043F\u0440\u043E\u0431\u0435\u043B\u044B: {0}{1}",
5467
+ "\u5173\u95ED\u5931\u8D25\uFF1A{0}": "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0437\u0430\u043A\u0440\u044B\u0442\u044C: {0}",
5468
+ "\u8282\u70B9": "\u0423\u0437\u0435\u043B",
5469
+ "\u5173\u7CFB": "\u0421\u0432\u044F\u0437\u044C",
5470
+ "\u5173\u95ED\u8BE6\u60C5": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0434\u0435\u0442\u0430\u043B\u0438",
5471
+ "\u4EFB\u52A1\u4E0D\u5B58\u5728\uFF08\u53EF\u80FD\u5DF2\u88AB\u5173\u95ED/\u5F52\u6863\uFF09\u3002": "\u0417\u0430\u0434\u0430\u0447\u0430 \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 (\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E, \u0443\u0436\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u0430 \u0438\u043B\u0438 \u0432 \u0430\u0440\u0445\u0438\u0432\u0435).",
5472
+ "\u72B6\u6001": "\u0421\u0442\u0430\u0442\u0443\u0441",
5473
+ "\u521B\u5EFA {0}": "\u0421\u043E\u0437\u0434\u0430\u043D\u043E {0}",
5474
+ "\u66F4\u65B0 {0}": "\u041E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u043E {0}",
5475
+ "\u63CF\u8FF0": "\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435",
5476
+ "\u8BC1\u636E\u7F3A\u53E3": "\u041F\u0440\u043E\u0431\u0435\u043B\u044B \u0432 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430\u0445",
5477
+ "\u8BB0\u5FC6\u5F15\u7528": "\u0421\u0441\u044B\u043B\u043A\u0438 \u043D\u0430 \u043F\u0430\u043C\u044F\u0442\u044C",
5478
+ "\u6253\u5F00\u8BB0\u5FC6 {0}": "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043F\u0430\u043C\u044F\u0442\u044C {0}",
5479
+ "\u8865\u9F50\u8BC1\u636E \u2192 \u5173\u95ED\uFF08\u4E09\u9879\u5168\u9F50\u8F6C STABLE\uFF09": "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430 \u2192 \u0437\u0430\u043A\u0440\u044B\u0442\u044C (\u043A\u043E\u0433\u0434\u0430 \u0432\u0441\u0435 \u0442\u0440\u0438 \u0435\u0441\u0442\u044C, \u0441\u0442\u0430\u0442\u0443\u0441 STABLE)",
5480
+ "artifact \u4EA7\u7269\uFF08\u6587\u4EF6/PR/\u8DEF\uFF09": "\u0410\u0440\u0442\u0435\u0444\u0430\u043A\u0442 artifact (\u0444\u0430\u0439\u043B/PR/\u043F\u0443\u0442\u044C)",
5481
+ "evaluation \u8BC4\u4F30\uFF08\u6D4B\u8BD5/\u8BC4\u5BA1/\u5206\u6570\uFF09": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 evaluation (\u0442\u0435\u0441\u0442\u044B/\u0440\u0435\u0432\u044C\u044E/\u043E\u0446\u0435\u043D\u043A\u0430)",
5482
+ "memory_refs\uFF08#id, \u9017\u53F7\u5206\u9694\uFF09": "memory_refs (#id \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043F\u044F\u0442\u0443\u044E)",
5483
+ "\u786E\u8BA4\u63D0\u4EA4\uFF1F": "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C \u043E\u0442\u043F\u0440\u0430\u0432\u043A\u0443?",
5484
+ "\u786E\u8BA4": "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C",
5485
+ "\u5DF2\u95ED\u73AF \u2713 \u2014 \u5168\u90E8\u8BC1\u636E\u95E8\u5DF2\u6EE1\u8DB3\uFF0C\u53EF\u4EE5\u4ECE\u770B\u677F/\u6E05\u5355\u79FB\u9664": "\u0417\u0430\u043A\u0440\u044B\u0442\u043E \u2713 \u2014 \u0432\u0441\u0435 \u0432\u043E\u0440\u043E\u0442\u0430 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u044B, \u0437\u0430\u0434\u0430\u0447\u0443 \u043C\u043E\u0436\u043D\u043E \u0443\u0431\u0440\u0430\u0442\u044C \u0441 \u0434\u043E\u0441\u043A\u0438/\u0438\u0437 \u0441\u043F\u0438\u0441\u043A\u0430",
5486
+ "\u5185\u5BB9": "\u0421\u043E\u0434\u0435\u0440\u0436\u0430\u043D\u0438\u0435",
5487
+ "\u6807\u7B7E": "\u0422\u0435\u0433\u0438",
5488
+ "\u66FF\u6362 / \u51B2\u7A81": "\u0417\u0430\u043C\u0435\u043D\u0430 / \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442",
5489
+ "\u672C\u6761\u66FF\u4EE3 {0}\uFF08\u65E7\u884C\u4FDD\u7559\u3001\u53EC\u56DE\u964D\u7EA7\uFF09": "\u042D\u0442\u0430 \u0437\u0430\u043F\u0438\u0441\u044C \u0437\u0430\u043C\u0435\u043D\u044F\u0435\u0442 {0} (\u0441\u0442\u0430\u0440\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0430, \u0445\u0443\u0436\u0435 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F)",
5490
+ "\u66FF\u4EE3 #{0}": "\u0417\u0430\u043C\u0435\u043D\u044F\u0435\u0442 #{0}",
5491
+ "\u672C\u6761\u4E0E {0} \u51B2\u7A81\uFF08\u4E24\u6761\u90FD\u4FDD\u7559\uFF09": "\u042D\u0442\u0430 \u0437\u0430\u043F\u0438\u0441\u044C \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0443\u0435\u0442 \u0441 {0} (\u043E\u0431\u0435 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u044B)",
5492
+ "\u51B2\u7A81 #{0}": "\u041A\u043E\u043D\u0444\u043B\u0438\u043A\u0442 #{0}",
5493
+ "\u5DF2\u88AB {0}\u2026 \u66FF\u4EE3": "\u0417\u0430\u043C\u0435\u043D\u0435\u043D\u043E \u043D\u0430 {0}\u2026",
5494
+ "\u2190 \u88AB #{0} \u66FF\u4EE3": "\u2190 \u0437\u0430\u043C\u0435\u043D\u0435\u043D\u043E \u043D\u0430 #{0}",
5495
+ "{0}\u2026 \u4E0E\u672C\u6761\u51B2\u7A81": "{0}\u2026 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0443\u0435\u0442 \u0441 \u044D\u0442\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u044C\u044E",
5496
+ " \u51B2\u7A81": " \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442",
5497
+ "\u5143\u6570\u636E": "\u041C\u0435\u0442\u0430\u0434\u0430\u043D\u043D\u044B\u0435",
5498
+ "\u8282\u70B9\u4E0D\u5B58\u5728\u3002": "\u0423\u0437\u0435\u043B \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.",
5499
+ "\u5173\u8054\u5173\u7CFB\uFF08{0}\uFF09": "\u0421\u0432\u044F\u0437\u0438 ({0})",
5500
+ "\u6682\u65E0\u5173\u7CFB \u2014 \u7528 esr_link \u5173\u8054": "\u0421\u0432\u044F\u0437\u0435\u0439 \u043F\u043E\u043A\u0430 \u043D\u0435\u0442 \u2014 \u0441\u0432\u044F\u0436\u0438\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 esr_link",
5501
+ "\u4F9D\u8D56": "\u0417\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u044C",
5502
+ "\u5B9E\u73B0": "\u0420\u0435\u0430\u043B\u0438\u0437\u0443\u0435\u0442",
5503
+ "\u7EC6\u5316": "\u0423\u0442\u043E\u0447\u043D\u044F\u0435\u0442",
5504
+ "\u77DB\u76FE": "\u041F\u0440\u043E\u0442\u0438\u0432\u043E\u0440\u0435\u0447\u0438\u0442",
5505
+ "\u8FFD\u8E2A": "\u041E\u0442\u0441\u043B\u0435\u0436\u0438\u0432\u0430\u0435\u0442",
5506
+ "\u5173\u8054": "\u0421\u0432\u044F\u0437\u0430\u043D\u043E \u0441",
5507
+ "\u6682\u65E0\u8282\u70B9/\u5173\u7CFB\u53EF\u7ED8\u5236 \u2014 \u6A21\u578B\u7528 esr_node / esr_link \u767B\u8BB0\u9886\u57DF\u5BF9\u8C61\u5E76\u4E92\u8FDE\u540E\uFF0C\u8FD9\u91CC\u4F1A\u51FA\u73B0\u529B\u5BFC\u5411\u5173\u7CFB\u56FE\u3002": "\u041F\u043E\u043A\u0430 \u043D\u0435\u0447\u0435\u0433\u043E \u0440\u0438\u0441\u043E\u0432\u0430\u0442\u044C \u2014 \u043A\u043E\u0433\u0434\u0430 \u043C\u043E\u0434\u0435\u043B\u044C \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043E\u0431\u044A\u0435\u043A\u0442\u044B \u0447\u0435\u0440\u0435\u0437 esr_node / esr_link \u0438 \u0441\u0432\u044F\u0436\u0435\u0442 \u0438\u0445, \u0437\u0434\u0435\u0441\u044C \u043F\u043E\u044F\u0432\u0438\u0442\u0441\u044F \u0441\u0438\u043B\u043E\u0432\u043E\u0439 \u0433\u0440\u0430\u0444 \u0441\u0432\u044F\u0437\u0435\u0439.",
5508
+ " \u8282\u70B9": " \u0443\u0437\u043B\u043E\u0432",
5509
+ " \u5173\u7CFB": " \u0441\u0432\u044F\u0437\u0435\u0439",
5510
+ " \u60AC\u7A7A\u94FE\u63A5\uFF08\u7AEF\u70B9\u7F3A\u5931\uFF0C\u672A\u7ED8\u5236\uFF09": " \u0432\u0438\u0441\u044F\u0447\u0438\u0435 \u0441\u0432\u044F\u0437\u0438 (\u043A\u043E\u043D\u0435\u0446 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043D\u0435 \u043D\u0430\u0440\u0438\u0441\u043E\u0432\u0430\u043D\u044B)",
5511
+ "\u62D6\u62FD\u8282\u70B9 \xB7 \u6EDA\u8F6E\u7F29\u653E \xB7 \u7A7A\u767D\u5904\u62D6\u62FD\u53EF\u5E73\u79FB": "\u041F\u0435\u0440\u0435\u0442\u0430\u0441\u043A\u0438\u0432\u0430\u0439\u0442\u0435 \u0443\u0437\u043B\u044B \xB7 \u043A\u043E\u043B\u0435\u0441\u043E \u2014 \u043C\u0430\u0441\u0448\u0442\u0430\u0431 \xB7 \u043F\u0435\u0440\u0435\u0442\u0430\u0441\u043A\u0438\u0432\u0430\u043D\u0438\u0435 \u043F\u043E \u043F\u0443\u0441\u0442\u043E\u043C\u0443 \u043C\u0435\u0441\u0442\u0443 \u2014 \u043F\u0430\u043D\u043E\u0440\u0430\u043C\u0430",
5512
+ "\u91CD\u7EC4": "\u041F\u0435\u0440\u0435\u0441\u0442\u0440\u043E\u0438\u0442\u044C",
5513
+ "\u5173\u95ED": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C",
5514
+ " \u6761\u5173\u8054 \xB7 {0} \u6761\u5173\u7CFB": " \u0441\u0432\u044F\u0437\u0435\u0439 \xB7 \u043F\u043E\u043A\u0430\u0437\u0430\u043D\u043E: {0}",
5515
+ "\u6682\u65E0\u5173\u7CFB": "\u0421\u0432\u044F\u0437\u0435\u0439 \u043D\u0435\u0442",
5516
+ " \u6761\u66F4\u591A\u2026": " \u0435\u0449\u0451\u2026",
5517
+ "\u56FE\u4F8B\uFF1A": "\u041B\u0435\u0433\u0435\u043D\u0434\u0430: ",
5518
+ " \u4EFB\u52A1": " \u0437\u0430\u0434\u0430\u0447\u0438",
5519
+ " \u5B9E\u4F53": " \u0441\u0443\u0449\u043D\u043E\u0441\u0442\u0438",
5520
+ "\u8FD8\u6CA1\u6709\u53EF\u7528\u5DE5\u4F5C\u533A \u2014 \u5148\u521B\u5EFA/\u6253\u5F00\u4E00\u4E2A\u5DE5\u4F5C\u533A\uFF0C[ENGRAM] \u6CE8\u5165\u5757\u4F1A\u6309\u5DE5\u4F5C\u533A\u72EC\u7ACB\u6E32\u67D3\u3002": "\u0420\u0430\u0431\u043E\u0447\u0438\u0445 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432 \u043F\u043E\u043A\u0430 \u043D\u0435\u0442 \u2014 \u0441\u043E\u0437\u0434\u0430\u0439\u0442\u0435 \u0438\u043B\u0438 \u043E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E: \u0431\u043B\u043E\u043A [ENGRAM] \u0440\u0435\u043D\u0434\u0435\u0440\u0438\u0442\u0441\u044F \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u043E \u0434\u043B\u044F \u043A\u0430\u0436\u0434\u043E\u0433\u043E.",
5521
+ "\u6CE8\u5165\u9884\u89C8\uFF08[ENGRAM] \xB7 [ESR]\uFF09": "\u041F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0432\u043D\u0435\u0434\u0440\u0435\u043D\u0438\u044F ([ENGRAM] \xB7 [ESR])",
5522
+ "\u6BCF\u4E2A\u4F1A\u8BDD\u5B9E\u9645\u6CE8\u5165\u7684\u63D0\u793A\u5757 \xB7 \u4F1A\u8BDD\u5185\u51BB\u7ED3\u4E00\u6B21\uFF08order 40/41\uFF0C\u524D\u7F00\u7A33\u5B9A\u590D\u7528 KV \u7F13\u5B58\uFF09": "\u0411\u043B\u043E\u043A\u0438, \u0440\u0435\u0430\u043B\u044C\u043D\u043E \u0432\u043D\u0435\u0434\u0440\u044F\u0435\u043C\u044B\u0435 \u0432 \u043A\u0430\u0436\u0434\u0443\u044E \u0441\u0435\u0441\u0441\u0438\u044E \xB7 \u0444\u0438\u043A\u0441\u0438\u0440\u0443\u044E\u0442\u0441\u044F \u043E\u0434\u0438\u043D \u0440\u0430\u0437 \u0437\u0430 \u0441\u0435\u0441\u0441\u0438\u044E (order 40/41, \u0441\u0442\u0430\u0431\u0438\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u0435\u0444\u0438\u043A\u0441 \u043F\u0435\u0440\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 KV-\u043A\u044D\u0448)",
5523
+ "\u8BB0\u5FC6 {0}": "\u041F\u0430\u043C\u044F\u0442\u044C {0}",
5524
+ "\u4EFB\u52A1 {0} active": "\u0417\u0430\u0434\u0430\u0447\u0438 {0} active",
5525
+ "\u5173\u7CFB {0}": "\u0421\u0432\u044F\u0437\u0438 {0}",
5526
+ "\u8282\u70B9 {0}": "\u0423\u0437\u043B\u044B {0}",
5527
+ "\u5171 ~{0} tokens": "\u0412\u0441\u0435\u0433\u043E ~{0} \u0442\u043E\u043A\u0435\u043D\u043E\u0432",
5528
+ "\u8BFB\u53D6\u4E2D\u2026": "\u0427\u0442\u0435\u043D\u0438\u0435\u2026",
5529
+ "\u7D22\u5F15\u5757": "\u0411\u043B\u043E\u043A \u0438\u043D\u0434\u0435\u043A\u0441\u0430",
5530
+ "\u5DF2\u590D\u5236 \u2713": "\u0421\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u043E \u2713",
5531
+ "\u590D\u5236": "\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C",
5532
+ "\u6E32\u67D3\u4E2D\u2026": "\u0420\u0435\u043D\u0434\u0435\u0440\u0438\u043D\u0433\u2026",
5533
+ "\u8BE5\u5DE5\u4F5C\u533A\u6CA1\u6709\u53EF\u6CE8\u5165\u7684\u8BB0\u5FC6/\u4EFB\u52A1/\u5173\u7CFB ([ENGRAM] \u5757\u4E3A\u7A7A)\u3002": "\u0412 \u044D\u0442\u043E\u043C \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0435 \u043D\u0435\u0442 \u043F\u0430\u043C\u044F\u0442\u0438/\u0437\u0430\u0434\u0430\u0447/\u0441\u0432\u044F\u0437\u0435\u0439 \u0434\u043B\u044F \u0432\u043D\u0435\u0434\u0440\u0435\u043D\u0438\u044F (\u0431\u043B\u043E\u043A [ENGRAM] \u043F\u0443\u0441\u0442).",
5534
+ " \u884C": " \u0441\u0442\u0440\u043E\u043A",
5535
+ " \u5B57\u7B26": " \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432",
5536
+ "\u4EFB\u52A1 \xB7 \u95ED\u73AF\u5757": "\u0417\u0430\u0434\u0430\u0447\u0438 \xB7 \u0431\u043B\u043E\u043A \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u044F",
5537
+ "\u8BE5\u5DE5\u4F5C\u533A\u6CA1\u6709\u4EFB\u52A1 ([ESR] \u5757\u4E3A\u7A7A)\u3002": "\u0412 \u044D\u0442\u043E\u043C \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0435 \u043D\u0435\u0442 \u0437\u0430\u0434\u0430\u0447 (\u0431\u043B\u043E\u043A [ESR] \u043F\u0443\u0441\u0442).",
5538
+ "\u8BF4\u660E\uFF1A\u5757\u7531\u4E0E\u7CFB\u7EDF\u63D0\u793A\u76F8\u540C\u7684\u7EAF\u51FD\u6570\u5B9E\u65F6\u6E32\u67D3\uFF08\u6BCF 20s \u5237\u65B0\uFF09\uFF1B\u300Cescalate:\u300D\u884C\u662F\u6700\u8FD1 14 \u5929 mem/esr \u8C03\u7528\u5931\u8861\u65F6\u81EA\u52A8\u9644\u52A0\u7684\u6570\u636E\u9A71\u52A8\u63D0\u9192\uFF0C\u884C\u4E3A\u6539\u5584\u540E\u81EA\u52A8\u6D88\u5931\u3002\u590D\u5236\u6309\u94AE\u53EF\u76F4\u63A5\u628A\u6CE8\u5165\u5757 \u8D34\u8FDB\u63D0\u793A\u8BCD\u5BA1\u8BA1\u3002": "\u041F\u043E\u044F\u0441\u043D\u0435\u043D\u0438\u0435: \u0431\u043B\u043E\u043A\u0438 \u0440\u0435\u043D\u0434\u0435\u0440\u044F\u0442\u0441\u044F \u0442\u043E\u0439 \u0436\u0435 \u0447\u0438\u0441\u0442\u043E\u0439 \u0444\u0443\u043D\u043A\u0446\u0438\u0435\u0439, \u0447\u0442\u043E \u0438 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u044B\u0439 \u043F\u0440\u043E\u043C\u043F\u0442 (\u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 \u043A\u0430\u0436\u0434\u044B\u0435 20 \u0441); \u0441\u0442\u0440\u043E\u043A\u0430 \xABescalate:\xBB \u2014 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430 \u043F\u043E \u0434\u0430\u043D\u043D\u044B\u043C, \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u043C\u0430\u044F \u043F\u0440\u0438 \u0434\u0438\u0441\u0431\u0430\u043B\u0430\u043D\u0441\u0435 \u0432\u044B\u0437\u043E\u0432\u043E\u0432 mem/esr \u0437\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 14 \u0434\u043D\u0435\u0439, \u0438 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442 \u043F\u0440\u0438 \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0438. \u041A\u043D\u043E\u043F\u043A\u0430 \u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442 \u0431\u043B\u043E\u043A \u043F\u0440\u044F\u043C\u043E \u0432 \u0430\u0443\u0434\u0438\u0442 \u043F\u0440\u043E\u043C\u043F\u0442\u0430.",
5539
+ "\u65E0\u6CD5\u89E3\u6790 {0}\uFF1A{1}": "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u0442\u044C {0}: {1}",
5540
+ "\u66FF\u6362\u6A21\u5F0F\u4F1A\u5148\u6E05\u7A7A\u76EE\u6807\u5DE5\u4F5C\u533A \u2014 \u8BF7\u5148\u52FE\u9009\u786E\u8BA4": "\u0420\u0435\u0436\u0438\u043C \u0437\u0430\u043C\u0435\u043D\u044B \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u043E\u0447\u0438\u0449\u0430\u0435\u0442 \u0446\u0435\u043B\u0435\u0432\u043E\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u2014 \u043E\u0442\u043C\u0435\u0442\u044C\u0442\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u0435",
5541
+ "\u8BC1\u636E\u4ECD\u6709\u7F3A\u53E3\uFF1A{0}{1} \u2014 \u4EFB\u52A1\u4FDD\u6301 ACTIVE\uFF0C\u8865\u9F50\u540E\u518D\u63D0\u4EA4": "\u0414\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432 \u0432\u0441\u0451 \u0435\u0449\u0451 \u043D\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442: {0}{1} \u2014 \u0437\u0430\u0434\u0430\u0447\u0430 \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F ACTIVE; \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u0438 \u043E\u0442\u043F\u0440\u0430\u0432\u044C\u0442\u0435 \u0441\u043D\u043E\u0432\u0430",
5542
+ "\u8BB0\u5FC6 {0} \u4E0D\u5728\u5F53\u524D\u52A0\u8F7D\u5217\u8868 \u2014 \u5207\u6362\u5230\u300C\u8BB0\u5FC6\u300D\u9875\u52A0\u8F7D\u540E\u53EF\u7528": "\u041F\u0430\u043C\u044F\u0442\u044C {0} \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0442\u0435\u043A\u0443\u0449\u0435\u043C \u0441\u043F\u0438\u0441\u043A\u0435 \u2014 \u043F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043D\u0430 \u0432\u043A\u043B\u0430\u0434\u043A\u0443 \xAB\u041F\u0430\u043C\u044F\u0442\u044C\xBB, \u0447\u0442\u043E\u0431\u044B \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0435\u0451",
5543
+ "Engram \u8BB0\u5FC6": "\u041F\u0430\u043C\u044F\u0442\u044C Engram",
5544
+ "\u8DE8\u4F1A\u8BDD\u8BB0\u5FC6 \xB7 \u96F6 LLM \u81EA\u52A8\u6355\u83B7 \xB7 \u7B26\u53F7\u7D22\u5F15\u6E10\u8FDB\u62AB\u9732 \u2014 \u6570\u636E\u6E90 ~/.dsh/storages/dsh_engram.json": "\u041F\u0430\u043C\u044F\u0442\u044C \u043C\u0435\u0436\u0434\u0443 \u0441\u0435\u0441\u0441\u0438\u044F\u043C\u0438 \xB7 \u0430\u0432\u0442\u043E\u0437\u0430\u0445\u0432\u0430\u0442 \u0431\u0435\u0437 LLM \xB7 \u043F\u043E\u0441\u0442\u0435\u043F\u0435\u043D\u043D\u043E\u0435 \u0440\u0430\u0441\u043A\u0440\u044B\u0442\u0438\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044C\u043D\u043E\u0433\u043E \u0438\u043D\u0434\u0435\u043A\u0441\u0430 \u2014 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A ~/.dsh/storages/dsh_engram.json",
5545
+ "\u8BB0\u5FC6": "\u041F\u0430\u043C\u044F\u0442\u044C",
5546
+ "ESR\uFF08\u4EFB\u52A1 \xB7 \u8282\u70B9 \xB7 \u5173\u7CFB\uFF09": "ESR (\u0437\u0430\u0434\u0430\u0447\u0438 \xB7 \u0443\u0437\u043B\u044B \xB7 \u0441\u0432\u044F\u0437\u0438)",
5547
+ "\u6CE8\u5165\u9884\u89C8": "\u041F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0432\u043D\u0435\u0434\u0440\u0435\u043D\u0438\u044F",
5548
+ "\u9065\u6D4B": "\u0422\u0435\u043B\u0435\u043C\u0435\u0442\u0440\u0438\u044F",
5549
+ "\u8BBE\u7F6E": "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438",
5550
+ "\u5DE5\u4F5C\u533A\uFF1A": "\u0420\u0430\u0431\u043E\u0447\u0435\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E: ",
5551
+ " \u6761\uFF09": " \u0437\u0430\u043F\u0438\u0441\u0435\u0439)",
5552
+ "Playbook \u5F85\u6279\u51C6\uFF08{0} \u6761 / \u5171 {1}\uFF09": "Playbook \u0436\u0434\u0451\u0442 \u043E\u0434\u043E\u0431\u0440\u0435\u043D\u0438\u044F ({0} \u0438\u0437 {1})",
5553
+ "\u8BC1\u636E\u5DF2\u8FC7\u5173\uFF08\u22653 \u6B21\u9A8C\u8BC1\u300114 \u5929\u5185\uFF09\u3002\u5199\u6587\u4EF6\u7ED9\u5BBF\u4E3B\u5E7F\u544A\u9700\u8981\u4F60\u70B9\u5934 \u2014\u2014 \u8BC1\u636E\u8BC1\u660E\u547D\u4EE4\u8DD1\u901A\u8FC7\uFF0C\u4E0D\u8BC1\u660E\u6307\u4EE4\u662F\u5BF9\u7684\u3002 \u6279\u51C6\u540E\uFF1A": "\u0414\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430 \u043F\u0440\u043E\u0448\u043B\u0438 (\u22653 \u043F\u0440\u043E\u0432\u0435\u0440\u043E\u043A \u0437\u0430 14 \u0434\u043D\u0435\u0439). \u0417\u0430\u043F\u0438\u0441\u044C \u0444\u0430\u0439\u043B\u0430 \u0441 \u0440\u0435\u043A\u043B\u0430\u043C\u043E\u0439 host \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u0430\u0448\u0435\u0433\u043E \u0441\u043E\u0433\u043B\u0430\u0441\u0438\u044F \u2014 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044E\u0442, \u0447\u0442\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u043B\u0430\u0441\u044C, \u043D\u043E \u043D\u0435 \u0435\u0451 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E\u0441\u0442\u044C. \u041F\u043E\u0441\u043B\u0435 \u043E\u0434\u043E\u0431\u0440\u0435\u043D\u0438\u044F:",
5554
+ " \xB7 \u8BC1\u636E {0} \u6B21": " \xB7 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432: {0}",
5555
+ "\u64A4\u9500": "\u041E\u0442\u043E\u0437\u0432\u0430\u0442\u044C",
5556
+ "\u6279\u51C6": "\u041E\u0434\u043E\u0431\u0440\u0438\u0442\u044C",
5557
+ "\u8BB0\u5FC6 (active)": "\u041F\u0430\u043C\u044F\u0442\u044C (active)",
5558
+ "\u8BB0\u5FC6 (active, \u5168\u5C40)": "\u041F\u0430\u043C\u044F\u0442\u044C (active, \u0432\u0441\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430)",
5559
+ "\u4EFB\u52A1 (active)": "\u0417\u0430\u0434\u0430\u0447\u0438 (active)",
5560
+ "\u4EFB\u52A1 (active, \u5168\u5C40)": "\u0417\u0430\u0434\u0430\u0447\u0438 (active, \u0432\u0441\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430)",
5561
+ "\u5173\u7CFB (\u5168\u5C40)": "\u0421\u0432\u044F\u0437\u0438 (\u0432\u0441\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430)",
5562
+ "\u8282\u70B9 (\u5168\u5C40)": "\u0423\u0437\u043B\u044B (\u0432\u0441\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430)",
5563
+ "\u5DE5\u4F5C\u533A": "\u041F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E",
5564
+ "[ENGRAM] \u7D22\u5F15 token / \u5DE5\u4F5C\u533A": "\u0422\u043E\u043A\u0435\u043D\u044B \u0438\u043D\u0434\u0435\u043A\u0441\u0430 [ENGRAM] \u043D\u0430 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E",
5565
+ "GC \u5DF2\u5F52\u6863 \xB7 \u94FE\u63A5-{0}": "GC \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043B \xB7 \u0441\u0432\u044F\u0437\u0435\u0439: {0}",
5566
+ "\u4E0A\u4E0B\u6587\u51C0 token \xB7 \u8BF7\u6C42 {0}": "\u0427\u0438\u0441\u0442\u044B\u0435 \u0442\u043E\u043A\u0435\u043D\u044B \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430 \xB7 \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432: {0}",
5567
+ "\u8BB0\u5FC6 GC\uFF08pi-esr \u7EA6\u675F\uFF09": "GC \u043F\u0430\u043C\u044F\u0442\u0438 (\u043F\u0440\u0430\u0432\u0438\u043B\u0430 pi-esr)",
5568
+ "\u4EC5\u9884\u89C8\uFF08dry run\uFF09": "\u0422\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 (dry run)",
5569
+ "\u8FD0\u884C GC": "\u0417\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C GC",
5570
+ "\u4E0A\u6B21 {0}": "\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0439 \u0440\u0430\u0437 {0}",
5571
+ "\u5DE5\u4F5C\u96C6\uFF08active \u4EFB\u52A1\u5F15\u7528 / \u4EFB\u52A1\u8BB0\u5FC6 / \u5DF2\u5165\u7D22\u5F15\u547D\u4E2D\uFF09\u6C38\u4E0D\u9A71\u9010\uFF1BTTL \u8FC7\u671F\u5F52\u6863\u3001\u8D85\u5BB9\u91CF\u6DD8\u6C70\u3001stable \u4EFB\u52A1\u8D85\u7A97\u5F52\u6863\u3001\u60AC\u7A7A\u94FE\u63A5\u6E05\u7406\u3002\u53EA\u5F52\u6863\u4E0D\u786C\u5220\u2014\u2014\u6761\u76EE id \u4FDD\u6301\u53EF\u91CD\u53D6\u3002": "\u0420\u0430\u0431\u043E\u0447\u0438\u0439 \u043D\u0430\u0431\u043E\u0440 (\u0441\u0441\u044B\u043B\u043A\u0438 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u0437\u0430\u0434\u0430\u0447 / \u043F\u0430\u043C\u044F\u0442\u044C \u0437\u0430\u0434\u0430\u0447 / \u043F\u043E\u043F\u0430\u0434\u0430\u043D\u0438\u044F \u0432 \u0438\u043D\u0434\u0435\u043A\u0441) \u043D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u0432\u044B\u0442\u0435\u0441\u043D\u044F\u0435\u0442\u0441\u044F; \u0438\u0441\u0442\u0451\u043A\u0448\u0438\u0435 \u043F\u043E TTL \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0443\u044E\u0442\u0441\u044F, \u0441\u0432\u0435\u0440\u0445 \u043B\u0438\u043C\u0438\u0442\u0430 \u0432\u044B\u0442\u0435\u0441\u043D\u044F\u044E\u0442\u0441\u044F, \u0437\u0430\u043A\u0440\u044B\u0442\u044B\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u043D\u0435 \u043E\u043A\u043D\u0430 \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0443\u044E\u0442\u0441\u044F, \u0432\u0438\u0441\u044F\u0447\u0438\u0435 \u0441\u0432\u044F\u0437\u0438 \u0447\u0438\u0441\u0442\u044F\u0442\u0441\u044F. \u0422\u043E\u043B\u044C\u043A\u043E \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435, \u0431\u0435\u0437 \u0436\u0451\u0441\u0442\u043A\u043E\u0433\u043E \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u2014 id \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u043C \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u043E\u0433\u043E \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F.",
5572
+ "dry-run \u9884\u89C8\uFF1A": "\u041F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 dry-run: ",
5573
+ "\u5DF2\u6267\u884C\uFF1A": "\u0412\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u043E: ",
5574
+ "\u5F52\u6863\u8BB0\u5FC6 ": "\u0412 \u0430\u0440\u0445\u0438\u0432 \u043F\u0430\u043C\u044F\u0442\u0438: ",
5575
+ " \xB7 \u5F52\u6863\u4EFB\u52A1 ": " \xB7 \u0432 \u0430\u0440\u0445\u0438\u0432 \u0437\u0430\u0434\u0430\u0447: ",
5576
+ " \xB7 \u6E05\u7406\u94FE\u63A5 ": " \xB7 \u043E\u0447\u0438\u0449\u0435\u043D\u043E \u0441\u0432\u044F\u0437\u0435\u0439: ",
5577
+ " \xB7 \u4FDD\u62A4 ": " \xB7 \u0437\u0430\u0449\u0438\u0449\u0435\u043D\u043E: ",
5578
+ "\u6570\u636E\u5907\u4EFD\uFF08export / import\uFF09": "\u0420\u0435\u0437\u0435\u0440\u0432\u043D\u0430\u044F \u043A\u043E\u043F\u0438\u044F (export / import)",
5579
+ "\u4E0B\u8F7D\u5F53\u524D\u5DE5\u4F5C\u533A\uFF08\u6216\u5168\u90E8\uFF09\u7684 dsh-engram/export v1 \u8F6C\u50A8": "\u0421\u043A\u0430\u0447\u0430\u0442\u044C \u0434\u0430\u043C\u043F dsh-engram/export v1 \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E (\u0438\u043B\u0438 \u0432\u0441\u0435\u0445) \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430",
5580
+ "\u5BFC\u51FA JSON": "\u042D\u043A\u0441\u043F\u043E\u0440\u0442 JSON",
5581
+ "\u9009\u62E9\u5BFC\u5165\u6587\u4EF6\u2026": "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u0430\u0439\u043B \u0434\u043B\u044F \u0438\u043C\u043F\u043E\u0440\u0442\u0430\u2026",
5582
+ "\u5BFC\u51FA\u5373\u53EF\u79FB\u690D\u5907\u4EFD\uFF08\u8BB0\u5FC6/\u4EFB\u52A1/\u5173\u7CFB/\u8282\u70B9\uFF0C\u542B\u5F52\u6863\uFF09\uFF1B": "\u042D\u043A\u0441\u043F\u043E\u0440\u0442 \u2014 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u043C\u0430\u044F \u043A\u043E\u043F\u0438\u044F (\u043F\u0430\u043C\u044F\u0442\u044C/\u0437\u0430\u0434\u0430\u0447\u0438/\u0441\u0432\u044F\u0437\u0438/\u0443\u0437\u043B\u044B, \u0432\u043A\u043B\u044E\u0447\u0430\u044F \u0430\u0440\u0445\u0438\u0432); ",
5583
+ " \u53EA\u8865\u7F3A\u5931\uFF08\u5E42\u7B49\uFF09\uFF0C": " \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0435\u0435 (\u0438\u0434\u0435\u043C\u043F\u043E\u0442\u0435\u043D\u0442\u043D\u043E), ",
5584
+ " \u5148\u6E05\u7A7A\u76EE\u6807\u5DE5\u4F5C\u533A\u518D\u6062\u590D\u3002\u8BB0\u5FC6\u6B63\u6587\u4E0E\u6240\u6709\u5199\u5165\u8DEF\u5F84\u4E00\u6837\u8FC7\u8131\u654F\u3002": " \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u043E\u0447\u0438\u0449\u0430\u0435\u0442 \u0446\u0435\u043B\u0435\u0432\u043E\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E, \u0437\u0430\u0442\u0435\u043C \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u0442. \u0422\u0435\u043A\u0441\u0442 \u043F\u0430\u043C\u044F\u0442\u0438, \u043A\u0430\u043A \u0438 \u0432\u0441\u0435 \u043F\u0443\u0442\u0438 \u0437\u0430\u043F\u0438\u0441\u0438, \u043F\u0440\u043E\u0445\u043E\u0434\u0438\u0442 \u0434\u0435\u043F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044E.",
5585
+ "\u5408\u5E76\uFF08merge\uFF0C\u5E42\u7B49\uFF09": "\u0421\u043B\u0438\u044F\u043D\u0438\u0435 (merge, \u0438\u0434\u0435\u043C\u043F\u043E\u0442\u0435\u043D\u0442\u043D\u043E)",
5586
+ "\u66FF\u6362\uFF08replace\uFF0C\u5148\u6E05\u7A7A\u5DE5\u4F5C\u533A\uFF09": "\u0417\u0430\u043C\u0435\u043D\u0430 (replace, \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u043E\u0447\u0438\u0449\u0430\u0435\u0442 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E)",
5587
+ "\u6211\u786E\u8BA4\u66FF\u6362{0}": "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044E \u0437\u0430\u043C\u0435\u043D\u0443{0}",
5588
+ "\uFF08\u9700\u5148\u9009\u5DE5\u4F5C\u533A\uFF09": " (\u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E)",
5589
+ "\u9884\u89C8\u5BFC\u5165": "\u041F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0438\u043C\u043F\u043E\u0440\u0442\u0430",
5590
+ "\u6267\u884C\u5BFC\u5165": "\u0412\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u0438\u043C\u043F\u043E\u0440\u0442",
5591
+ "\u5DF2\u5BFC\u5165\uFF1A": "\u0418\u043C\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043E: ",
5592
+ " \xB7 \u8DF3\u8FC7 {0}": " \xB7 \u043F\u0440\u043E\u043F\u0443\u0449\u0435\u043D\u043E: {0}",
5593
+ "\u5168\u90E8\u7C7B\u578B": "\u0412\u0441\u0435 \u0442\u0438\u043F\u044B",
5594
+ "\u4EC5\u6D3B\u52A8": "\u0422\u043E\u043B\u044C\u043A\u043E \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0435",
5595
+ "\u5168\u90E8\u72B6\u6001": "\u0412\u0441\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u044B",
5596
+ "\u5DF2\u5F52\u6863": "\u0412 \u0430\u0440\u0445\u0438\u0432\u0435",
5597
+ "\u641C\u7D22\u8BB0\u5FC6\u2026": "\u041F\u043E\u0438\u0441\u043A \u043F\u0430\u043C\u044F\u0442\u0438\u2026",
5598
+ " \u884C / {0} \u5B57\u7B26": " \u0441\u0442\u0440\u043E\u043A / {0} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432",
5599
+ "\u7C7B\u578B": "\u0422\u0438\u043F",
5600
+ "\u6682\u65E0\u8BB0\u5FC6 \u2014 \u4F7F\u7528 engram_store \u663E\u5F0F\u8BB0\u5F55\uFF0C\u6216\u8BA9\u81EA\u52A8\u6355\u83B7\u5DE5\u4F5C\uFF08git \u63D0\u4EA4 / \u5173\u952E\u6587\u4EF6\u7F16\u8F91 / \u5DE5\u5177\u9519\u8BEF\uFF09": "\u041F\u0430\u043C\u044F\u0442\u0438 \u043F\u043E\u043A\u0430 \u043D\u0435\u0442 \u2014 \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u0435 \u044F\u0432\u043D\u043E \u0447\u0435\u0440\u0435\u0437 engram_store \u0438\u043B\u0438 \u0434\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0431\u043E\u0442\u0430\u0442\u044C \u0430\u0432\u0442\u043E\u0437\u0430\u0445\u0432\u0430\u0442\u0443 (git-\u043A\u043E\u043C\u043C\u0438\u0442\u044B / \u043F\u0440\u0430\u0432\u043A\u0438 \u043A\u043B\u044E\u0447\u0435\u0432\u044B\u0445 \u0444\u0430\u0439\u043B\u043E\u0432 / \u043E\u0448\u0438\u0431\u043A\u0438 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432)",
5601
+ " \u6761": " \u0437\u0430\u043F\u0438\u0441\u0435\u0439",
5602
+ "\u5DF2\u88AB {0} \u66FF\u4EE3\uFF08\u65E7\u884C\u4FDD\u7559\u3001\u53EC\u56DE\u964D\u7EA7\uFF09": "\u0417\u0430\u043C\u0435\u043D\u0435\u043D\u043E \u043D\u0430 {0} (\u0441\u0442\u0430\u0440\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0430, \u0445\u0443\u0436\u0435 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F)",
5603
+ "\u5DF2\u66FF\u6362": "\u0417\u0430\u043C\u0435\u043D\u0435\u043D\u043E",
5604
+ "\u5C55\u5F00\u5168\u6587": "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u043E\u043B\u043D\u043E\u0441\u0442\u044C\u044E",
5605
+ "\u6253\u5F00\u88AB\u66FF\u4EE3\u7684\u65E7\u8BB0\u5FC6 {0}": "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0442\u0430\u0440\u0443\u044E \u0437\u0430\u043C\u0435\u043D\u0451\u043D\u043D\u0443\u044E \u043F\u0430\u043C\u044F\u0442\u044C {0}",
5606
+ "\u5728\u4FA7\u680F\u6253\u5F00\u8BE6\u60C5": "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0434\u0435\u0442\u0430\u043B\u0438 \u0432 \u0431\u043E\u043A\u043E\u0432\u043E\u0439 \u043F\u0430\u043D\u0435\u043B\u0438",
5607
+ "\u8BE6\u60C5": "\u0414\u0435\u0442\u0430\u043B\u0438",
5608
+ "\u5F52\u6863\uFF08TTL/\u8F6F\u5220\uFF0C\u53EF\u6062\u590D\u4E0D\u8F7D\u5165\u7D22\u5F15\uFF09": "\u0410\u0440\u0445\u0438\u0432 (TTL/\u043C\u044F\u0433\u043A\u043E\u0435 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435, \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u043C\u0430, \u043D\u0435 \u043F\u043E\u043F\u0430\u0434\u0430\u0435\u0442 \u0432 \u0438\u043D\u0434\u0435\u043A\u0441)",
5609
+ "\u5F52\u6863": "\u0410\u0440\u0445\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u0442\u044C",
5610
+ "\u6C38\u4E45\u5220\u9664": "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043D\u0430\u0432\u0441\u0435\u0433\u0434\u0430",
5611
+ "\u5220\u9664\u8FD9\u6761\u8BB0\u5FC6?\n{0}": "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u044D\u0442\u0443 \u0437\u0430\u043F\u0438\u0441\u044C?\n{0}",
5612
+ "\u5220\u9664": "\u0423\u0434\u0430\u043B\u0438\u0442\u044C",
5613
+ "\u2039 \u4E0A\u4E00\u9875": "\u2039 \u041D\u0430\u0437\u0430\u0434",
5614
+ "\u7B2C {0} / {1} \u9875 \xB7 \u5171 {2} \u6761": "\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430 {0} \u0438\u0437 {1} \xB7 \u0432\u0441\u0435\u0433\u043E {2}",
5615
+ "\u4E0B\u4E00\u9875 \u203A": "\u0412\u043F\u0435\u0440\u0451\u0434 \u203A",
5616
+ "\u5DE5\u5177\u8C03\u7528\u4E0E\u547D\u4E2D\u7EDF\u8BA1\u89C1\u300C\u9065\u6D4B\u300Dtab\uFF1B[ESR] \u6CE8\u5165\u5757\u7684 escalate \u63D0\u9192\u4F9D\u636E\u771F\u5B9E\u6570\u636E\u52A8\u6001\u51FA\u73B0\u3002": "\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 \u0432\u044B\u0437\u043E\u0432\u043E\u0432 \u0438 \u043F\u043E\u043F\u0430\u0434\u0430\u043D\u0438\u0439 \u2014 \u043D\u0430 \u0432\u043A\u043B\u0430\u0434\u043A\u0435 \xAB\u0422\u0435\u043B\u0435\u043C\u0435\u0442\u0440\u0438\u044F\xBB; \u043D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u044F escalate \u0432 \u0431\u043B\u043E\u043A\u0435 [ESR] \u043F\u043E\u044F\u0432\u043B\u044F\u044E\u0442\u0441\u044F \u043F\u043E \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u043C \u0434\u0430\u043D\u043D\u044B\u043C.",
5617
+ "\u5217\u8868": "\u0421\u043F\u0438\u0441\u043E\u043A",
5618
+ "\u5173\u7CFB\u56FE\u8C31\uFF08esr_link \u529B\u5BFC\u5411\u56FE\uFF09": "\u0413\u0440\u0430\u0444 \u0441\u0432\u044F\u0437\u0435\u0439 (\u0441\u0438\u043B\u043E\u0432\u043E\u0439 \u0433\u0440\u0430\u0444 esr_link)",
5619
+ "\u5DE5\u4F5C\u533A\uFF1A{0}": "\u0420\u0430\u0431\u043E\u0447\u0435\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E: {0}",
5620
+ "ESR \u4EFB\u52A1\uFF08\u8BC1\u636E\u95ED\u73AF\uFF09": "\u0417\u0430\u0434\u0430\u0447\u0438 ESR (\u0437\u0430\u043A\u0440\u044B\u0442\u0438\u0435 \u0441 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430\u043C\u0438)",
5621
+ "\xB7 \u5168\u90E8\u5DE5\u4F5C\u533A": "\xB7 \u0412\u0441\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430",
5622
+ "\u65B0\u5EFA\u4EFB\u52A1": "\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0437\u0430\u0434\u0430\u0447\u0443",
5623
+ "\u6682\u65E0\u4EFB\u52A1 \u2014 \u7528\u4E0A\u65B9\u300C\u65B0\u5EFA\u4EFB\u52A1\u300D\u6216 esr_task \u5DE5\u5177\u521B\u5EFA": "\u0417\u0430\u0434\u0430\u0447 \u043F\u043E\u043A\u0430 \u043D\u0435\u0442 \u2014 \u0441\u043E\u0437\u0434\u0430\u0439\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 \xAB\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0437\u0430\u0434\u0430\u0447\u0443\xBB \u0432\u044B\u0448\u0435 \u0438\u043B\u0438 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 esr_task",
5624
+ " \u4E2A\u4EFB\u52A1": " \u0437\u0430\u0434\u0430\u0447",
5625
+ "\u586B\u5199\u8BC1\u636E\u5173\u95ED\u2026": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0441 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430\u043C\u0438\u2026",
5626
+ "\u7F3A\u53E3\uFF1A{0} \u2014 \u63D0\u4F9B artifact / evaluation / memory_ref \u540E\u8F6C\u4E3A STABLE": "\u041F\u0440\u043E\u0431\u0435\u043B\u044B: {0} \u2014 \u043F\u043E\u0441\u043B\u0435 artifact / evaluation / memory_ref \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u0430\u043D\u0435\u0442 STABLE",
5627
+ "\u8BB0\u5FC6\u5F15\u7528\uFF1A": "\u0421\u0441\u044B\u043B\u043A\u0438 \u043D\u0430 \u043F\u0430\u043C\u044F\u0442\u044C: ",
5628
+ "\u63D0\u4F9B\u8BC1\u636E\u540E\u5173\u95ED\uFF08\u4E09\u9879\u5168\u9F50\u624D\u8F6C STABLE\uFF09": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0441 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430\u043C\u0438 (STABLE \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u043E\u0433\u0434\u0430 \u0432\u0441\u0435 \u0442\u0440\u0438 \u0435\u0441\u0442\u044C)",
5629
+ "artifact \u8DEF\u5F84/URL": "\u041F\u0443\u0442\u044C/URL artifact",
5630
+ "evaluation \u9A8C\u8BC1\u8BC1\u636E": "\u0414\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u043E \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 evaluation",
5631
+ "memory_refs \u9017\u53F7\u5206\u9694": "memory_refs \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043F\u044F\u0442\u0443\u044E",
5632
+ "\u63D0\u4EA4\u5173\u95ED": "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u0435",
5633
+ "\u8282\u70B9\u4E0E\u5173\u7CFB\uFF08esr_node / esr_link\uFF09": "\u0423\u0437\u043B\u044B \u0438 \u0441\u0432\u044F\u0437\u0438 (esr_node / esr_link)",
5634
+ "\u6682\u65E0\u8282\u70B9 \u2014 \u6A21\u578B\u4F1A\u4E3A\u53CD\u590D\u51FA\u73B0\u7684\u9886\u57DF\u5BF9\u8C61\u4E3B\u52A8\u767B\u8BB0\uFF08esr_node\uFF09\uFF0C\u6B64\u5904\u4E5F\u53EF\u67E5\u770B\u5173\u7CFB": "\u0423\u0437\u043B\u043E\u0432 \u043F\u043E\u043A\u0430 \u043D\u0435\u0442 \u2014 \u043C\u043E\u0434\u0435\u043B\u044C \u0441\u0430\u043C\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u044E\u0449\u0438\u0435\u0441\u044F \u043E\u0431\u044A\u0435\u043A\u0442\u044B (esr_node); \u0437\u0434\u0435\u0441\u044C \u0436\u0435 \u043C\u043E\u0436\u043D\u043E \u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0441\u0432\u044F\u0437\u0438",
5635
+ " \u4E2A\u8282\u70B9": " \u0443\u0437\u043B\u043E\u0432",
5636
+ "\u5728\u4FA7\u680F\u6253\u5F00\u8282\u70B9\u8BE6\u60C5": "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0434\u0435\u0442\u0430\u043B\u0438 \u0443\u0437\u043B\u0430 \u0432 \u0431\u043E\u043A\u043E\u0432\u043E\u0439 \u043F\u0430\u043D\u0435\u043B\u0438",
5637
+ "\u5173\u7CFB\uFF1A": "\u0421\u0432\u044F\u0437\u0438: ",
5638
+ "\u6682\u65E0\u5173\u7CFB \u2014 esr_link \u521B\u5EFA": "\u0421\u0432\u044F\u0437\u0435\u0439 \u043D\u0435\u0442 \u2014 \u0441\u043E\u0437\u0434\u0430\u0439\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 esr_link",
5639
+ " \u6761\u5173\u7CFB": " \u0441\u0432\u044F\u0437\u0435\u0439",
5640
+ "\u5728\u4FA7\u680F\u6253\u5F00\u5173\u7CFB\u8BE6\u60C5": "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0434\u0435\u0442\u0430\u043B\u0438 \u0441\u0432\u044F\u0437\u0438 \u0432 \u0431\u043E\u043A\u043E\u0432\u043E\u0439 \u043F\u0430\u043D\u0435\u043B\u0438",
5641
+ "\u8BBE\u7F6E\u9762\u677F\u4E0D\u53EF\u7528\uFF1Ahost \u6CA1\u6709\u4E3A dsh-engram \u63D0\u4F9B\u8BBE\u7F6E\u547D\u540D\u7A7A\u95F4\uFF08\u65E7\u7248 DSH \u8D70\u300C\u63D2\u4EF6\u300D\u2192 \u914D\u7F6E tab\uFF09\u3002": "\u041F\u0430\u043D\u0435\u043B\u044C \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430: host \u043D\u0435 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u0438\u043B \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u0438\u043C\u0451\u043D \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A \u0434\u043B\u044F dsh-engram (\u0432 \u0441\u0442\u0430\u0440\u044B\u0445 DSH \u2014 \u0432\u043A\u043B\u0430\u0434\u043A\u0430 \xAB\u041F\u043B\u0430\u0433\u0438\u043D\u044B\xBB \u2192 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F).",
5642
+ "\u6E90\u81EA\u4F1A\u8BDD\u8BA1\u5212\uFF08todo_write \u4E00\u952E\u6C89\u6DC0\uFF09": "\u0418\u0437 \u043F\u043B\u0430\u043D\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 (\u043F\u0435\u0440\u0435\u043D\u043E\u0441 \u0438\u0437 todo_write)",
5643
+ "\u6C89\u6DC0\u5931\u8D25\uFF1A{0} \u9879\u672A\u80FD\u521B\u5EFA\uFF08\u5DE5\u4F5C\u533A\u5DF2\u6EE1\u6216\u670D\u52A1\u4E0D\u53EF\u8FBE\uFF09\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u8BD5": "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u0435\u0440\u0435\u043D\u0435\u0441\u0442\u0438: {0} \u0437\u0430\u043F\u0438\u0441\u0435\u0439 \u043D\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u043E (\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u043E \u0438\u043B\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D); \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 \u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0435",
5644
+ "\u90E8\u5206\u5931\u8D25\uFF1A{0}/{1} \u9879\u672A\u80FD\u521B\u5EFA": "\u0427\u0430\u0441\u0442\u0438\u0447\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430: \u043D\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u043E {0} \u0438\u0437 {1}",
5645
+ "\u8DDF\u968F\u5F53\u524D\u4F1A\u8BDD \xB7 \u5DE5\u4F5C\u533A {0}\uFF08\u70B9\u51FB\u5207\u6362 ESR \u4EFB\u52A1\u6765\u6E90\uFF09": "\u0421\u043B\u0435\u0434\u0443\u0435\u0442 \u0437\u0430 \u0441\u0435\u0441\u0441\u0438\u0435\u0439 \xB7 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E {0} (\u043D\u0430\u0436\u043C\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u0441\u043C\u0435\u043D\u0438\u0442\u044C \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A \u0437\u0430\u0434\u0430\u0447 ESR)",
5646
+ "\u5DF2\u56FA\u5B9A\u5230 {0}\uFF08\u70B9\u51FB\u5207\u6362\uFF09": "\u0417\u0430\u043A\u0440\u0435\u043F\u043B\u0435\u043D\u043E \u0437\u0430 {0} (\u043D\u0430\u0436\u043C\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u0441\u043C\u0435\u043D\u0438\u0442\u044C)",
5647
+ "\u6062\u590D\u8DDF\u968F\u5F53\u524D\u4F1A\u8BDD": "\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u043A \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0438",
5648
+ "\u8DDF\u968F\u4F1A\u8BDD \xB7 {0}{1}": "\u0421\u043B\u0435\u0434\u0443\u0435\u0442 \u0437\u0430 \u0441\u0435\u0441\u0441\u0438\u0435\u0439 \xB7 {0}{1}",
5649
+ "\u6682\u65E0\u5176\u4ED6\u5DE5\u4F5C\u533A": "\u0414\u0440\u0443\u0433\u0438\u0445 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432 \u043D\u0435\u0442",
5650
+ "\u4EC5\u5207\u6362 ESR \u4EFB\u52A1/\u5173\u7CFB\u6765\u6E90\uFF1B\u5185\u7F6E todo \u4ECD\u5C5E\u672C\u4F1A\u8BDD": "\u041C\u0435\u043D\u044F\u0435\u0442 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A \u0442\u043E\u043B\u044C\u043A\u043E \u0437\u0430\u0434\u0430\u0447/\u0441\u0432\u044F\u0437\u0435\u0439 ESR; \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0439 todo \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u0432 \u044D\u0442\u043E\u0439 \u0441\u0435\u0441\u0441\u0438\u0438",
5651
+ "\u672C\u8F6E\u8BA1\u5212 {0}": "\u041F\u043B\u0430\u043D \u0445\u043E\u0434\u0430 {0}",
5652
+ "\u8FDB\u884C\u4E2D {0}": "\u0412 \u0440\u0430\u0431\u043E\u0442\u0435 {0}",
5653
+ "\u5C31\u7EEA {0}": "\u0413\u043E\u0442\u043E\u0432\u043E {0}",
5654
+ "\u5DF2\u95ED\u73AF {0}": "\u0417\u0430\u043A\u0440\u044B\u0442\u043E {0}",
5655
+ "API \u5931\u8D25": "\u041E\u0448\u0438\u0431\u043A\u0430 API",
5656
+ "ESR \u5DE5\u4F5C\u533A\u6570\u636E\u4E0D\u53EF\u8FBE\uFF08loopback-only \u5B88\u536B\uFF09\u2014 \u672C\u8F6E\u8BA1\u5212\u7167\u5E38\u5C55\u793A\uFF1B\u5B8C\u6574\u4EFB\u52A1\u4E0E\u5173\u7CFB\u89C1 \u8BBE\u7F6E \u2192 Engram \u8BB0\u5FC6\u3002": "\u0414\u0430\u043D\u043D\u044B\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430 ESR \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B (\u0437\u0430\u0449\u0438\u0442\u0430 loopback-only) \u2014 \u043F\u043B\u0430\u043D \u0445\u043E\u0434\u0430 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u043A\u0430\u043A \u043E\u0431\u044B\u0447\u043D\u043E; \u043F\u043E\u043B\u043D\u044B\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0441\u0432\u044F\u0437\u0438 \u2014 \u0432 \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u2192 \u041F\u0430\u043C\u044F\u0442\u044C Engram.",
5657
+ "\u8FD1 {0} \u5929 \xB7 todo ": "\u0417\u0430 {0} \u0434\u043D. \xB7 todo ",
5658
+ "\u8BB0\u5FC6 ": "\u043F\u0430\u043C\u044F\u0442\u044C ",
5659
+ "\u8C03\u7528 {0}": "\u0432\u044B\u0437\u043E\u0432\u043E\u0432: {0}",
5660
+ "\u2014 ESR \u4E3A\u96F6\uFF0Ctodo \u53EF\u7528\u300C\u6C89\u6DC0\u5230 ESR\u300D\u8F6C\u8349\u7A3F": "\u2014 ESR \u043F\u0443\u0441\u0442, todo \u043C\u043E\u0436\u043D\u043E \u043F\u0435\u0440\u0435\u043D\u0435\u0441\u0442\u0438 \u0432 \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A \u043A\u043D\u043E\u043F\u043A\u043E\u0439 \xAB\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0442\u0438 \u0432 ESR\xBB",
5661
+ "\u672C\u8F6E\u8BA1\u5212": "\u041F\u043B\u0430\u043D \u0445\u043E\u0434\u0430",
5662
+ " \u5B8C\u6210 \xB7 \u8DDF\u968F\u4F1A\u8BDD\u81EA\u52A8\u66F4\u65B0": " \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u043E \xB7 \u043E\u0431\u043D\u043E\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u0441\u0435\u0441\u0441\u0438\u0435\u0439",
5663
+ "\u628A\u672C\u8F6E\u5F85\u529E\u8F6C\u6210 ESR \u4EFB\u52A1\u8349\u7A3F\uFF08\u8DE8\u4F1A\u8BDD\u4FDD\u7559\uFF09": "\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0442\u0438 todo \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u0445\u043E\u0434\u0430 \u0432 \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\u0438 \u0437\u0430\u0434\u0430\u0447 ESR (\u0441\u043E\u0445\u0440\u0430\u043D\u044F\u044E\u0442\u0441\u044F \u043C\u0435\u0436\u0434\u0443 \u0441\u0435\u0441\u0441\u0438\u044F\u043C\u0438)",
5664
+ "\u5DF2\u6C89\u6DC0 {0} \u9879 \xB7 \u518D\u6C89\u6DC0 {1} \u9879": "\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0435\u043D\u043E: {0} \xB7 \u0435\u0449\u0451 {1}",
5665
+ "\u5DF2\u6C89\u6DC0 {0} \u9879": "\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0435\u043D\u043E: {0}",
5666
+ "\u6C89\u6DC0\u5230 ESR\uFF08{0} \u9879\uFF09": "\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0442\u0438 \u0432 ESR ({0})",
5667
+ "\u8F6C\u8349\u7A3F \xB7 \u8DE8\u4F1A\u8BDD\u95ED\u73AF": "\u0412 \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\u0438 \xB7 \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u0435 \u043C\u0435\u0436\u0434\u0443 \u0441\u0435\u0441\u0441\u0438\u044F\u043C\u0438",
5668
+ "\u672C\u8F6E\u8BA1\u5212\u662F": "\u041F\u043B\u0430\u043D \u0445\u043E\u0434\u0430 \u2014 \u044D\u0442\u043E ",
5669
+ "\u4F1A\u8BDD\u5185": "\u0432\u043D\u0443\u0442\u0440\u0438\u0441\u0435\u0441\u0441\u0438\u043E\u043D\u043D\u044B\u0439",
5670
+ "\u539F\u751F todo\uFF0C\u968F\u4F1A\u8BDD\u7ED3\u675F\uFF1B\u591A\u6B65/\u9700\u957F\u671F\u4FDD\u7559\u7684\u5DE5\u4F5C\u5EFA\u8BAE": " \u0440\u043E\u0434\u043D\u043E\u0439 todo, \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442 \u0441 \u043A\u043E\u043D\u0446\u043E\u043C \u0441\u0435\u0441\u0441\u0438\u0438; \u0434\u043B\u044F \u043C\u043D\u043E\u0433\u043E\u0448\u0430\u0433\u043E\u0432\u043E\u0439 \u0440\u0430\u0431\u043E\u0442\u044B, \u043A\u043E\u0442\u043E\u0440\u0443\u044E \u043D\u0430\u0434\u043E \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C, \u043B\u0443\u0447\u0448\u0435 ",
5671
+ "\u7528 esr_task \u5EFA ESR \u4EFB\u52A1": "\u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0437\u0430\u0434\u0430\u0447\u0443 ESR \u0447\u0435\u0440\u0435\u0437 esr_task",
5672
+ "\uFF08\u8DE8\u4F1A\u8BDD\u95ED\u73AF\uFF0C\u5E26\u8BC1\u636E\u95E8\uFF09\u6C89\u6DC0\u4E0B\u6765\u3002": " (\u0437\u0430\u043A\u0440\u044B\u0442\u0438\u0435 \u043C\u0435\u0436\u0434\u0443 \u0441\u0435\u0441\u0441\u0438\u044F\u043C\u0438, \u0441 \u0432\u043E\u0440\u043E\u0442\u0430\u043C\u0438 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432).",
5673
+ "\u5DE5\u4F5C\u533A ESR \u4EFB\u52A1 \xB7 {0} \u8FDB\u884C\u4E2D": "\u0417\u0430\u0434\u0430\u0447\u0438 ESR \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430 \xB7 \u0432 \u0440\u0430\u0431\u043E\u0442\u0435: {0}",
5674
+ "\u8BA1\u5212 {0} \u6761 todo": "\u0412 \u043F\u043B\u0430\u043D\u0435 todo: {0}",
5675
+ " \u65B0\u5EFA": " \u0421\u043E\u0437\u0434\u0430\u0442\u044C",
5676
+ "\u6682\u65E0\u6D3B\u52A8\u4EFB\u52A1 \u2014 \u70B9\u300C\u65B0\u5EFA\u300D\u6216\u5728\u5BF9\u8BDD\u4E2D\u8BA9 agent \u7528 esr_task \u5EFA\u4EFB\u52A1": "\u0410\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u0437\u0430\u0434\u0430\u0447 \u043D\u0435\u0442 \u2014 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \xAB\u0421\u043E\u0437\u0434\u0430\u0442\u044C\xBB \u0438\u043B\u0438 \u043F\u043E\u043F\u0440\u043E\u0441\u0438\u0442\u0435 \u0430\u0433\u0435\u043D\u0442\u0430 \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0437\u0430\u0434\u0430\u0447\u0443 \u0447\u0435\u0440\u0435\u0437 esr_task",
5677
+ "\u6536\u8D77\u8BE6\u60C5": "\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0434\u0435\u0442\u0430\u043B\u0438",
5678
+ "\u5C55\u5F00\u8BE6\u60C5": "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0434\u0435\u0442\u0430\u043B\u0438",
5679
+ "{0} \xB7 \u8BC1\u636E\u7F3A\u53E3: {1}": "{0} \xB7 \u043F\u0440\u043E\u0431\u0435\u043B\u044B: {1}",
5680
+ "\u8865\u9F50\u8BC1\u636E": "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430",
5681
+ "\u63D0\u4F9B\u4E09\u9879\u8BC1\u636E\u540E\u8F6C STABLE\uFF08artifact \xB7 evaluation \xB7 memory_ref\uFF09": "\u041F\u043E\u0441\u043B\u0435 \u0442\u0440\u0451\u0445 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u0430\u043D\u0435\u0442 STABLE (artifact \xB7 evaluation \xB7 memory_ref)",
5682
+ "evaluation \u8BC1\u636E": "\u0414\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u043E evaluation",
5683
+ "\u5171 {0} \xB7 {1}/{2}": "\u0412\u0441\u0435\u0433\u043E {0} \xB7 {1}/{2}",
5684
+ "\u6837\u672C\u4E0D\u8DB3\uFF08{0} \u6B21\uFF09\uFF0C\u6BD4\u4F8B\u4EC5\u4F9B\u53C2\u8003": "\u041C\u0430\u043B\u043E \u0434\u0430\u043D\u043D\u044B\u0445 ({0} \u0432\u044B\u0437\u043E\u0432\u043E\u0432) \u2014 \u043F\u0440\u043E\u043F\u043E\u0440\u0446\u0438\u0438 \u043E\u0440\u0438\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u043E\u0447\u043D\u044B",
5685
+ "agent \u884C\u4E3A\u9065\u6D4B\u4EEA\u8868\u76D8": "\u041F\u0430\u043D\u0435\u043B\u044C \u0442\u0435\u043B\u0435\u043C\u0435\u0442\u0440\u0438\u0438 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u0430\u0433\u0435\u043D\u0442\u0430",
5686
+ "\u57FA\u4E8E /stats \u771F\u5B9E\u8C03\u7528\u7D2F\u8BA1\uFF08\u5DE5\u4F5C\u533A \xD7 \u5929\u6EDA\u52A8\uFF09\xB7 20s \u81EA\u52A8\u5237\u65B0{0}": "\u041F\u043E \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u043C \u0432\u044B\u0437\u043E\u0432\u0430\u043C \u0438\u0437 /stats (\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \xD7 \u0434\u0435\u043D\u044C) \xB7 \u0430\u0432\u0442\u043E\u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 20 \u0441{0}",
5687
+ " \xB7 \u5168\u90E8\u5DE5\u4F5C\u533A": " \xB7 \u0432\u0441\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430",
5688
+ "\u52A0\u8F7D\u4E2D\u2026": "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430\u2026",
5689
+ "ESR \u4E3B\u52A8\u6027\uFF08\u76EE\u6807 \u2265 34%\uFF09": "\u0410\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C ESR (\u0446\u0435\u043B\u044C \u2265 34%)",
5690
+ "ESR \u4E3B\u52A8\u6027": "\u0410\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C ESR",
5691
+ " \xB7 \u5171 {0}": " \xB7 \u0432\u0441\u0435\u0433\u043E {0}",
5692
+ "\u5065\u5EB7": "\u041D\u043E\u0440\u043C\u0430",
5693
+ "\u504F\u4F4E \u2192 \u4E0B\u4F1A\u8BDD\u6CE8\u5165 escalate \u63D0\u9192": "\u041D\u0438\u0436\u0435 \u043D\u043E\u0440\u043C\u044B \u2192 \u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u043F\u043E\u044F\u0432\u0438\u0442\u0441\u044F \u043D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u0435 escalate",
5694
+ "\u53EC\u56DE\u547D\u4E2D\u7387": "\u0414\u043E\u043B\u044F \u043F\u043E\u043F\u0430\u0434\u0430\u043D\u0438\u0439 \u043F\u043E\u0434\u0431\u043E\u0440\u0430",
5695
+ "\u6709\u547D\u4E2D\u7684 engram_recall \u5360\u6BD4": "\u0414\u043E\u043B\u044F engram_recall \u0441 \u043F\u043E\u043F\u0430\u0434\u0430\u043D\u0438\u044F\u043C\u0438",
5696
+ "detail \u8F6C\u5316": "\u041F\u0435\u0440\u0435\u0445\u043E\u0434 \u0432 detail",
5697
+ "\u547D\u4E2D\u53EC\u56DE\u540E 8 \u4E8B\u4EF6\u5185\u8DDF engram_detail": "engram_detail \u0432 \u0442\u0435\u0447\u0435\u043D\u0438\u0435 8 \u0441\u043E\u0431\u044B\u0442\u0438\u0439 \u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u043F\u0430\u0434\u0430\u043D\u0438\u044F \u043F\u043E\u0434\u0431\u043E\u0440\u0430",
5698
+ "\u7D2F\u8BA1\u5DE5\u5177\u8C03\u7528": "\u0412\u0441\u0435\u0433\u043E \u0432\u044B\u0437\u043E\u0432\u043E\u0432 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432",
5699
+ "esr_* \u8C03\u7528": "\u0412\u044B\u0437\u043E\u0432\u044B esr_*",
5700
+ "\u8BB0\u5FC6\u7C7B\u8C03\u7528": "\u0412\u044B\u0437\u043E\u0432\u044B \u043F\u0430\u043C\u044F\u0442\u0438",
5701
+ "\u5E73\u5747\u547D\u4E2D/\u67E5\u8BE2": "\u041F\u043E\u043F\u0430\u0434\u0430\u043D\u0438\u0439 \u043D\u0430 \u0437\u0430\u043F\u0440\u043E\u0441",
5702
+ "\u5931\u8D25\u6B21\u6570": "\u041E\u0448\u0438\u0431\u043A\u0438",
5703
+ "Context Ledger \xB7 \u4E0A\u4E0B\u6587\u51C0\u6536\u76CA": "Context Ledger \xB7 \u0447\u0438\u0441\u0442\u044B\u0439 \u0432\u044B\u0438\u0433\u0440\u044B\u0448 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430",
5704
+ "\u8D26\u672C\u672A\u542F\u7528\uFF08`ledgerEnabled:false`\uFF09\u6216\u5BBF\u4E3B API \u672A\u5C31\u7EEA\u3002": "\u0416\u0443\u0440\u043D\u0430\u043B \u043E\u0442\u043A\u043B\u044E\u0447\u0451\u043D (`ledgerEnabled:false`) \u0438\u043B\u0438 API host \u043D\u0435 \u0433\u043E\u0442\u043E\u0432.",
5705
+ "\u8BE5\u5DE5\u4F5C\u533A\u8FD8\u6CA1\u6709\u8D26\u672C\u8BB0\u5F55\u3002": "\u0412 \u044D\u0442\u043E\u043C \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0435 \u0435\u0449\u0451 \u043D\u0435\u0442 \u0437\u0430\u043F\u0438\u0441\u0435\u0439 \u0436\u0443\u0440\u043D\u0430\u043B\u0430.",
5706
+ "\u51C0 token\uFF08\u8282\u7701 \u2212 \u6CE8\u5165 \u2212 \u91CD\u5199\u7F5A\u91D1\uFF09": "\u0427\u0438\u0441\u0442\u044B\u0435 \u0442\u043E\u043A\u0435\u043D\u044B (\u044D\u043A\u043E\u043D\u043E\u043C\u0438\u044F \u2212 \u0432\u043D\u0435\u0434\u0440\u0435\u043D\u0438\u0435 \u2212 \u0448\u0442\u0440\u0430\u0444 \u0437\u0430 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u044C)",
5707
+ "\u8BF7\u6C42 {0} \xB7 \u4F1A\u8BDD {1} \xB7 open {2}{3}": "\u0417\u0430\u043F\u0440\u043E\u0441\u044B {0} \xB7 \u0441\u0435\u0441\u0441\u0438\u0438 {1} \xB7 \u043E\u0442\u043A\u0440\u044B\u0442\u043E {2}{3}",
5708
+ " \xB7 JIT \u63A8\u9001 {0}": " \xB7 JIT-\u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A {0}",
5709
+ "\u8282\u7701 \xB7 \u526A\u679D/\u538B\u7F29\uFF08\u5DF2\u5165\u8D26\uFF09": "\u042D\u043A\u043E\u043D\u043E\u043C\u0438\u044F \xB7 \u043E\u0431\u0440\u0435\u0437\u043A\u0430/\u043A\u043E\u043C\u043F\u0430\u043A\u0446\u0438\u044F (\u0443\u0447\u0442\u0435\u043D\u043E)",
5710
+ "\u6CE8\u5165\u6210\u672C \xB7 \u7D22\u5F15/\u53EC\u56DE/ESR\uFF08\u6BCF\u8BF7\u6C42\u91CD\u8BA1\uFF09": "\u0421\u0442\u043E\u0438\u043C\u043E\u0441\u0442\u044C \u0432\u043D\u0435\u0434\u0440\u0435\u043D\u0438\u044F \xB7 \u0438\u043D\u0434\u0435\u043A\u0441/\u043F\u043E\u0434\u0431\u043E\u0440/ESR (\u043F\u0435\u0440\u0435\u0441\u0447\u0451\u0442 \u043A\u0430\u0436\u0434\u044B\u0439 \u0437\u0430\u043F\u0440\u043E\u0441)",
5711
+ "\u91CD\u5199\u7F5A\u91D1 \xB7 {0} \u6B21": "\u0428\u0442\u0440\u0430\u0444 \u0437\u0430 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u044C \xB7 {0} \u0440\u0430\u0437",
5712
+ "\u8282\u7701\u4ECD\u4E3A 0\uFF1A\u672C\u5DE5\u4F5C\u533A\u8FD8\u6CA1\u6709\u526A\u679D/\u538B\u7F29\u8282\u7701\u5165\u8D26\u2014\u2014L1 \u8FB9\u754C\u526A\u679D\u9700\u8981 host \u5E73\u9762\u7684 toolResultPruner\uFF08DSH \u2265 0.2.0 \u7531 bundle patch \u91CD\u65B0\u542F\u7528\u8BE5\u884C\uFF09\uFF0C\u538B\u7F29\u8282\u7701\u7531 Context GC \u5F15\u64CE\u5728 checkpoint \u65F6\u4E0A\u62A5\uFF1B\u51C0\u503C\u4E3A\u8D1F = \u6CE8\u5165\u6210\u672C + \u91CD\u5199\u7F5A\u91D1\u7684\u5408\u8BA1\u3002": "\u042D\u043A\u043E\u043D\u043E\u043C\u0438\u044F \u043F\u043E\u043A\u0430 0: \u0432 \u044D\u0442\u043E\u043C \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0435 \u0435\u0449\u0451 \u043D\u0435\u0442 \u0443\u0447\u0442\u0451\u043D\u043D\u043E\u0439 \u044D\u043A\u043E\u043D\u043E\u043C\u0438\u0438 \u043E\u0442 \u043E\u0431\u0440\u0435\u0437\u043A\u0438/\u043A\u043E\u043C\u043F\u0430\u043A\u0446\u0438\u0438 \u2014 L1-\u043E\u0431\u0440\u0435\u0437\u043A\u0435 \u043D\u0430 \u0433\u0440\u0430\u043D\u0438\u0446\u0430\u0445 \u043D\u0443\u0436\u0435\u043D toolResultPruner \u043D\u0430 \u043F\u043B\u043E\u0441\u043A\u043E\u0441\u0442\u0438 host (\u0432 DSH \u2265 0.2.0 \u044D\u0442\u0430 \u0441\u0442\u0440\u043E\u043A\u0430 \u0441\u043D\u043E\u0432\u0430 \u0432\u043A\u043B\u044E\u0447\u0430\u0435\u0442\u0441\u044F bundle-\u043F\u0430\u0442\u0447\u0435\u043C), \u0430 \u044D\u043A\u043E\u043D\u043E\u043C\u0438\u044E \u043A\u043E\u043C\u043F\u0430\u043A\u0446\u0438\u0438 \u0441\u043E\u043E\u0431\u0449\u0430\u0435\u0442 \u0434\u0432\u0438\u0436\u043E\u043A Context GC \u043F\u0440\u0438 checkpoint; \u043E\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u0431\u0430\u043B\u0430\u043D\u0441 = \u0441\u0442\u043E\u0438\u043C\u043E\u0441\u0442\u044C \u0432\u043D\u0435\u0434\u0440\u0435\u043D\u0438\u044F + \u0448\u0442\u0440\u0430\u0444 \u0437\u0430 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u044C.",
5713
+ "\u53E3\u5F84\uFF1Achars/{0} \u4F30\u7B97 \xB7 \u7F13\u5B58\u6298\u4EF7 {1}% \uFF08\u91CD\u5199\u6309 {2}% \u8BA1\uFF09\xB7 \u672A\u8BA1\u6A21\u578B\u8D28\u91CF\u5DEE": "\u041C\u0435\u0442\u043E\u0434\u0438\u043A\u0430: \u043E\u0446\u0435\u043D\u043A\u0430 \u043F\u043E chars/{0} \xB7 \u0441\u043A\u0438\u0434\u043A\u0430 \u043A\u044D\u0448\u0430 {1}% (\u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u044C \u043F\u043E {2}%) \xB7 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u043E \u043C\u043E\u0434\u0435\u043B\u0438 \u043D\u0435 \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0435\u0442\u0441\u044F",
5714
+ "{0} \xB7 net {1} tok \xB7 \u8BF7\u6C42 {2}": "{0} \xB7 \u0447\u0438\u0441\u0442\u044B\u0435 {1} \u0442\u043E\u043A. \xB7 \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 {2}",
5715
+ "\u7EFF = \u5F53\u65E5\u51C0\u7701 \xB7 \u7EA2 = \u5F53\u65E5\u51C0\u4E8F\uFF08\u6309\u5929\u6EDA\u52A8\uFF0C\u6700\u8FD1 14 \u5929\uFF09": "\u0417\u0435\u043B\u0451\u043D\u044B\u0439 = \u0447\u0438\u0441\u0442\u044B\u0439 \u0432\u044B\u0438\u0433\u0440\u044B\u0448 \u0437\u0430 \u0434\u0435\u043D\u044C \xB7 \u043A\u0440\u0430\u0441\u043D\u044B\u0439 = \u0447\u0438\u0441\u0442\u044B\u0439 \u0443\u0431\u044B\u0442\u043E\u043A (\u043F\u043E \u0434\u043D\u044F\u043C, \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 14 \u0434\u043D\u0435\u0439)",
5716
+ "\u8FD1 14 \u5929\u6BCF\u65E5\u6D3B\u52A8 \xB7 mem vs esr": "\u0410\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C \u0437\u0430 14 \u0434\u043D\u0435\u0439 \xB7 mem vs esr",
5717
+ "\u8FD8\u6CA1\u6709\u6309\u5929\u6570\u636E\uFF08\u5DE5\u5177\u8C03\u7528\u4F1A\u5B9E\u65F6\u7D2F\u8BA1\uFF09\u3002": "\u0414\u0430\u043D\u043D\u044B\u0445 \u043F\u043E \u0434\u043D\u044F\u043C \u043F\u043E\u043A\u0430 \u043D\u0435\u0442 (\u0432\u044B\u0437\u043E\u0432\u044B \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u043D\u0430\u043A\u0430\u043F\u043B\u0438\u0432\u0430\u044E\u0442\u0441\u044F \u0432 \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u043C \u0432\u0440\u0435\u043C\u0435\u043D\u0438).",
5718
+ " \u8BB0\u5FC6\u7C7B (engram_*/loom_*)": " \u043F\u0430\u043C\u044F\u0442\u044C (engram_*/loom_*)",
5719
+ "\u5DE5\u5177\u8C03\u7528\u5206\u5E03\uFF08Top 8\uFF09": "\u0420\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0432\u044B\u0437\u043E\u0432\u043E\u0432 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 (Top 8)",
5720
+ "\u8FD8\u6CA1\u6709\u5DE5\u5177\u8C03\u7528\u8BB0\u5F55\u3002": "\u0417\u0430\u043F\u0438\u0441\u0435\u0439 \u043E \u0432\u044B\u0437\u043E\u0432\u0430\u0445 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u043F\u043E\u043A\u0430 \u043D\u0435\u0442.",
5721
+ "\u8BC1\u636E\u5B8C\u5907\u5EA6 {0}%": "\u0413\u043E\u0442\u043E\u0432\u043D\u043E\u0441\u0442\u044C \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432 {0}%",
5722
+ "\u8BC1\u636E\u95ED\u73AF\uFF1Aartifact{0} \xB7 evaluation{1} \xB7 memory_ref{2} ({3}/3)": "\u0412\u043E\u0440\u043E\u0442\u0430 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432: artifact{0} \xB7 evaluation{1} \xB7 memory_ref{2} ({3}/3)",
5723
+ "# ESR \u4EFB\u52A1\u5BFC\u51FA \xB7 {0}\n\n| \u72B6\u6001 | \u4EFB\u52A1 | \u5DE5\u4F5C\u533A | \u8BC1\u636E\u7F3A\u53E3 | \u8BC1\u636E | \u521B\u5EFA |\n|---|---|---|---|---|---|\n{1}": "# \u042D\u043A\u0441\u043F\u043E\u0440\u0442 \u0437\u0430\u0434\u0430\u0447 ESR \xB7 {0}\n\n| \u0421\u0442\u0430\u0442\u0443\u0441 | \u0417\u0430\u0434\u0430\u0447\u0430 | \u041F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E | \u041F\u0440\u043E\u0431\u0435\u043B\u044B \u0432 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430\u0445 | \u0414\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0430 | \u0421\u043E\u0437\u0434\u0430\u043D\u043E |\n|---|---|---|---|---|---|\n{1}",
5724
+ "(\u65E0\u4EFB\u52A1)": "(\u043D\u0435\u0442 \u0437\u0430\u0434\u0430\u0447)"
5725
+ };
5726
+
5338
5727
  // client/src/entry.tsx
5339
5728
  var NS = "dsh-engram";
5340
5729
  var zh = {
@@ -5349,9 +5738,10 @@ var en = {
5349
5738
  };
5350
5739
  var inject = ["slots", "locale", "sessions", "workspaces"];
5351
5740
  function apply(ctx) {
5352
- ctx.effect(() => ctx.locale.register(NS, { zh, en }), "dsh-engram: dictionaries");
5741
+ ctx.effect(() => ctx.locale.register(NS, { zh, en, ru }), "dsh-engram: dictionaries");
5353
5742
  const api = new EngramApi();
5354
5743
  const t = ctx.locale.bind(NS);
5744
+ installTranslator(t, ctx.locale.getLocale?.().active);
5355
5745
  const scope = new EngramScopeImpl(api, "dsh-engram");
5356
5746
  const sectionInjected = () => ({ api, t, scope });
5357
5747
  try {
@@ -5363,6 +5753,7 @@ function apply(ctx) {
5363
5753
  id: "todo",
5364
5754
  order: 0,
5365
5755
  priority: -1,
5756
+ locale: NS,
5366
5757
  inject: () => ({ api })
5367
5758
  },
5368
5759
  EngramTaskDock
@@ -5409,7 +5800,8 @@ function apply(ctx) {
5409
5800
  }
5410
5801
  try {
5411
5802
  ctx.effect(
5412
- () => mountEngramBoard(api),
5803
+ () => mountEngramBoard(api, (onChange) => ctx.locale.subscribe?.(onChange) ?? (() => {
5804
+ })),
5413
5805
  "dsh-engram: ESR task board mount"
5414
5806
  );
5415
5807
  } catch (error) {