refactor(session): replace dm scope with dimensions policy

This commit is contained in:
Hoshina
2026-04-01 17:19:50 +08:00
parent 3957e2cc72
commit ca9652e120
20 changed files with 568 additions and 124 deletions
+22 -7
View File
@@ -230,9 +230,6 @@ func (s *JSONLStore) ResolveSessionKey(_ context.Context, sessionKey string) (st
if sessionKey == "" {
return "", false, nil
}
if s.sessionExists(sessionKey) {
return sessionKey, true, nil
}
entries, err := os.ReadDir(s.dir)
if err != nil {
@@ -254,16 +251,34 @@ func (s *JSONLStore) ResolveSessionKey(_ context.Context, sessionKey string) (st
if meta.Key == "" {
continue
}
if meta.Key == sessionKey {
return meta.Key, true, nil
}
for _, alias := range meta.Aliases {
if alias == sessionKey {
if alias == sessionKey && meta.Key != sessionKey {
return meta.Key, true, nil
}
}
}
for _, entry := range entries {
if entry.IsDir() || !strings.HasSuffix(entry.Name(), ".meta.json") {
continue
}
data, readErr := os.ReadFile(filepath.Join(s.dir, entry.Name()))
if readErr != nil {
return "", false, fmt.Errorf("memory: read meta: %w", readErr)
}
var meta SessionMeta
if err := json.Unmarshal(data, &meta); err != nil {
return "", false, fmt.Errorf("memory: decode meta: %w", err)
}
if meta.Key == sessionKey {
return meta.Key, true, nil
}
}
if s.sessionExists(sessionKey) {
return sessionKey, true, nil
}
return "", false, nil
}
+26
View File
@@ -296,6 +296,32 @@ func TestResolveSessionKeyByAlias(t *testing.T) {
}
}
func TestResolveSessionKeyByAlias_PrefersMetadataOverLegacyFile(t *testing.T) {
store := newTestStore(t)
ctx := context.Background()
if err := store.AddMessage(ctx, "legacy:key", "user", "legacy"); err != nil {
t.Fatalf("AddMessage(legacy) error = %v", err)
}
if err := store.AddMessage(ctx, "canonical", "user", "canonical"); err != nil {
t.Fatalf("AddMessage(canonical) error = %v", err)
}
if err := store.UpsertSessionMeta(ctx, "canonical", nil, []string{"legacy:key"}); err != nil {
t.Fatalf("UpsertSessionMeta() error = %v", err)
}
resolved, found, err := store.ResolveSessionKey(ctx, "legacy:key")
if err != nil {
t.Fatalf("ResolveSessionKey() error = %v", err)
}
if !found {
t.Fatal("ResolveSessionKey() did not find alias")
}
if resolved != "canonical" {
t.Fatalf("resolved = %q, want %q", resolved, "canonical")
}
}
func TestTruncateHistory_KeepLast(t *testing.T) {
store := newTestStore(t)
ctx := context.Background()