| 90 | } |
| 91 | } |
| 92 | return messages |
| 93 | } |
| 94 | |
| 95 | func (s *Store) SaveStateWithRecovery(sessionID string, state *agent.AgentState, recovery map[string]any, tasks []map[string]any) error { |
| 96 | if state == nil { |
| 97 | return nil |
| 98 | } |
| 99 | s.migrateLegacySession(sessionID) |
| 100 | generation := newGenerationID() |
| 101 | stateMap := orderedAgentStateSnapshot(state) |
| 102 | recoveryPayload := newOrderedJSONMap() |
| 103 | recoveryPayload.Set("version", 1) |
| 104 | recoveryPayload.Set("generation", generation) |
| 105 | recoveryPayload.Set("agent_scopes", map[string]any{}) |
| 106 | setOrderedMapValues(recoveryPayload, recovery) |
| 107 | recoveryPayload.Set("generation", generation) |
| 108 | |
| 109 | statePayload := newOrderedJSONMap() |
| 110 | statePayload.Set("generation", generation) |
| 111 | statePayload.Set("state", stateMap) |
| 112 | if err := atomicWriteJSON(s.statePath(sessionID), statePayload); err != nil { |
| 113 | return err |
| 114 | } |
| 115 | if err := atomicWriteJSON(s.skillRecoveryPath(sessionID), recoveryPayload); err != nil { |
| 116 | return err |
| 117 | } |
| 118 | if tasks == nil { |
| 119 | tasks = []map[string]any{} |
| 120 | } |
| 121 | taskPayload := newOrderedJSONMap() |
| 122 | taskPayload.Set("version", 1) |
| 123 | taskPayload.Set("generation", generation) |
| 124 | taskPayload.Set("tasks", tasks) |
| 125 | if err := atomicWriteJSON(s.taskRuntimePath(sessionID), taskPayload); err != nil { |
| 126 | return err |
| 127 | } |
| 128 | commitPayload := newOrderedJSONMap() |
| 129 | commitPayload.Set("generation", generation) |
| 130 | commitPayload.Set("version", 1) |
| 131 | if err := atomicWriteJSON(s.skillRecoveryCommitPath(sessionID), commitPayload); err != nil { |
| 132 | return err |
| 133 | } |
| 134 | _, err := s.upsertMeta(sessionID, len(state.Messages), state.TurnCount, nil) |
| 135 | return err |
| 136 | } |