@@ -27,13 +27,20 @@ func TestResolveTargetsFiltersAndIncludesSpecialFiles(t *testing.T) {
2727 aiderHistory := filepath .Join (aiderRoot , "repo" , parser .AiderHistoryFileName ())
2828 windsurfUserRoot := filepath .Join (root , "Windsurf" , "User" )
2929 windsurfWorkspaceRoot := filepath .Join (windsurfUserRoot , "workspaceStorage" )
30+ windsurfWorkspaceDir := filepath .Join (windsurfWorkspaceRoot , "workspace-a" )
31+ windsurfStateDB := filepath .Join (windsurfWorkspaceDir , parser .WindsurfStateDBName )
32+ windsurfWorkspaceJSON := filepath .Join (windsurfWorkspaceDir , "workspace.json" )
33+ windsurfSecret := filepath .Join (windsurfWorkspaceDir , "extension-secret.json" )
3034 require .NoError (t , os .MkdirAll (claudeDir , 0o755 ))
3135 require .NoError (t , os .MkdirAll (codexDir , 0o755 ))
3236 require .NoError (t , os .MkdirAll (devinDir , 0o755 ))
3337 require .NoError (t , os .MkdirAll (warpDir , 0o755 ))
3438 require .NoError (t , os .MkdirAll (filepath .Dir (aiderHistory ), 0o755 ))
35- require .NoError (t , os .MkdirAll (windsurfWorkspaceRoot , 0o755 ))
39+ require .NoError (t , os .MkdirAll (windsurfWorkspaceDir , 0o755 ))
3640 require .NoError (t , os .WriteFile (aiderHistory , []byte ("# aider\n " ), 0o644 ))
41+ require .NoError (t , os .WriteFile (windsurfStateDB , []byte ("state" ), 0o644 ))
42+ require .NoError (t , os .WriteFile (windsurfWorkspaceJSON , []byte ("{}\n " ), 0o644 ))
43+ require .NoError (t , os .WriteFile (windsurfSecret , []byte ("secret" ), 0o644 ))
3744 codexIndex := filepath .Join (root , ".codex" , parser .CodexSessionIndexFilename )
3845 require .NoError (t , os .WriteFile (codexIndex , []byte ("{}\n " ), 0o644 ))
3946
@@ -57,8 +64,13 @@ func TestResolveTargetsFiltersAndIncludesSpecialFiles(t *testing.T) {
5764 assert .NotContains (t , targets .Dirs , parser .AgentWarp )
5865 assert .Equal (t , []string {aiderHistory }, targets .Dirs [parser .AgentAider ])
5966 assert .NotContains (t , targets .Dirs , parser .AgentZed )
60- assert .Equal (t , []string {windsurfWorkspaceRoot }, targets .Dirs [parser .AgentWindsurf ])
61- assert .NotContains (t , targets .Dirs [parser .AgentWindsurf ], windsurfUserRoot )
67+ assert .Equal (t , []string {windsurfUserRoot }, targets .Dirs [parser .AgentWindsurf ])
68+ assert .NotContains (t , targets .Dirs [parser .AgentWindsurf ], windsurfWorkspaceRoot )
69+ assert .ElementsMatch (t , []string {
70+ windsurfStateDB ,
71+ windsurfWorkspaceJSON ,
72+ }, targets .Files [parser .AgentWindsurf ])
73+ assert .NotContains (t , targets .Files [parser .AgentWindsurf ], windsurfSecret )
6274 assert .Contains (t , targets .ExtraFiles , codexIndex )
6375}
6476
@@ -84,13 +96,26 @@ func TestResolveTargetsSkipsAiderHomeRoot(t *testing.T) {
8496func TestSelectAllowedTargetsReturnsResolvedValues (t * testing.T ) {
8597 allowed := remotesync.TargetSet {
8698 Dirs : map [parser.AgentType ][]string {
87- parser .AgentClaude : {"/srv/claude" , "/srv/claude-extra" },
99+ parser .AgentClaude : {"/srv/claude" , "/srv/claude-extra" },
100+ parser .AgentWindsurf : {"/srv/Windsurf/User" },
101+ },
102+ Files : map [parser.AgentType ][]string {
103+ parser .AgentWindsurf : {
104+ "/srv/Windsurf/User/workspaceStorage/a/state.vscdb" ,
105+ "/srv/Windsurf/User/workspaceStorage/a/workspace.json" ,
106+ },
88107 },
89108 ExtraFiles : []string {"/srv/.codex/session_index.jsonl" },
90109 }
91110 requested := remotesync.TargetSet {
92111 Dirs : map [parser.AgentType ][]string {
93- parser .AgentClaude : {"/srv/claude-extra" },
112+ parser .AgentClaude : {"/srv/claude-extra" },
113+ parser .AgentWindsurf : {"/srv/Windsurf/User" },
114+ },
115+ Files : map [parser.AgentType ][]string {
116+ parser .AgentWindsurf : {
117+ "/srv/Windsurf/User/workspaceStorage/a/state.vscdb" ,
118+ },
94119 },
95120 ExtraFiles : []string {"/srv/.codex/session_index.jsonl" },
96121 }
@@ -99,9 +124,36 @@ func TestSelectAllowedTargetsReturnsResolvedValues(t *testing.T) {
99124
100125 require .True (t , ok )
101126 assert .Equal (t , []string {"/srv/claude-extra" }, selected .Dirs [parser .AgentClaude ])
127+ assert .Equal (t , []string {"/srv/Windsurf/User" }, selected .Dirs [parser .AgentWindsurf ])
128+ assert .Equal (t , []string {
129+ "/srv/Windsurf/User/workspaceStorage/a/state.vscdb" ,
130+ }, selected .Files [parser .AgentWindsurf ])
102131 assert .Equal (t , []string {"/srv/.codex/session_index.jsonl" }, selected .ExtraFiles )
103132}
104133
134+ func TestSelectAllowedTargetsRejectsFileScopedDirOnlyRequest (t * testing.T ) {
135+ allowed := remotesync.TargetSet {
136+ Dirs : map [parser.AgentType ][]string {
137+ parser .AgentWindsurf : {"/srv/Windsurf/User" },
138+ },
139+ Files : map [parser.AgentType ][]string {
140+ parser .AgentWindsurf : {
141+ "/srv/Windsurf/User/workspaceStorage/a/state.vscdb" ,
142+ },
143+ },
144+ }
145+ requested := remotesync.TargetSet {
146+ Dirs : map [parser.AgentType ][]string {
147+ parser .AgentWindsurf : {"/srv/Windsurf/User" },
148+ },
149+ }
150+
151+ _ , ok := remotesync .SelectAllowedTargets (allowed , requested )
152+
153+ assert .False (t , ok )
154+ assert .False (t , remotesync .TargetSetAllowed (allowed , requested ))
155+ }
156+
105157func TestSelectAllowedTargetsRejectsUnresolvedValues (t * testing.T ) {
106158 allowed := remotesync.TargetSet {
107159 Dirs : map [parser.AgentType ][]string {
@@ -132,12 +184,17 @@ func TestResolveTargetsMatchesSSHResolverForRepresentativeHome(t *testing.T) {
132184 aiderHistory := filepath .Join (aiderRoot , "repo" , parser .AiderHistoryFileName ())
133185 windsurfUserRoot := filepath .Join (home , "AppData" , "Roaming" , "Windsurf" , "User" )
134186 windsurfWorkspaceRoot := filepath .Join (windsurfUserRoot , "workspaceStorage" )
187+ windsurfWorkspaceDir := filepath .Join (windsurfWorkspaceRoot , "workspace-a" )
188+ windsurfStateDB := filepath .Join (windsurfWorkspaceDir , parser .WindsurfStateDBName )
189+ windsurfWorkspaceJSON := filepath .Join (windsurfWorkspaceDir , "workspace.json" )
135190 require .NoError (t , os .MkdirAll (claudeDir , 0o755 ))
136191 require .NoError (t , os .MkdirAll (codexDir , 0o755 ))
137192 require .NoError (t , os .MkdirAll (devinDir , 0o755 ))
138193 require .NoError (t , os .MkdirAll (filepath .Dir (aiderHistory ), 0o755 ))
139- require .NoError (t , os .MkdirAll (windsurfWorkspaceRoot , 0o755 ))
194+ require .NoError (t , os .MkdirAll (windsurfWorkspaceDir , 0o755 ))
140195 require .NoError (t , os .WriteFile (aiderHistory , []byte ("# aider\n " ), 0o644 ))
196+ require .NoError (t , os .WriteFile (windsurfStateDB , []byte ("state" ), 0o644 ))
197+ require .NoError (t , os .WriteFile (windsurfWorkspaceJSON , []byte ("{}\n " ), 0o644 ))
141198 codexIndex := filepath .Join (home , ".codex" , parser .CodexSessionIndexFilename )
142199 require .NoError (t , os .WriteFile (codexIndex , []byte ("{}\n " ), 0o644 ))
143200
@@ -164,6 +221,11 @@ func TestResolveTargetsMatchesSSHResolverForRepresentativeHome(t *testing.T) {
164221 assert .NotContains (t , sshDirs , parser .AgentDevin )
165222 assert .NotContains (t , goTargets .Dirs , parser .AgentDevin )
166223 assert .ElementsMatch (t , sshDirs [parser .AgentAider ], goTargets .Dirs [parser .AgentAider ])
167- assert .ElementsMatch (t , sshDirs [parser .AgentWindsurf ], goTargets .Dirs [parser .AgentWindsurf ])
224+ assert .ElementsMatch (t , []string {windsurfWorkspaceRoot }, sshDirs [parser .AgentWindsurf ])
225+ assert .ElementsMatch (t , []string {windsurfUserRoot }, goTargets .Dirs [parser .AgentWindsurf ])
226+ assert .ElementsMatch (t , []string {
227+ windsurfStateDB ,
228+ windsurfWorkspaceJSON ,
229+ }, goTargets .Files [parser .AgentWindsurf ])
168230 assert .ElementsMatch (t , sshExtra , goTargets .ExtraFiles )
169231}
0 commit comments