refactor(core): replace legacy logger with Effect logging (#31310)

This commit is contained in:
Dax
2026-06-08 15:41:56 -04:00
committed by GitHub
parent 0a7cb20e66
commit c06ad7c881
152 changed files with 698 additions and 2243 deletions
+24 -116
View File
@@ -12,7 +12,6 @@ import { EventV2 } from "@opencode-ai/core/event"
import { EventV2Bridge } from "@/event-v2-bridge"
import { EventSequenceTable, EventTable } from "@opencode-ai/core/event/sql"
import { FSUtil } from "@opencode-ai/core/fs-util"
import * as Log from "@opencode-ai/core/util/log"
import { RuntimeFlags } from "@/effect/runtime-flags"
import { ProjectV2 } from "@opencode-ai/core/project"
import { Slug } from "@opencode-ai/core/util/slug"
@@ -74,7 +73,6 @@ function fromRow(row: typeof WorkspaceTable.$inferSelect): Info {
}
}
const log = Log.create({ service: "workspace-sync" })
export const CreateInput = Schema.Struct({
id: Schema.optional(WorkspaceV2.ID),
@@ -292,18 +290,16 @@ export const layer = Layer.effect(
const response = yield* http.execute(input.remote({ workspace, target })).pipe(
Effect.catch((error) =>
Effect.sync(() => {
log.warn("workspace target request failed", {
workspaceID: workspace.id,
error: errorData(error),
})
}),
Effect.logWarning("workspace target request failed", {
workspaceID: workspace.id,
error: errorData(error),
}).pipe(Effect.as(undefined)),
),
)
if (!response) return input.fallback
if (response.status < 200 || response.status >= 300) {
const body = yield* response.text.pipe(Effect.catch(() => Effect.succeed("")))
log.warn("workspace target request failed", {
yield* Effect.logWarning("workspace target request failed", {
workspaceID: workspace.id,
status: response.status,
body,
@@ -315,13 +311,10 @@ export const layer = Layer.effect(
return yield* body.pipe(
Effect.map((result) => result as A),
Effect.catch((error) =>
Effect.sync(() => {
log.warn("workspace target response decode failed", {
workspaceID: workspace.id,
error: errorData(error),
})
return input.fallback
}),
Effect.logWarning("workspace target response decode failed", {
workspaceID: workspace.id,
error: errorData(error),
}).pipe(Effect.as(input.fallback)),
),
)
})
@@ -348,11 +341,6 @@ export const layer = Layer.effect(
)
: {}
log.info("syncing workspace history", {
workspaceID: space.id,
sessions: sessionIDs.length,
known: Object.keys(state).length,
})
const response = yield* http.execute(
HttpClientRequest.post(route(url, "/sync/history"), {
@@ -372,10 +360,6 @@ export const layer = Layer.effect(
const history = (yield* response.json) as HistoryEvent[]
log.info("workspace history synced", {
workspaceID: space.id,
events: history.length,
})
yield* Effect.forEach(
history,
@@ -404,17 +388,16 @@ export const layer = Layer.effect(
let attempt = 0
while (true) {
log.info("connecting to global sync", { workspace: space.name })
setStatus(space.id, "connecting")
const stream = yield* connectSSE(target.url, target.headers).pipe(
Effect.tap(() => syncHistory(space, target.url, target.headers)),
Effect.catch((err) =>
Effect.sync(() => {
Effect.gen(function* () {
setStatus(space.id, "error")
log.info("failed to connect to global sync", {
yield* Effect.logWarning("failed to connect to global sync", {
workspace: space.name,
err,
error: errorData(err),
})
return null
}),
@@ -424,7 +407,6 @@ export const layer = Layer.effect(
if (stream) {
attempt = 0
log.info("global sync connected", { workspace: space.name })
setStatus(space.id, "connected")
yield* parseSSE(stream, (evt) =>
@@ -437,13 +419,10 @@ export const layer = Layer.effect(
const failed = yield* events.replay(payload.syncEvent, { publish: true, ownerID: space.id }).pipe(
Effect.as(false),
Effect.catchCause((error) =>
Effect.sync(() => {
log.info("failed to replay global event", {
workspaceID: space.id,
error,
})
return true
}),
Effect.logWarning("failed to replay global event", error).pipe(
Effect.annotateLogs({ workspaceID: space.id }),
Effect.as(true),
),
),
)
if (failed) return
@@ -458,15 +437,14 @@ export const layer = Layer.effect(
payload: event.payload,
})
} catch (error) {
log.info("failed to replay global event", {
yield* Effect.logWarning("failed to emit global event", {
workspaceID: space.id,
error,
error: errorData(error),
})
}
}),
)
log.info("disconnected from global sync: " + space.id)
setStatus(space.id, "disconnected")
}
@@ -482,9 +460,9 @@ export const layer = Layer.effect(
const target = yield* WorkspaceAdapterRuntime.target(space).pipe(
Effect.catch((error) =>
Effect.sync(() => {
Effect.gen(function* () {
setStatus(space.id, "error")
log.warn("workspace target failed", {
yield* Effect.logWarning("workspace target failed", {
workspaceID: space.id,
error: errorData(error),
})
@@ -511,11 +489,11 @@ export const layer = Layer.effect(
// allow the fiber to fail and automatically get removed
syncWorkspaceLoop(space).pipe(
Effect.catch((error) =>
Effect.sync(() => {
Effect.gen(function* () {
setStatus(space.id, "error")
log.warn("workspace listener failed", {
yield* Effect.logWarning("workspace listener failed", {
workspaceID: space.id,
error,
error: errorData(error),
})
}),
),
@@ -597,10 +575,6 @@ export const layer = Layer.effect(
const sessionWarp = Effect.fn("Workspace.sessionWarp")(function* (input: SessionWarpInput) {
return yield* Effect.gen(function* () {
log.info("session warp requested", {
workspaceID: input.workspaceID,
sessionID: input.sessionID,
})
const current = yield* db
.select({ workspaceID: SessionTable.workspace_id })
@@ -618,11 +592,6 @@ export const layer = Layer.effect(
yield* syncHistory(previous, target.url, target.headers).pipe(
Effect.catch((error) =>
Effect.sync(() => {
log.warn("session warp final source sync failed", {
workspaceID: previous.id,
sessionID: input.sessionID,
error: errorData(error),
})
}),
),
)
@@ -669,11 +638,6 @@ export const layer = Layer.effect(
if (input.workspaceID === null) {
yield* session.setWorkspace({ sessionID: input.sessionID, workspaceID: undefined })
log.info("session warp complete", {
workspaceID: input.workspaceID,
sessionID: input.sessionID,
target: "local",
})
return
}
@@ -690,11 +654,6 @@ export const layer = Layer.effect(
if (target.type === "local") {
yield* session.setWorkspace({ sessionID: input.sessionID, workspaceID: input.workspaceID })
log.info("session warp complete", {
workspaceID: input.workspaceID,
sessionID: input.sessionID,
target: target.directory,
})
return
}
@@ -720,15 +679,6 @@ export const layer = Layer.effect(
const batches = Iterable.chunksOf(rows, 10)
const total = Iterable.size(batches)
log.info("session warp prepared", {
workspaceID: input.workspaceID,
sessionID: input.sessionID,
target: String(route(target.url, "/sync/replay")),
events: rows.length,
batches: total,
first: rows[0]?.seq,
last: rows.at(-1)?.seq,
})
yield* Effect.forEach(
batches,
@@ -746,14 +696,6 @@ export const layer = Layer.effect(
if (response.status < 200 || response.status >= 300) {
const body = yield* response.text
log.error("session warp batch failed", {
workspaceID: input.workspaceID,
sessionID: input.sessionID,
step: i + 1,
total,
status: response.status,
body,
})
return yield* new SessionWarpHttpError({
message: `Failed to warp session ${input.sessionID} into workspace ${workspaceID}: HTTP ${response.status} ${body}`,
workspaceID,
@@ -763,13 +705,6 @@ export const layer = Layer.effect(
})
}
log.info("session warp batch posted", {
workspaceID: input.workspaceID,
sessionID: input.sessionID,
step: i + 1,
total,
status: response.status,
})
}),
{ discard: true },
)
@@ -782,12 +717,6 @@ export const layer = Layer.effect(
)
if (response.status < 200 || response.status >= 300) {
const body = yield* response.text
log.error("session warp steal failed", {
workspaceID: input.workspaceID,
sessionID: input.sessionID,
status: response.status,
body,
})
return yield* new SessionWarpHttpError({
message: `Failed to steal session ${input.sessionID} into workspace ${workspaceID}: HTTP ${response.status} ${body}`,
workspaceID,
@@ -799,22 +728,7 @@ export const layer = Layer.effect(
yield* session.setWorkspace({ sessionID: input.sessionID, workspaceID: input.workspaceID })
log.info("session warp complete", {
workspaceID: input.workspaceID,
sessionID: input.sessionID,
batches: total,
})
}).pipe(
Effect.tapError((err) =>
Effect.sync(() =>
log.error("session warp failed", {
workspaceID: input.workspaceID,
sessionID: input.sessionID,
error: errorData(err),
}),
),
),
)
})
})
const list = Effect.fn("Workspace.list")(function* (project: Project.Info) {
@@ -836,7 +750,6 @@ export const layer = Layer.effect(
WorkspaceAdapterRuntime.list(adapter).pipe(
Effect.catchCause((error) =>
Effect.sync(() => {
log.warn("workspace adapter list failed", { type, error })
return []
}),
),
@@ -916,7 +829,6 @@ export const layer = Layer.effect(
}),
() =>
Effect.sync(() => {
log.error("adapter not available when removing workspace", { type: row.type })
}),
)
@@ -973,10 +885,6 @@ export const layer = Layer.effect(
Effect.catch((error) =>
Effect.sync(() => {
setStatus(workspace.id, "error")
log.warn("workspace sync failed to start", {
workspaceID: workspace.id,
error,
})
}),
),
Effect.forkDetach,