agentscope-ai / agentscope-ai/agentscope-java
[Feature]: memory/archive/ 与 session 需要真正的删除保留期(当前只有「归档」没有「清理」)
- Dominant language
- Java
- Stars
- 5.6k
- Forks
- 1.3k
- Avg merge
- 4d 12h
- Merged PRs (30d)
- 77
Description
> Labels 建议:`enhancement` / `harness` / `memory`
## 环境
| | |
|---|---|
| agentscope-harness | 2.0.2 |
| store | `agentscope-extensions-mysql` 2.0.2(`JdbcStore` → MySQL 8.0.21) |
| 场景 | **非 sandbox**,`CompositeFilesystem` + 远程 store,长期在线服务 |
## 问题
框架给了两个看起来像「保留期」的配置,但都没有真正删除数据的能力。
### 一、`dailyFileRetentionDays` 只搬家,不删除
```java
// MemoryMaintenanceMiddleware.java:247-256
LocalDate fileDate = LocalDate.parse(baseName);
if (fileDate.isBefore(cutoff)) {
String fromPath = WorkspaceConstants.MEMORY_DIR + "/" + fileName;
String toPath = WorkspaceConstants.MEMORY_DIR + "/archive/" + fileName;
fs.move(rc, fromPath, toPath); // 只是移进 archive
}
```
过期日更文件被移进 `memory/archive/`,而 **archive 目录本身没有任何清理逻辑**,也没有对应的配置项。数据只是换了个位置继续躺着,**永久增长**。
对文件系统后端而言这也许还能接受(磁盘便宜),但在远程 store(MySQL / Redis / OSS)后端下,它就是一张只增不减的表。
### 二、`sessionRetentionDays` 实际不生效
`pruneOldSessions()` 因为两个独立缺陷完全不工作(glob 路径层级与路由前缀对不上;空 mtime 被跳过),详见姊妹 issue。**配置项存在但没有任何效果。**
此外 `sessions.json`(会话树索引,`WorkspaceManager.updateSessionIndex():403` 每次 offload 整份重写)的条目**只增不减**,框架侧没有任何删除逻辑。它在响应路径上被同步读写,体积直接换算成每轮延迟。
## 我们被迫做的事
为了让存储不无界增长,我们写了一个定时任务,**绕过框架抽象直接对 `agentscope_store` 执行 SQL**:
1. 删 `memory` 段里 `item_key LIKE '/archive/%'` 且过期的行
2. 删 `sessions` 段里过期的 `*.jsonl`(保留 `/sessions.json` 整行)
3. 删 `tasks` 段里过期的行
4. 解析 `/sessions.json` 的 `value_json`,剪掉里面过期的会话条目再写回
这条路的代价是**我们必须依赖框架的内部实现细节**:
- 命名空间在 `JdbcStore` 里以 ASCII `0x1F` 连接各段、且结尾也带一个(写 SQL 得用 `CHAR(31)`)
- `item_key` 带前导斜杠(`CompositeFilesystem.routeForPath` 剥掉路由前缀后产出 `"/" + suffix`)
- `value_json` 是 `FileData` 的 JSON 包装,正文在 `content` 字段里
这些都是实现细节,任何一处变化都会让清理**静默失效**(删不到任何行、且不报错)。我们只能写测试和 PoC 去钉住这些契约 —— 但这本不该由使用方承担。
## 期望
1. **给 archive 一个真正的保留期**,例如新增 `archiveRetentionDays`;或者让 `dailyFileRetentionDays` 到期直接删除(配合一个 `archiveBeforeDelete` 开关保留现有行为)
2. **修好 session 侧的实际删除**,让 `sessionRetentionDays` 名副其实(见姊妹 issue)
3. **`sessions.json` 的条目按同一保留期剪枝** —— 它是唯一一个体积直接影响每轮响应延迟的文件
4. 清理动作最好都经由 `AbstractFilesystem`,这样对文件系统 / sandbox / 远程 store 三种后端行为一致,使用方也不需要知道任何存储层的字节格式
## 相关
- 「`pruneOldSessions` 的 glob 路径与路由前缀不匹配」(本 feature 的前置 bug)
- 「`WorkspaceIndex` 快速路径返回空 mtime」(同样阻断清理)
Contributor guide
Assessment
This issue has not been assessed yet.