MCPcopy
hub / github.com/anomalyco/opencode / createDirSyncContext

Function createDirSyncContext

packages/app/src/context/directory-sync.ts:22–154  ·  view source on GitHub ↗
(
  directory: string,
  serverSync: ReturnType<typeof createServerSyncContextInner>,
  serverSDK: ReturnType<typeof createServerSdkContext>,
)

Source from the content-addressed store, hash-verified

20])
21
22export const createDirSyncContext = (
23 directory: string,
24 serverSync: ReturnType<typeof createServerSyncContextInner>,
25 serverSDK: ReturnType<typeof createServerSdkContext>,
26) => {
27 const client = serverSDK.createClient({ directory, throwOnError: true })
28 const current = createMemo(() => serverSync.child(directory, { mcp: true }))
29 const absolute = (path: string) => (current()[0].path.directory + "/" + path).replace("//", "/")
30 const data = new Proxy({} as State, {
31 get(_, property: keyof State) {
32 if (property === "session_working") return serverSync.session.data.session_working.bind(serverSync.session.data)
33 if (sessionFields.has(property)) return serverSync.session.data[property as keyof typeof serverSync.session.data]
34 return current()[0][property]
35 },
36 })
37 const set = ((...input: unknown[]) => {
38 if (typeof input[0] === "string" && sessionFields.has(input[0])) {
39 return (serverSync.session.set as (...args: unknown[]) => unknown)(...input)
40 }
41 const result = (current()[1] as (...args: unknown[]) => unknown)(...input)
42 if (input[0] === "session") current()[0].session.forEach(serverSync.session.remember)
43 return result
44 }) as SetStoreFunction<State>
45
46 const index = (sessionID: string) => {
47 const session = serverSync.session.get(sessionID)
48 if (!session || session.directory !== directory) return
49 const [store, setStore] = current()
50 const result = Binary.search(store.session, session.id, (item) => item.id)
51 if (result.found) {
52 setStore("session", result.index, reconcile(session))
53 return
54 }
55 setStore(
56 "session",
57 produce((draft) => void draft.splice(result.index, 0, session)),
58 )
59 }
60
61 return {
62 data,
63 set,
64 get status() {
65 return current()[0].status
66 },
67 get ready() {
68 return current()[0].status !== "loading"
69 },
70 get project() {
71 const store = current()[0]
72 const match = Binary.search(serverSync.data.project, store.project, (project) => project.id)
73 if (match.found) return serverSync.data.project[match.index]
74 },
75 session: {
76 remember(session: Session) {
77 serverSync.session.remember(session)
78 index(session.id)
79 },

Callers 1

createServerSyncContextFunction · 0.90

Calls 6

setStoreFunction · 0.85
currentFunction · 0.70
cmpFunction · 0.70
listMethod · 0.65
updateMethod · 0.65
reconcileFunction · 0.50

Tested by

no test coverage detected