@@ -5,6 +5,8 @@ import { $ } from "bun"
55import { Storage } from "../storage/storage"
66import { Log } from "../util/log"
77import { Flag } from "@/flag/flag"
8+ import { Session } from "../session"
9+ import { work } from "../util/queue"
810
911export namespace Project {
1012 const log = Log . create ( { service : "project" } )
@@ -77,6 +79,10 @@ export namespace Project {
7779 . text ( )
7880 . then ( ( x ) => path . resolve ( worktree , x . trim ( ) ) )
7981 const projectID = id || "global"
82+ const existing = id ? await Storage . read < Info > ( [ "project" , id ] ) . catch ( ( ) => undefined ) : undefined
83+ if ( ! existing ) {
84+ await migrateFromGlobal ( projectID , worktree )
85+ }
8086 const project : Info = {
8187 id : projectID ,
8288 worktree,
@@ -90,6 +96,31 @@ export namespace Project {
9096 return project
9197 }
9298
99+ async function migrateFromGlobal ( newProjectID : string , worktree : string ) {
100+ const globalProject = await Storage . read < Info > ( [ "project" , "global" ] ) . catch ( ( ) => undefined )
101+ if ( ! globalProject ) return
102+
103+ const globalSessions = await Storage . list ( [ "session" , "global" ] ) . catch ( ( ) => [ ] )
104+ if ( globalSessions . length === 0 ) return
105+
106+ log . info ( "migrating sessions from global" , { newProjectID, worktree, count : globalSessions . length } )
107+ const worktreePrefix = worktree . endsWith ( path . sep ) ? worktree : worktree + path . sep
108+
109+ await work ( 10 , globalSessions , async ( key ) => {
110+ const sessionID = key [ key . length - 1 ]
111+ const session = await Storage . read < Session . Info > ( key ) . catch ( ( ) => undefined )
112+ if ( ! session ) return
113+ if ( session . directory && session . directory !== worktree && ! session . directory . startsWith ( worktreePrefix ) ) return
114+
115+ session . projectID = newProjectID
116+ log . info ( "migrating session" , { sessionID, from : "global" , to : newProjectID } )
117+ await Storage . write ( [ "session" , newProjectID , sessionID ] , session )
118+ await Storage . remove ( key )
119+ } ) . catch ( ( error ) => {
120+ log . error ( "failed to migrate sessions from global to project" , { error, projectId : newProjectID } )
121+ } )
122+ }
123+
93124 export async function setInitialized ( projectID : string ) {
94125 await Storage . update < Info > ( [ "project" , projectID ] , ( draft ) => {
95126 draft . time . initialized = Date . now ( )
0 commit comments