@@ -6,8 +6,7 @@ import * as os from "os";
66import * as path from "path" ;
77import { GitFileHistory } from "../common/file-history" ;
88import { clearSessionState } from "../common/state" ;
9- import { type SessionMessage } from "../session" ;
10- import { SessionManager } from "../session" ;
9+ import { getProjectCode , SessionManager , type SessionMessage } from "../session" ;
1110
1211const originalFetch = globalThis . fetch ;
1312const originalConsoleWarn = console . warn ;
@@ -45,6 +44,21 @@ afterEach(() => {
4544 }
4645} ) ;
4746
47+ test ( "getProjectCode shortens long project roots for Windows-compatible storage paths" , ( ) => {
48+ const shortRoot = "short-project" ;
49+ assert . equal ( getProjectCode ( shortRoot ) , shortRoot . replace ( / [ \\ / ] / g, "-" ) . replace ( / : / g, "" ) ) ;
50+
51+ const longRoot = path . join (
52+ os . tmpdir ( ) ,
53+ "deepcode-project-code-workspace-with-a-long-name-that-would-create-long-git-internal-paths"
54+ ) ;
55+ const projectCode = getProjectCode ( longRoot ) ;
56+
57+ assert . ok ( projectCode . length <= 64 ) ;
58+ assert . match ( projectCode , / ^ [ A - Z a - z 0 - 9 . _ - ] + $ / ) ;
59+ assert . notEqual ( projectCode , longRoot . replace ( / [ \\ / ] / g, "-" ) . replace ( / : / g, "" ) ) ;
60+ } ) ;
61+
4862test ( "SessionManager preserves structured system content when building OpenAI messages" , ( ) => {
4963 const manager = new SessionManager ( {
5064 projectRoot : process . cwd ( ) ,
@@ -271,7 +285,7 @@ test("SessionManager normalizes legacy sessions without activeTokens to zero", (
271285 const home = createTempDir ( "deepcode-legacy-active-tokens-home-" ) ;
272286 setHomeDir ( home ) ;
273287
274- const projectCode = workspace . replace ( / [ \\ / ] / g , "-" ) . replace ( / : / g , "" ) ;
288+ const projectCode = getProjectCode ( workspace ) ;
275289 const projectDir = path . join ( home , ".deepcode" , "projects" , projectCode ) ;
276290 fs . mkdirSync ( projectDir , { recursive : true } ) ;
277291 fs . writeFileSync (
@@ -324,7 +338,7 @@ test("SessionManager marks skills loaded from existing session messages", async
324338 "utf8"
325339 ) ;
326340
327- const projectCode = workspace . replace ( / [ \\ / ] / g , "-" ) . replace ( / : / g , "" ) ;
341+ const projectCode = getProjectCode ( workspace ) ;
328342 const projectDir = path . join ( home , ".deepcode" , "projects" , projectCode ) ;
329343 fs . mkdirSync ( projectDir , { recursive : true } ) ;
330344 fs . writeFileSync (
@@ -982,14 +996,7 @@ test("createSession initializes file-history repo and session branch", async (t)
982996
983997 const sessionId = await manager . createSession ( { text : "first prompt" } ) ;
984998 const userMessage = manager . listSessionMessages ( sessionId ) . find ( ( message ) => message . role === "user" ) ;
985- const gitDir = path . join (
986- home ,
987- ".deepcode" ,
988- "projects" ,
989- workspace . replace ( / [ \\ / ] / g, "-" ) . replace ( / : / g, "" ) ,
990- "file-history" ,
991- ".git"
992- ) ;
999+ const gitDir = path . join ( home , ".deepcode" , "projects" , getProjectCode ( workspace ) , "file-history" , ".git" ) ;
9931000
9941001 assert . ok ( fs . existsSync ( gitDir ) ) ;
9951002 assert . ok ( userMessage ?. checkpointHash ) ;
@@ -2850,13 +2857,7 @@ test("SessionManager.deleteSession removes the messages file", () => {
28502857 ( manager as any ) . activateSession = async ( ) => { } ;
28512858
28522859 const sessionId = createSessionAndMessages ( manager , "session-delete-msg" , "Test session" ) ;
2853- const messagePath = path . join (
2854- home ,
2855- ".deepcode" ,
2856- "projects" ,
2857- workspace . replace ( / [ \\ \\ / ] / g, "-" ) . replace ( / : / g, "" ) ,
2858- `${ sessionId } .jsonl`
2859- ) ;
2860+ const messagePath = path . join ( home , ".deepcode" , "projects" , getProjectCode ( workspace ) , `${ sessionId } .jsonl` ) ;
28602861
28612862 // Verify messages file exists
28622863 assert . ok ( fs . existsSync ( messagePath ) ) ;
@@ -2962,7 +2963,7 @@ function createFileHistoryCommit(
29622963 sessionId : string ,
29632964 files : Record < string , string >
29642965) : string {
2965- const projectCode = workspace . replace ( / [ \\ / ] / g , "-" ) . replace ( / : / g , "" ) ;
2966+ const projectCode = getProjectCode ( workspace ) ;
29662967 const gitDir = path . join ( home , ".deepcode" , "projects" , projectCode , "file-history" , ".git" ) ;
29672968 const fileHistory = new GitFileHistory ( workspace , gitDir ) ;
29682969 fileHistory . ensureSession ( sessionId ) ;
@@ -2980,7 +2981,7 @@ function createFileHistoryCommit(
29802981}
29812982
29822983function getFileHistoryGitDir ( home : string , workspace : string ) : string {
2983- const projectCode = workspace . replace ( / [ \\ / ] / g , "-" ) . replace ( / : / g , "" ) ;
2984+ const projectCode = getProjectCode ( workspace ) ;
29842985 return path . join ( home , ".deepcode" , "projects" , projectCode , "file-history" , ".git" ) ;
29852986}
29862987
0 commit comments