feat(app): add draft tab support to tabs store (#31343)
This commit is contained in:
parent
161247c70d
commit
f565ff3c09
4 changed files with 100 additions and 5 deletions
|
|
@ -166,6 +166,24 @@ describe("persist localStorage resilience", () => {
|
|||
expect(storage.getItem(`${target.legacyStorageNames![0]}:${target.key}`)).toBeNull()
|
||||
})
|
||||
|
||||
test("draft target isolates storage per draft and namespaces keys", () => {
|
||||
const a = Persist.draft("draft-a", "prompt")
|
||||
const b = Persist.draft("draft-b", "prompt")
|
||||
|
||||
expect(a.key).toBe("draft:prompt")
|
||||
expect(a.storage).not.toBe(b.storage)
|
||||
expect(a.storage).not.toBe(Persist.workspace("/home/luke/repo", "prompt").storage)
|
||||
})
|
||||
|
||||
test("removes draft storage when removing persisted target", () => {
|
||||
const target = Persist.draft("draft-a", "prompt")
|
||||
storage.setItem(`${target.storage}:${target.key}`, '{"value":1}')
|
||||
|
||||
removePersisted(target)
|
||||
|
||||
expect(storage.getItem(`${target.storage}:${target.key}`)).toBeNull()
|
||||
})
|
||||
|
||||
test("server workspace target preserves local storage and isolates remote storage", () => {
|
||||
const local = Persist.serverWorkspace(ServerScope.local, "/home/luke/repo", "prompt")
|
||||
const windows = Persist.serverWorkspace("https://windows.example" as ServerScope, "/home/luke/repo", "prompt")
|
||||
|
|
|
|||
|
|
@ -341,6 +341,12 @@ function workspaceStorage(dir: string) {
|
|||
return `opencode.workspace.${head}.${sum}.dat`
|
||||
}
|
||||
|
||||
function draftStorage(draftID: string) {
|
||||
const head = (draftID.slice(0, 12) || "draft").replace(/[^a-zA-Z0-9._-]/g, "-")
|
||||
const sum = checksum(draftID) ?? "0"
|
||||
return `opencode.draft.${head}.${sum}.dat`
|
||||
}
|
||||
|
||||
function legacyWorkspaceStorage(dir: string) {
|
||||
const storage = workspaceStorage(pathKey(dir))
|
||||
const result = new Set<string>()
|
||||
|
|
@ -450,6 +456,12 @@ function localStorageDirect(): SyncStorage {
|
|||
}
|
||||
}
|
||||
|
||||
const DRAFT_PERSISTED_KEYS = ["prompt", "comments", "model-selection", "file-view", "layout"]
|
||||
|
||||
export function draftPersistedKeys() {
|
||||
return DRAFT_PERSISTED_KEYS
|
||||
}
|
||||
|
||||
export const PersistTesting = {
|
||||
localStorageDirect,
|
||||
localStorageWithPrefix,
|
||||
|
|
@ -462,6 +474,9 @@ export const Persist = {
|
|||
global(key: string, legacy?: string[]): PersistTarget {
|
||||
return { storage: GLOBAL_STORAGE, key, legacy }
|
||||
},
|
||||
draft(draftID: string, key: string, legacy?: string[]): PersistTarget {
|
||||
return { storage: draftStorage(draftID), key: `draft:${key}`, legacy }
|
||||
},
|
||||
serverGlobal(scope: ServerScopeValue, key: string, legacy?: string[]): PersistTarget {
|
||||
if (scope === ServerScope.local) return Persist.global(key, legacy)
|
||||
return { storage: GLOBAL_STORAGE, key: ScopedKey.from(scope, key) }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue