Skip to content

Commit 59b6b91

Browse files
committed
refactor(store): remove runtime storage mode selection
Always persist regular conversation history in Core and Terminal AI state in local JSONL. Remove RUNTIME_STORE configuration and update storage logs and documentation to reflect fixed routing.
1 parent 923e1b4 commit 59b6b91

12 files changed

Lines changed: 43 additions & 61 deletions

‎cmd/kael/main.go‎

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,8 @@ func run(settings config.Config, logger *zap.Logger) error {
6969
return err
7070
}
7171
defer engine.Close()
72-
var runtimeStore ports.Store
7372
retention := store.RetentionOptions{KeepDays: settings.TerminalAIKeepDays, MaxBytes: settings.TerminalAIMaxBytes, MinFreeBytes: settings.TerminalAIMinFreeBytes}
74-
switch settings.RuntimeStore {
75-
case "core":
76-
runtimeStore, err = store.NewCore(componentClient, settings.RuntimeDataFolderPath, retention)
77-
case "jsonl":
78-
runtimeStore, err = store.NewJSONL(settings.RuntimeDataFolderPath, retention)
79-
default:
80-
return fmt.Errorf("unsupported runtime store %q", settings.RuntimeStore)
81-
}
73+
runtimeStore, err := store.NewCore(componentClient, settings.RuntimeDataFolderPath, retention)
8274
if err != nil {
8375
return err
8476
}
@@ -92,7 +84,7 @@ func run(settings config.Config, logger *zap.Logger) error {
9284
return err
9385
}
9486
}
95-
runtimeService, err := service.New(service.Options{Store: runtimeStore, Engine: engine, Bus: bus, Logger: logger, InstanceID: settings.Name, Workers: 4, ToolResultTimeout: settings.ToolResultTimeout, ArtifactDir: settings.ArtifactFolderPath, Capability: capability, StorageKind: settings.RuntimeStore, StorageDurable: true})
87+
runtimeService, err := service.New(service.Options{Store: runtimeStore, Engine: engine, Bus: bus, Logger: logger, InstanceID: settings.Name, Workers: 4, ToolResultTimeout: settings.ToolResultTimeout, ArtifactDir: settings.ArtifactFolderPath, Capability: capability, StorageKind: "core", StorageDurable: true})
9688
if err != nil {
9789
return err
9890
}
@@ -115,7 +107,7 @@ func run(settings config.Config, logger *zap.Logger) error {
115107
heartbeatContext, cancelHeartbeat := context.WithCancel(context.Background())
116108
defer cancelHeartbeat()
117109
go componentClient.RunHeartbeat(heartbeatContext, logger)
118-
logger.Info("kael started", zap.String("address", httpServer.Addr), zap.String("version", Version), zap.String("component", settings.Name), zap.String("model", engine.Info().Model), zap.String("storage", settings.RuntimeStore))
110+
logger.Info("kael started", zap.String("address", httpServer.Addr), zap.String("version", Version), zap.String("component", settings.Name), zap.String("model", engine.Info().Model), zap.String("storage", "core"), zap.String("terminal_storage", "jsonl"))
119111
signals, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
120112
defer stop()
121113
var serveErr error

‎config_example.yml‎

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,13 @@ BOOTSTRAP_TOKEN: <PleaseChangeMe>
2121
# 同时写入 stdout 和 data/logs/kael.log;文件达到 50 MB 时轮转,保留 7 份、7 天。
2222
# LOG_LEVEL: INFO
2323

24-
# Runtime 状态默认通过组件签名写回 JumpServer Core。
25-
# 仅本地开发或 Core 尚未提供 runtime-store API 时预先选择 jsonl;两种 Store 不双写,
26-
# 禁止在 Core 故障时自动切到 jsonl,否则会形成缺少现有历史的第二个写权威。
27-
# RUNTIME_STORE: core
28-
29-
# Terminal AI 始终保留本地可读事件 JSONL,不上传 Core。
24+
# 普通会话的问答历史通过组件签名写回 JumpServer Core。
25+
# Terminal AI 固定写入 data/terminal/,保留本地可读事件 JSONL,不上传 Core。
3026
# 按最后一次消息/会话更新时间保留,活跃 Run 和有效 Panel 不清理。
3127
# 启动及每小时清理过期会话;容量达到 90% 或磁盘余量不足时,
3228
# 每分钟最多淘汰 100 个最旧的非活跃会话,目标降至 80%。
33-
# 容量统计包含本地 store/、events/ 及快照临时文件;jsonl 模式统计共享目录,
34-
# 但仅淘汰 terminal 会话。附件原始文件和普通服务日志不属于该配额。
29+
# 容量统计包含 data/terminal/ 下的 store/、events/ 及快照临时文件。
30+
# 附件原始文件和普通服务日志不属于该配额。
3531
# 新请求额外预留最多 64 MiB 给在途执行;空间不足返回 storage_capacity_exceeded。
3632
# 清理既有超额数据时允许有界的临时快照开销,实际磁盘必须容纳完整快照。
3733
# TERMINAL_AI_KEEP_DAYS: 7

‎docs/ARCHITECTURE.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,7 @@ Kael 保存编排审计和执行摘要;Koko、Chen、Core 保存其既有执
756756
| Component identity | Core 签发的 AccessKey | 私有文件、`0600`、不进入 Store/Event/日志 |
757757
| Process-local state | 活动 lease/connection ownership、锁、事件唤醒、SSE connection、Provider 请求、Panel executor channel | Kael 退出后清空;持久实体在启动时收敛为安全终态 |
758758

759-
Kael 当前不连接数据库,也不包含 ORM 或 schema migration。默认 adapter 使用组件 AccessKey 调用 Core `/api/v1/chat-ai/runtime-store/`:读取请求携带一次性 nonce 并验证覆盖 head 与全部有序结果的整页 HMAC receipt;写入使用 commit ID 幂等、请求 integrity、签名 receipt 和 `expected_revision` CAS 追加用户可见历史投影。网络/5xx 只以同一 commit ID 有限重试,最终结果不确定或 revision conflict 会 poison 本地 adapter,要求重启重放全部历史 delta。旧版完整运行态在升级首次加载后会用一次精简历史 snapshot 替换,迁移后不再周期性生成 snapshot。Terminal AI 固定写入 `data/terminal/store/runtime.jsonl`;`RUNTIME_STORE=jsonl` 显式回退仍保存完整运行态。
759+
Kael 当前不连接数据库,也不包含 ORM 或 schema migration。默认 adapter 使用组件 AccessKey 调用 Core `/api/v1/chat-ai/runtime-store/`:读取请求携带一次性 nonce 并验证覆盖 head 与全部有序结果的整页 HMAC receipt;写入使用 commit ID 幂等、请求 integrity、签名 receipt 和 `expected_revision` CAS 追加用户可见历史投影。网络/5xx 只以同一 commit ID 有限重试,最终结果不确定或 revision conflict 会 poison 本地 adapter,要求重启重放全部历史 delta。旧版完整运行态在升级首次加载后会用一次精简历史 snapshot 替换,迁移后不再周期性生成 snapshot。Terminal AI 固定写入 `data/terminal/store/runtime.jsonl` 和 `data/terminal/events/`,不提供存储模式切换。
760760

761761
Core history record 在发送前硬限制为 8 MiB;单条问题、终态回答或最小结果异常超限时,该 Store 事务失败但 adapter 不进入 poisoned 状态,也不会把超大 record 发送给 Core/MariaDB。
762762

@@ -959,7 +959,7 @@ Kael component -------- registration / AccessKey / TerminalConfig / heartbeat /
959959

960960
- Gateway 保留完整 `/kael` 前缀;
961961
- SSE 关闭 buffering/cache,并设置足够的 read timeout;
962-
- readiness 检查已初始化、未关闭且未 poisoned 的进程内 Runtime Store 及其持久化 adapter;Core 模式在 2 秒超时内执行带签名的轻量 Runtime Store 探测并校验 receipt 与 revision,JSONL 模式检查 journal 可用性;它不检查 Worker 或模型端点;
962+
- readiness 检查已初始化、未关闭且未 poisoned 的进程内 Runtime Store 及其持久化 adapter;对 Core 在 2 秒超时内执行带签名的轻量 Runtime Store 探测并校验 receipt 与 revision,同时检查 Terminal AI 本地 journal 可用性;它不检查 Worker 或模型端点;
963963
- liveness 不依赖模型、Core 或其它外部系统,避免重启风暴;
964964
- 首次 `SIGINT`/`SIGTERM` 必须取消 HTTP request context 和 SSE、停止 heartbeat/worker 后再执行有界 Shutdown;信号订阅随即释放,第二次信号保留系统默认的强制退出语义;
965965
- `/kael/internal/metrics` 没有业务用户认证,必须由反向代理或网络 ACL 只开放给监控网络;部署方根据自身容量和 SLO 定义指标阈值及回滚条件;

0 commit comments

Comments
 (0)