sage-mem 1.5.1 → 1.5.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.
Files changed (2) hide show
  1. package/lib/client.js +93 -75
  2. package/package.json +1 -1
package/lib/client.js CHANGED
@@ -3741,6 +3741,90 @@ h("span", { key: "sep", className: "smem-actions-sep", "aria-hidden": "true" }),
3741
3741
  notice ? h("div", { className: "smem-ok", key: "ok" }, "✓ " + notice) : null,
3742
3742
  ]);
3743
3743
  }
3744
+ // ── 筛选条(1.5.2 从 Section 里抽出)────────────────────────────────
3745
+ // 只接收 props、只渲染;筛选语义(哪些项互斥、怎么 AND/OR)仍在 Section 里算好再传进来。
3746
+ // 抽出来的收益是 Section 少了 60 行 UI 细节,而筛选条可以单独看、单独改(比如以后再加
3747
+ // 「只显示锁定」这类维度),不用在一千行的 Section 里翻。
3748
+ function FilterBar(props) {
3749
+ const { hasFilter, statusFilter, setStatusFilter, totalCount, items, archiveItems, statusItems, typeFilter, setTypeFilter, typeList, typeCounts, tagList, tagShown, tagHiddenCount, tagCounts, tagFilter, setTagFilter, tagOpen, setTagOpen, TAG_VISIBLE_MAX, query, setQuery, toggleIn, sumItem } = props;
3750
+ return h("div", { className: "smem-filters" }, [
3751
+ hasFilter
3752
+ ? h("div", { className: "smem-filter-summary", key: "sum" }, [
3753
+ statusFilter !== "all"
3754
+ ? sumItem("状态:" + (statusFilter === "active" ? "活动中" : "已归档"), function () { setStatusFilter("all"); })
3755
+ : null,
3756
+ typeFilter.map(function (t) {
3757
+ return sumItem("类型:" + (TYPE_LABEL[t] || t), function () { toggleIn(setTypeFilter, t); });
3758
+ }),
3759
+ tagFilter.map(function (g) {
3760
+ return sumItem("标签:#" + g, function () { toggleIn(setTagFilter, g); });
3761
+ }),
3762
+ query.trim() ? sumItem("搜索:" + query.trim(), function () { setQuery(""); }) : null,
3763
+ h("button", {
3764
+ type: "button", className: "smem-sum-clear", key: "all",
3765
+ onClick: function () { setStatusFilter("all"); setTypeFilter([]); setTagFilter([]); setQuery(""); },
3766
+ }, "清除全部"),
3767
+ ])
3768
+ : null,
3769
+ h("span", { className: "smem-filters-label", key: "lst" }, "状态"),
3770
+ h("button", {
3771
+ type: "button", key: "st-all", className: "smem-chip",
3772
+ "data-on": statusFilter === "all" ? "1" : "0",
3773
+ title: "活动与已归档一起看(归档条走灰色)",
3774
+ onClick: function () { setStatusFilter("all"); },
3775
+ }, ["全部", h("span", { className: "smem-chip-n", key: "n" }, String(totalCount))]),
3776
+ h("button", {
3777
+ type: "button", key: "st-active", className: "smem-chip",
3778
+ "data-on": statusFilter === "active" ? "1" : "0",
3779
+ title: "正在参与检索与星图的记忆",
3780
+ onClick: function () { setStatusFilter("active"); },
3781
+ }, ["活动中", h("span", { className: "smem-chip-n", key: "n" }, String(items.length))]),
3782
+ h("button", {
3783
+ type: "button", key: "st-arch", className: "smem-chip",
3784
+ "data-on": statusFilter === "archived" ? "1" : "0",
3785
+ title: "已收进档案馆:不参与检索与星图,可编辑 / 恢复",
3786
+ onClick: function () { setStatusFilter("archived"); },
3787
+ }, ["已归档", h("span", { className: "smem-chip-n", key: "n" }, String(archiveItems.length))]),
3788
+ h("span", { className: "smem-sep", key: "sep0" }),
3789
+ h("span", { className: "smem-filters-label", key: "lt" }, "类型"),
3790
+ h("button", {
3791
+ type: "button", key: "all", className: "smem-chip",
3792
+ "data-on": typeFilter.length ? "0" : "1",
3793
+ onClick: function () { setTypeFilter([]); },
3794
+ }, ["全部", h("span", { className: "smem-chip-n", key: "n" }, String(statusItems.length))]),
3795
+ typeList.map(function (t) {
3796
+ return h("button", {
3797
+ type: "button", key: t, className: "smem-chip",
3798
+ "data-on": typeFilter.indexOf(t) >= 0 ? "1" : "0",
3799
+ onClick: function () { toggleIn(setTypeFilter, t); },
3800
+ }, [TYPE_LABEL[t] || t, h("span", { className: "smem-chip-n", key: "n" }, String(typeCounts[t]))]);
3801
+ }),
3802
+ tagList.length ? h("span", { className: "smem-sep", key: "sep" }) : null,
3803
+ tagList.length ? h("span", { className: "smem-filters-label", key: "lgt" }, "标签") : null,
3804
+ tagShown.map(function (g) {
3805
+ return h("button", {
3806
+ type: "button", key: "tag-" + g, className: "smem-chip",
3807
+ "data-on": tagFilter.indexOf(g) >= 0 ? "1" : "0",
3808
+ onClick: function () { toggleIn(setTagFilter, g); },
3809
+ }, ["#" + g, h("span", { className: "smem-chip-n", key: "n" }, String(tagCounts[g]))]);
3810
+ }),
3811
+ tagList.length > TAG_VISIBLE_MAX
3812
+ ? h("button", {
3813
+ type: "button", key: "moretag", className: "smem-btn",
3814
+ title: tagOpen ? "收起标签" : "还有一些标签没显示",
3815
+ onClick: function () { setTagOpen(!tagOpen); },
3816
+ }, tagOpen ? "收起标签" : ("更多标签 (" + String(tagHiddenCount) + ")") )
3817
+ : null,
3818
+ hasFilter
3819
+ ? h("button", {
3820
+ type: "button", key: "clear", className: "smem-btn",
3821
+ onClick: function () { setStatusFilter("all"); setTypeFilter([]); setTagFilter([]); setQuery(""); },
3822
+ }, "清除筛选")
3823
+ : null,
3824
+
3825
+ ]);
3826
+ }
3827
+
3744
3828
  function Section(props) {
3745
3829
  // 走 stableRemote:真实宿主里 `ctx.get()` 每次返回新对象(issue #3 的成因)。
3746
3830
  // 这个面板的 effect 依赖是 `[]`、暂时不会爆,但引用稳定是**所有**面板的共同前提。
@@ -4620,81 +4704,15 @@ h("span", { key: "sep", className: "smem-actions-sep", "aria-hidden": "true" }),
4620
4704
  : null,
4621
4705
  // 三排筛选:状态 / 类型 / 标签。组内 OR、组间 AND,再与搜索框 AND。
4622
4706
  tab === "files" && totalCount
4623
- ? h("div", { className: "smem-filters", key: "filters" }, [
4624
- hasFilter
4625
- ? h("div", { className: "smem-filter-summary", key: "sum" }, [
4626
- statusFilter !== "all"
4627
- ? sumItem("状态:" + (statusFilter === "active" ? "活动中" : "已归档"), function () { setStatusFilter("all"); })
4628
- : null,
4629
- typeFilter.map(function (t) {
4630
- return sumItem("类型:" + (TYPE_LABEL[t] || t), function () { toggleIn(setTypeFilter, t); });
4631
- }),
4632
- tagFilter.map(function (g) {
4633
- return sumItem("标签:#" + g, function () { toggleIn(setTagFilter, g); });
4634
- }),
4635
- query.trim() ? sumItem("搜索:" + query.trim(), function () { setQuery(""); }) : null,
4636
- h("button", {
4637
- type: "button", className: "smem-sum-clear", key: "all",
4638
- onClick: function () { setStatusFilter("all"); setTypeFilter([]); setTagFilter([]); setQuery(""); },
4639
- }, "清除全部"),
4640
- ])
4641
- : null,
4642
- h("span", { className: "smem-filters-label", key: "lst" }, "状态"),
4643
- h("button", {
4644
- type: "button", key: "st-all", className: "smem-chip",
4645
- "data-on": statusFilter === "all" ? "1" : "0",
4646
- title: "活动与已归档一起看(归档条走灰色)",
4647
- onClick: function () { setStatusFilter("all"); },
4648
- }, ["全部", h("span", { className: "smem-chip-n", key: "n" }, String(totalCount))]),
4649
- h("button", {
4650
- type: "button", key: "st-active", className: "smem-chip",
4651
- "data-on": statusFilter === "active" ? "1" : "0",
4652
- title: "正在参与检索与星图的记忆",
4653
- onClick: function () { setStatusFilter("active"); },
4654
- }, ["活动中", h("span", { className: "smem-chip-n", key: "n" }, String(items.length))]),
4655
- h("button", {
4656
- type: "button", key: "st-arch", className: "smem-chip",
4657
- "data-on": statusFilter === "archived" ? "1" : "0",
4658
- title: "已收进档案馆:不参与检索与星图,可编辑 / 恢复",
4659
- onClick: function () { setStatusFilter("archived"); },
4660
- }, ["已归档", h("span", { className: "smem-chip-n", key: "n" }, String(archiveItems.length))]),
4661
- h("span", { className: "smem-sep", key: "sep0" }),
4662
- h("span", { className: "smem-filters-label", key: "lt" }, "类型"),
4663
- h("button", {
4664
- type: "button", key: "all", className: "smem-chip",
4665
- "data-on": typeFilter.length ? "0" : "1",
4666
- onClick: function () { setTypeFilter([]); },
4667
- }, ["全部", h("span", { className: "smem-chip-n", key: "n" }, String(statusItems.length))]),
4668
- typeList.map(function (t) {
4669
- return h("button", {
4670
- type: "button", key: t, className: "smem-chip",
4671
- "data-on": typeFilter.indexOf(t) >= 0 ? "1" : "0",
4672
- onClick: function () { toggleIn(setTypeFilter, t); },
4673
- }, [TYPE_LABEL[t] || t, h("span", { className: "smem-chip-n", key: "n" }, String(typeCounts[t]))]);
4674
- }),
4675
- tagList.length ? h("span", { className: "smem-sep", key: "sep" }) : null,
4676
- tagList.length ? h("span", { className: "smem-filters-label", key: "lgt" }, "标签") : null,
4677
- tagShown.map(function (g) {
4678
- return h("button", {
4679
- type: "button", key: "tag-" + g, className: "smem-chip",
4680
- "data-on": tagFilter.indexOf(g) >= 0 ? "1" : "0",
4681
- onClick: function () { toggleIn(setTagFilter, g); },
4682
- }, ["#" + g, h("span", { className: "smem-chip-n", key: "n" }, String(tagCounts[g]))]);
4683
- }),
4684
- tagList.length > TAG_VISIBLE_MAX
4685
- ? h("button", {
4686
- type: "button", key: "moretag", className: "smem-btn",
4687
- title: tagOpen ? "收起标签" : "还有一些标签没显示",
4688
- onClick: function () { setTagOpen(!tagOpen); },
4689
- }, tagOpen ? "收起标签" : ("更多标签 (" + String(tagHiddenCount) + ")") )
4690
- : null,
4691
- hasFilter
4692
- ? h("button", {
4693
- type: "button", key: "clear", className: "smem-btn",
4694
- onClick: function () { setStatusFilter("all"); setTypeFilter([]); setTagFilter([]); setQuery(""); },
4695
- }, "清除筛选")
4696
- : null,
4697
- ])
4707
+ ? h(FilterBar, {
4708
+ hasFilter: hasFilter, statusFilter: statusFilter, setStatusFilter: setStatusFilter,
4709
+ totalCount: totalCount, items: items, archiveItems: archiveItems, statusItems: statusItems,
4710
+ typeFilter: typeFilter, setTypeFilter: setTypeFilter, typeList: typeList, typeCounts: typeCounts,
4711
+ tagList: tagList, tagShown: tagShown, tagHiddenCount: tagHiddenCount, tagCounts: tagCounts,
4712
+ tagFilter: tagFilter, setTagFilter: setTagFilter, tagOpen: tagOpen, setTagOpen: setTagOpen,
4713
+ TAG_VISIBLE_MAX: TAG_VISIBLE_MAX, query: query, setQuery: setQuery,
4714
+ toggleIn: toggleIn, sumItem: sumItem,
4715
+ })
4698
4716
  : null,
4699
4717
  error ? h("div", { className: "smem-err", key: "err", role: "alert" }, "⚠ " + error) : null,
4700
4718
  notice && !error ? h("div", { className: "smem-ok", key: "ok", role: "status" }, "✓ " + notice) : null,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sage-mem",
3
3
  "description": "Cross-session memory for DeepSeek Harness — plain markdown files, no database, no worker.",
4
- "version": "1.5.1",
4
+ "version": "1.5.2",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "exports": {