refactor(flags): route event system through runtime flags (#27323)
This commit is contained in:
parent
098bdd8ae2
commit
f13fc5a8a8
11 changed files with 80 additions and 46 deletions
|
|
@ -11,7 +11,7 @@ import Notifications from "../feature-plugins/system/notifications"
|
||||||
import SessionV2Debug from "../feature-plugins/system/session-v2"
|
import SessionV2Debug from "../feature-plugins/system/session-v2"
|
||||||
import WhichKey from "../feature-plugins/system/which-key"
|
import WhichKey from "../feature-plugins/system/which-key"
|
||||||
import type { TuiPlugin, TuiPluginModule } from "@opencode-ai/plugin/tui"
|
import type { TuiPlugin, TuiPluginModule } from "@opencode-ai/plugin/tui"
|
||||||
import { Flag } from "@opencode-ai/core/flag/flag"
|
import type { RuntimeFlags } from "@/effect/runtime-flags"
|
||||||
|
|
||||||
export type InternalTuiPlugin = Omit<TuiPluginModule, "id"> & {
|
export type InternalTuiPlugin = Omit<TuiPluginModule, "id"> & {
|
||||||
id: string
|
id: string
|
||||||
|
|
@ -19,17 +19,19 @@ export type InternalTuiPlugin = Omit<TuiPluginModule, "id"> & {
|
||||||
enabled?: boolean
|
enabled?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export const INTERNAL_TUI_PLUGINS: InternalTuiPlugin[] = [
|
export function internalTuiPlugins(flags: Pick<RuntimeFlags.Info, "experimentalEventSystem">): InternalTuiPlugin[] {
|
||||||
HomeFooter,
|
return [
|
||||||
HomeTips,
|
HomeFooter,
|
||||||
SidebarContext,
|
HomeTips,
|
||||||
SidebarMcp,
|
SidebarContext,
|
||||||
SidebarLsp,
|
SidebarMcp,
|
||||||
SidebarTodo,
|
SidebarLsp,
|
||||||
SidebarFiles,
|
SidebarTodo,
|
||||||
SidebarFooter,
|
SidebarFiles,
|
||||||
Notifications,
|
SidebarFooter,
|
||||||
PluginManager,
|
Notifications,
|
||||||
WhichKey,
|
PluginManager,
|
||||||
...(Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM ? [SessionV2Debug] : []),
|
WhichKey,
|
||||||
]
|
...(flags.experimentalEventSystem ? [SessionV2Debug] : []),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,11 +35,13 @@ import { Filesystem } from "@/util/filesystem"
|
||||||
import { Process } from "@/util/process"
|
import { Process } from "@/util/process"
|
||||||
import { Flock } from "@opencode-ai/core/util/flock"
|
import { Flock } from "@opencode-ai/core/util/flock"
|
||||||
import { Flag } from "@opencode-ai/core/flag/flag"
|
import { Flag } from "@opencode-ai/core/flag/flag"
|
||||||
import { INTERNAL_TUI_PLUGINS, type InternalTuiPlugin } from "./internal"
|
import { internalTuiPlugins, type InternalTuiPlugin } from "./internal"
|
||||||
import { setupSlots, Slot as View } from "./slots"
|
import { setupSlots, Slot as View } from "./slots"
|
||||||
import type { HostPluginApi, HostSlots } from "./slots"
|
import type { HostPluginApi, HostSlots } from "./slots"
|
||||||
import { ConfigPlugin } from "@/config/plugin"
|
import { ConfigPlugin } from "@/config/plugin"
|
||||||
import { createCommandShim } from "./command-shim"
|
import { createCommandShim } from "./command-shim"
|
||||||
|
import { RuntimeFlags } from "@/effect/runtime-flags"
|
||||||
|
import { Effect } from "effect"
|
||||||
|
|
||||||
ensureRuntimePluginSupport({ additional: keymapRuntimeModules })
|
ensureRuntimePluginSupport({ additional: keymapRuntimeModules })
|
||||||
|
|
||||||
|
|
@ -1070,7 +1072,10 @@ async function load(input: { api: Api; config: TuiConfig.Resolved; dispose?: ()
|
||||||
log.info("skipping external tui plugins in pure mode", { count: config.plugin_origins.length })
|
log.info("skipping external tui plugins in pure mode", { count: config.plugin_origins.length })
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const item of INTERNAL_TUI_PLUGINS) {
|
const flags = await Effect.runPromise(
|
||||||
|
RuntimeFlags.Service.use((flags) => Effect.succeed(flags)).pipe(Effect.provide(RuntimeFlags.defaultLayer)),
|
||||||
|
)
|
||||||
|
for (const item of internalTuiPlugins(flags)) {
|
||||||
log.info("loading internal tui plugin", { id: item.id })
|
log.info("loading internal tui plugin", { id: item.id })
|
||||||
const entry = loadInternalPlugin(item)
|
const entry = loadInternalPlugin(item)
|
||||||
const meta = createMeta(entry.source, entry.spec, entry.target, undefined, entry.id)
|
const meta = createMeta(entry.source, entry.spec, entry.target, undefined, entry.id)
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ export class Service extends ConfigService.Service<Service>()("@opencode/Runtime
|
||||||
experimentalScout: enabledByExperimental("OPENCODE_EXPERIMENTAL_SCOUT"),
|
experimentalScout: enabledByExperimental("OPENCODE_EXPERIMENTAL_SCOUT"),
|
||||||
experimentalLspTool: enabledByExperimental("OPENCODE_EXPERIMENTAL_LSP_TOOL"),
|
experimentalLspTool: enabledByExperimental("OPENCODE_EXPERIMENTAL_LSP_TOOL"),
|
||||||
experimentalPlanMode: enabledByExperimental("OPENCODE_EXPERIMENTAL_PLAN_MODE"),
|
experimentalPlanMode: enabledByExperimental("OPENCODE_EXPERIMENTAL_PLAN_MODE"),
|
||||||
|
experimentalEventSystem: enabledByExperimental("OPENCODE_EXPERIMENTAL_EVENT_SYSTEM"),
|
||||||
client: Config.string("OPENCODE_CLIENT").pipe(Config.withDefault("cli")),
|
client: Config.string("OPENCODE_CLIENT").pipe(Config.withDefault("cli")),
|
||||||
}) {}
|
}) {}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,9 +18,9 @@ import { InstanceState } from "@/effect/instance-state"
|
||||||
import { isOverflow as overflow, usable } from "./overflow"
|
import { isOverflow as overflow, usable } from "./overflow"
|
||||||
import { makeRuntime } from "@/effect/run-service"
|
import { makeRuntime } from "@/effect/run-service"
|
||||||
import { serviceUse } from "@/effect/service-use"
|
import { serviceUse } from "@/effect/service-use"
|
||||||
|
import { RuntimeFlags } from "@/effect/runtime-flags"
|
||||||
import { SyncEvent } from "@/sync"
|
import { SyncEvent } from "@/sync"
|
||||||
import { SessionEvent } from "@/v2/session-event"
|
import { SessionEvent } from "@/v2/session-event"
|
||||||
import { Flag } from "@opencode-ai/core/flag/flag"
|
|
||||||
|
|
||||||
const log = Log.create({ service: "session.compaction" })
|
const log = Log.create({ service: "session.compaction" })
|
||||||
|
|
||||||
|
|
@ -221,6 +221,7 @@ export const layer: Layer.Layer<
|
||||||
| SessionProcessor.Service
|
| SessionProcessor.Service
|
||||||
| Provider.Service
|
| Provider.Service
|
||||||
| SyncEvent.Service
|
| SyncEvent.Service
|
||||||
|
| RuntimeFlags.Service
|
||||||
> = Layer.effect(
|
> = Layer.effect(
|
||||||
Service,
|
Service,
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
|
|
@ -232,6 +233,7 @@ export const layer: Layer.Layer<
|
||||||
const processors = yield* SessionProcessor.Service
|
const processors = yield* SessionProcessor.Service
|
||||||
const provider = yield* Provider.Service
|
const provider = yield* Provider.Service
|
||||||
const sync = yield* SyncEvent.Service
|
const sync = yield* SyncEvent.Service
|
||||||
|
const flags = yield* RuntimeFlags.Service
|
||||||
|
|
||||||
const isOverflow = Effect.fn("SessionCompaction.isOverflow")(function* (input: {
|
const isOverflow = Effect.fn("SessionCompaction.isOverflow")(function* (input: {
|
||||||
tokens: MessageV2.Assistant["tokens"]
|
tokens: MessageV2.Assistant["tokens"]
|
||||||
|
|
@ -572,7 +574,7 @@ export const layer: Layer.Layer<
|
||||||
parts: [],
|
parts: [],
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Compaction.Ended.Sync, {
|
yield* sync.run(SessionEvent.Compaction.Ended.Sync, {
|
||||||
sessionID: input.sessionID,
|
sessionID: input.sessionID,
|
||||||
timestamp: DateTime.makeUnsafe(Date.now()),
|
timestamp: DateTime.makeUnsafe(Date.now()),
|
||||||
|
|
@ -608,7 +610,7 @@ export const layer: Layer.Layer<
|
||||||
auto: input.auto,
|
auto: input.auto,
|
||||||
overflow: input.overflow,
|
overflow: input.overflow,
|
||||||
})
|
})
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Compaction.Started.Sync, {
|
yield* sync.run(SessionEvent.Compaction.Started.Sync, {
|
||||||
sessionID: input.sessionID,
|
sessionID: input.sessionID,
|
||||||
timestamp: DateTime.makeUnsafe(Date.now()),
|
timestamp: DateTime.makeUnsafe(Date.now()),
|
||||||
|
|
@ -636,6 +638,7 @@ export const defaultLayer = Layer.suspend(() =>
|
||||||
Layer.provide(Bus.layer),
|
Layer.provide(Bus.layer),
|
||||||
Layer.provide(Config.defaultLayer),
|
Layer.provide(Config.defaultLayer),
|
||||||
Layer.provide(SyncEvent.defaultLayer),
|
Layer.provide(SyncEvent.defaultLayer),
|
||||||
|
Layer.provide(RuntimeFlags.defaultLayer),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ import { SyncEvent } from "@/sync"
|
||||||
import { SessionEvent } from "@/v2/session-event"
|
import { SessionEvent } from "@/v2/session-event"
|
||||||
import { Modelv2 } from "@/v2/model"
|
import { Modelv2 } from "@/v2/model"
|
||||||
import * as DateTime from "effect/DateTime"
|
import * as DateTime from "effect/DateTime"
|
||||||
import { Flag } from "@opencode-ai/core/flag/flag"
|
import { RuntimeFlags } from "@/effect/runtime-flags"
|
||||||
|
|
||||||
const DOOM_LOOP_THRESHOLD = 3
|
const DOOM_LOOP_THRESHOLD = 3
|
||||||
const log = Log.create({ service: "session.processor" })
|
const log = Log.create({ service: "session.processor" })
|
||||||
|
|
@ -98,6 +98,7 @@ export const layer: Layer.Layer<
|
||||||
| SessionSummary.Service
|
| SessionSummary.Service
|
||||||
| SessionStatus.Service
|
| SessionStatus.Service
|
||||||
| SyncEvent.Service
|
| SyncEvent.Service
|
||||||
|
| RuntimeFlags.Service
|
||||||
> = Layer.effect(
|
> = Layer.effect(
|
||||||
Service,
|
Service,
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
|
|
@ -114,6 +115,7 @@ export const layer: Layer.Layer<
|
||||||
const status = yield* SessionStatus.Service
|
const status = yield* SessionStatus.Service
|
||||||
const image = yield* Image.Service
|
const image = yield* Image.Service
|
||||||
const sync = yield* SyncEvent.Service
|
const sync = yield* SyncEvent.Service
|
||||||
|
const flags = yield* RuntimeFlags.Service
|
||||||
|
|
||||||
const create = Effect.fn("SessionProcessor.create")(function* (input: Input) {
|
const create = Effect.fn("SessionProcessor.create")(function* (input: Input) {
|
||||||
// Pre-capture snapshot before the LLM stream starts. The AI SDK
|
// Pre-capture snapshot before the LLM stream starts. The AI SDK
|
||||||
|
|
@ -232,7 +234,7 @@ export const layer: Layer.Layer<
|
||||||
case "reasoning-start":
|
case "reasoning-start":
|
||||||
if (value.id in ctx.reasoningMap) return
|
if (value.id in ctx.reasoningMap) return
|
||||||
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Reasoning.Started.Sync, {
|
yield* sync.run(SessionEvent.Reasoning.Started.Sync, {
|
||||||
sessionID: ctx.sessionID,
|
sessionID: ctx.sessionID,
|
||||||
reasoningID: value.id,
|
reasoningID: value.id,
|
||||||
|
|
@ -267,7 +269,7 @@ export const layer: Layer.Layer<
|
||||||
case "reasoning-end":
|
case "reasoning-end":
|
||||||
if (!(value.id in ctx.reasoningMap)) return
|
if (!(value.id in ctx.reasoningMap)) return
|
||||||
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Reasoning.Ended.Sync, {
|
yield* sync.run(SessionEvent.Reasoning.Ended.Sync, {
|
||||||
sessionID: ctx.sessionID,
|
sessionID: ctx.sessionID,
|
||||||
reasoningID: value.id,
|
reasoningID: value.id,
|
||||||
|
|
@ -288,7 +290,7 @@ export const layer: Layer.Layer<
|
||||||
throw new Error(`Tool call not allowed while generating summary: ${value.toolName}`)
|
throw new Error(`Tool call not allowed while generating summary: ${value.toolName}`)
|
||||||
}
|
}
|
||||||
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Tool.Input.Started.Sync, {
|
yield* sync.run(SessionEvent.Tool.Input.Started.Sync, {
|
||||||
sessionID: ctx.sessionID,
|
sessionID: ctx.sessionID,
|
||||||
callID: value.id,
|
callID: value.id,
|
||||||
|
|
@ -319,7 +321,7 @@ export const layer: Layer.Layer<
|
||||||
|
|
||||||
case "tool-input-end": {
|
case "tool-input-end": {
|
||||||
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Tool.Input.Ended.Sync, {
|
yield* sync.run(SessionEvent.Tool.Input.Ended.Sync, {
|
||||||
sessionID: ctx.sessionID,
|
sessionID: ctx.sessionID,
|
||||||
callID: value.id,
|
callID: value.id,
|
||||||
|
|
@ -336,7 +338,7 @@ export const layer: Layer.Layer<
|
||||||
}
|
}
|
||||||
const toolCall = yield* readToolCall(value.toolCallId)
|
const toolCall = yield* readToolCall(value.toolCallId)
|
||||||
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Tool.Called.Sync, {
|
yield* sync.run(SessionEvent.Tool.Called.Sync, {
|
||||||
sessionID: ctx.sessionID,
|
sessionID: ctx.sessionID,
|
||||||
callID: value.toolCallId,
|
callID: value.toolCallId,
|
||||||
|
|
@ -422,7 +424,7 @@ export const layer: Layer.Layer<
|
||||||
attachments: attachments?.length ? attachments : undefined,
|
attachments: attachments?.length ? attachments : undefined,
|
||||||
}
|
}
|
||||||
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Tool.Success.Sync, {
|
yield* sync.run(SessionEvent.Tool.Success.Sync, {
|
||||||
sessionID: ctx.sessionID,
|
sessionID: ctx.sessionID,
|
||||||
callID: value.toolCallId,
|
callID: value.toolCallId,
|
||||||
|
|
@ -452,7 +454,7 @@ export const layer: Layer.Layer<
|
||||||
case "tool-error": {
|
case "tool-error": {
|
||||||
const toolCall = yield* readToolCall(value.toolCallId)
|
const toolCall = yield* readToolCall(value.toolCallId)
|
||||||
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Tool.Failed.Sync, {
|
yield* sync.run(SessionEvent.Tool.Failed.Sync, {
|
||||||
sessionID: ctx.sessionID,
|
sessionID: ctx.sessionID,
|
||||||
callID: value.toolCallId,
|
callID: value.toolCallId,
|
||||||
|
|
@ -477,7 +479,7 @@ export const layer: Layer.Layer<
|
||||||
if (!ctx.snapshot) ctx.snapshot = yield* snapshot.track()
|
if (!ctx.snapshot) ctx.snapshot = yield* snapshot.track()
|
||||||
if (!ctx.assistantMessage.summary) {
|
if (!ctx.assistantMessage.summary) {
|
||||||
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Step.Started.Sync, {
|
yield* sync.run(SessionEvent.Step.Started.Sync, {
|
||||||
sessionID: ctx.sessionID,
|
sessionID: ctx.sessionID,
|
||||||
agent: input.assistantMessage.agent,
|
agent: input.assistantMessage.agent,
|
||||||
|
|
@ -509,7 +511,7 @@ export const layer: Layer.Layer<
|
||||||
})
|
})
|
||||||
if (!ctx.assistantMessage.summary) {
|
if (!ctx.assistantMessage.summary) {
|
||||||
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Step.Ended.Sync, {
|
yield* sync.run(SessionEvent.Step.Ended.Sync, {
|
||||||
sessionID: ctx.sessionID,
|
sessionID: ctx.sessionID,
|
||||||
finish: value.finishReason,
|
finish: value.finishReason,
|
||||||
|
|
@ -566,7 +568,7 @@ export const layer: Layer.Layer<
|
||||||
case "text-start":
|
case "text-start":
|
||||||
if (!ctx.assistantMessage.summary) {
|
if (!ctx.assistantMessage.summary) {
|
||||||
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Text.Started.Sync, {
|
yield* sync.run(SessionEvent.Text.Started.Sync, {
|
||||||
sessionID: ctx.sessionID,
|
sessionID: ctx.sessionID,
|
||||||
timestamp: DateTime.makeUnsafe(Date.now()),
|
timestamp: DateTime.makeUnsafe(Date.now()),
|
||||||
|
|
@ -613,7 +615,7 @@ export const layer: Layer.Layer<
|
||||||
)).text
|
)).text
|
||||||
if (!ctx.assistantMessage.summary) {
|
if (!ctx.assistantMessage.summary) {
|
||||||
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Text.Ended.Sync, {
|
yield* sync.run(SessionEvent.Text.Ended.Sync, {
|
||||||
sessionID: ctx.sessionID,
|
sessionID: ctx.sessionID,
|
||||||
text: ctx.currentText.text,
|
text: ctx.currentText.text,
|
||||||
|
|
@ -709,7 +711,7 @@ export const layer: Layer.Layer<
|
||||||
}
|
}
|
||||||
if (!ctx.assistantMessage.summary) {
|
if (!ctx.assistantMessage.summary) {
|
||||||
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Step.Failed.Sync, {
|
yield* sync.run(SessionEvent.Step.Failed.Sync, {
|
||||||
sessionID: ctx.sessionID,
|
sessionID: ctx.sessionID,
|
||||||
error: {
|
error: {
|
||||||
|
|
@ -763,7 +765,7 @@ export const layer: Layer.Layer<
|
||||||
parse,
|
parse,
|
||||||
set: (info) => {
|
set: (info) => {
|
||||||
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
||||||
const event = Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM
|
const event = flags.experimentalEventSystem
|
||||||
? sync.run(SessionEvent.Retried.Sync, {
|
? sync.run(SessionEvent.Retried.Sync, {
|
||||||
sessionID: ctx.sessionID,
|
sessionID: ctx.sessionID,
|
||||||
attempt: info.attempt,
|
attempt: info.attempt,
|
||||||
|
|
@ -826,6 +828,7 @@ export const defaultLayer = Layer.suspend(() =>
|
||||||
Layer.provide(Bus.layer),
|
Layer.provide(Bus.layer),
|
||||||
Layer.provide(Config.defaultLayer),
|
Layer.provide(Config.defaultLayer),
|
||||||
Layer.provide(SyncEvent.defaultLayer),
|
Layer.provide(SyncEvent.defaultLayer),
|
||||||
|
Layer.provide(RuntimeFlags.defaultLayer),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,6 @@ import { ToolRegistry } from "@/tool/registry"
|
||||||
import { ToolJsonSchema } from "@/tool/json-schema"
|
import { ToolJsonSchema } from "@/tool/json-schema"
|
||||||
import { MCP } from "../mcp"
|
import { MCP } from "../mcp"
|
||||||
import { LSP } from "@/lsp/lsp"
|
import { LSP } from "@/lsp/lsp"
|
||||||
import { Flag } from "@opencode-ai/core/flag/flag"
|
|
||||||
import { ulid } from "ulid"
|
import { ulid } from "ulid"
|
||||||
import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process"
|
import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process"
|
||||||
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
|
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
|
||||||
|
|
@ -957,7 +956,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
yield* sessions.updatePart(part)
|
yield* sessions.updatePart(part)
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Shell.Started.Sync, {
|
yield* sync.run(SessionEvent.Shell.Started.Sync, {
|
||||||
sessionID: input.sessionID,
|
sessionID: input.sessionID,
|
||||||
timestamp: DateTime.makeUnsafe(started),
|
timestamp: DateTime.makeUnsafe(started),
|
||||||
|
|
@ -980,7 +979,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the
|
||||||
output += "\n\n" + ["<metadata>", "User aborted the command", "</metadata>"].join("\n")
|
output += "\n\n" + ["<metadata>", "User aborted the command", "</metadata>"].join("\n")
|
||||||
}
|
}
|
||||||
const completed = Date.now()
|
const completed = Date.now()
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Shell.Ended.Sync, {
|
yield* sync.run(SessionEvent.Shell.Ended.Sync, {
|
||||||
sessionID: input.sessionID,
|
sessionID: input.sessionID,
|
||||||
timestamp: DateTime.makeUnsafe(completed),
|
timestamp: DateTime.makeUnsafe(completed),
|
||||||
|
|
@ -1571,7 +1570,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Prompted.Sync, {
|
yield* sync.run(SessionEvent.Prompted.Sync, {
|
||||||
sessionID: input.sessionID,
|
sessionID: input.sessionID,
|
||||||
timestamp: DateTime.makeUnsafe(info.time.created),
|
timestamp: DateTime.makeUnsafe(info.time.created),
|
||||||
|
|
@ -1585,7 +1584,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the
|
||||||
}
|
}
|
||||||
for (const text of nextPrompt.synthetic) {
|
for (const text of nextPrompt.synthetic) {
|
||||||
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
|
||||||
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
|
if (flags.experimentalEventSystem) {
|
||||||
yield* sync.run(SessionEvent.Synthetic.Sync, {
|
yield* sync.run(SessionEvent.Synthetic.Sync, {
|
||||||
sessionID: input.sessionID,
|
sessionID: input.sessionID,
|
||||||
timestamp: DateTime.makeUnsafe(info.time.created),
|
timestamp: DateTime.makeUnsafe(info.time.created),
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ describe("RuntimeFlags", () => {
|
||||||
expect(flags.experimentalScout).toBe(true)
|
expect(flags.experimentalScout).toBe(true)
|
||||||
expect(flags.experimentalLspTool).toBe(true)
|
expect(flags.experimentalLspTool).toBe(true)
|
||||||
expect(flags.experimentalPlanMode).toBe(true)
|
expect(flags.experimentalPlanMode).toBe(true)
|
||||||
|
expect(flags.experimentalEventSystem).toBe(true)
|
||||||
expect(flags.client).toBe("desktop")
|
expect(flags.client).toBe("desktop")
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ import { testEffect } from "../lib/effect"
|
||||||
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
|
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
|
||||||
import { TestConfig } from "../fixture/config"
|
import { TestConfig } from "../fixture/config"
|
||||||
import { SyncEvent } from "@/sync"
|
import { SyncEvent } from "@/sync"
|
||||||
|
import { RuntimeFlags } from "@/effect/runtime-flags"
|
||||||
|
|
||||||
void Log.init({ print: false })
|
void Log.init({ print: false })
|
||||||
|
|
||||||
|
|
@ -225,6 +226,7 @@ const deps = Layer.mergeAll(
|
||||||
Bus.layer,
|
Bus.layer,
|
||||||
Config.defaultLayer,
|
Config.defaultLayer,
|
||||||
SyncEvent.defaultLayer,
|
SyncEvent.defaultLayer,
|
||||||
|
RuntimeFlags.layer({ experimentalEventSystem: true }),
|
||||||
)
|
)
|
||||||
|
|
||||||
const env = Layer.mergeAll(
|
const env = Layer.mergeAll(
|
||||||
|
|
@ -257,6 +259,7 @@ function compactionProcessLayer(options?: CompactionProcessOptions) {
|
||||||
? SessionProcessorModule.SessionProcessor.layer.pipe(
|
? SessionProcessorModule.SessionProcessor.layer.pipe(
|
||||||
Layer.provide(summary),
|
Layer.provide(summary),
|
||||||
Layer.provide(Image.defaultLayer),
|
Layer.provide(Image.defaultLayer),
|
||||||
|
Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })),
|
||||||
Layer.provide(status),
|
Layer.provide(status),
|
||||||
)
|
)
|
||||||
: layer(options?.result ?? "continue")
|
: layer(options?.result ?? "continue")
|
||||||
|
|
@ -272,6 +275,7 @@ function compactionProcessLayer(options?: CompactionProcessOptions) {
|
||||||
Layer.provide(bus),
|
Layer.provide(bus),
|
||||||
Layer.provide(options?.config ?? Config.defaultLayer),
|
Layer.provide(options?.config ?? Config.defaultLayer),
|
||||||
Layer.provide(SyncEvent.defaultLayer),
|
Layer.provide(SyncEvent.defaultLayer),
|
||||||
|
Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ import { provideTmpdirServer } from "../fixture/fixture"
|
||||||
import { testEffect } from "../lib/effect"
|
import { testEffect } from "../lib/effect"
|
||||||
import { raw, reply, TestLLMServer } from "../lib/llm-server"
|
import { raw, reply, TestLLMServer } from "../lib/llm-server"
|
||||||
import { SyncEvent } from "@/sync"
|
import { SyncEvent } from "@/sync"
|
||||||
|
import { RuntimeFlags } from "@/effect/runtime-flags"
|
||||||
|
|
||||||
void Log.init({ print: false })
|
void Log.init({ print: false })
|
||||||
|
|
||||||
|
|
@ -171,7 +172,12 @@ const deps = Layer.mergeAll(
|
||||||
).pipe(Layer.provideMerge(infra))
|
).pipe(Layer.provideMerge(infra))
|
||||||
const env = Layer.mergeAll(
|
const env = Layer.mergeAll(
|
||||||
TestLLMServer.layer,
|
TestLLMServer.layer,
|
||||||
SessionProcessor.layer.pipe(Layer.provide(summary), Layer.provide(Image.defaultLayer), Layer.provideMerge(deps)),
|
SessionProcessor.layer.pipe(
|
||||||
|
Layer.provide(summary),
|
||||||
|
Layer.provide(Image.defaultLayer),
|
||||||
|
Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })),
|
||||||
|
Layer.provideMerge(deps),
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
const it = testEffect(env)
|
const it = testEffect(env)
|
||||||
|
|
|
||||||
|
|
@ -180,7 +180,7 @@ function makeHttp() {
|
||||||
Layer.provide(Reference.defaultLayer),
|
Layer.provide(Reference.defaultLayer),
|
||||||
Layer.provide(Ripgrep.defaultLayer),
|
Layer.provide(Ripgrep.defaultLayer),
|
||||||
Layer.provide(Format.defaultLayer),
|
Layer.provide(Format.defaultLayer),
|
||||||
Layer.provide(RuntimeFlags.layer()),
|
Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })),
|
||||||
Layer.provideMerge(todo),
|
Layer.provideMerge(todo),
|
||||||
Layer.provideMerge(question),
|
Layer.provideMerge(question),
|
||||||
Layer.provideMerge(deps),
|
Layer.provideMerge(deps),
|
||||||
|
|
@ -189,9 +189,14 @@ function makeHttp() {
|
||||||
const proc = SessionProcessor.layer.pipe(
|
const proc = SessionProcessor.layer.pipe(
|
||||||
Layer.provide(summary),
|
Layer.provide(summary),
|
||||||
Layer.provide(Image.defaultLayer),
|
Layer.provide(Image.defaultLayer),
|
||||||
|
Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })),
|
||||||
|
Layer.provideMerge(deps),
|
||||||
|
)
|
||||||
|
const compact = SessionCompaction.layer.pipe(
|
||||||
|
Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })),
|
||||||
|
Layer.provideMerge(proc),
|
||||||
Layer.provideMerge(deps),
|
Layer.provideMerge(deps),
|
||||||
)
|
)
|
||||||
const compact = SessionCompaction.layer.pipe(Layer.provideMerge(proc), Layer.provideMerge(deps))
|
|
||||||
return Layer.mergeAll(
|
return Layer.mergeAll(
|
||||||
TestLLMServer.layer,
|
TestLLMServer.layer,
|
||||||
SessionPrompt.layer.pipe(
|
SessionPrompt.layer.pipe(
|
||||||
|
|
@ -206,7 +211,7 @@ function makeHttp() {
|
||||||
Layer.provideMerge(trunc),
|
Layer.provideMerge(trunc),
|
||||||
Layer.provide(Instruction.defaultLayer),
|
Layer.provide(Instruction.defaultLayer),
|
||||||
Layer.provide(SystemPrompt.defaultLayer),
|
Layer.provide(SystemPrompt.defaultLayer),
|
||||||
Layer.provide(RuntimeFlags.layer()),
|
Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })),
|
||||||
Layer.provideMerge(deps),
|
Layer.provideMerge(deps),
|
||||||
),
|
),
|
||||||
).pipe(Layer.provide(summary))
|
).pipe(Layer.provide(summary))
|
||||||
|
|
|
||||||
|
|
@ -138,7 +138,7 @@ function makeHttp() {
|
||||||
Layer.provide(Reference.defaultLayer),
|
Layer.provide(Reference.defaultLayer),
|
||||||
Layer.provide(Ripgrep.defaultLayer),
|
Layer.provide(Ripgrep.defaultLayer),
|
||||||
Layer.provide(Format.defaultLayer),
|
Layer.provide(Format.defaultLayer),
|
||||||
Layer.provide(RuntimeFlags.layer()),
|
Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })),
|
||||||
Layer.provideMerge(todo),
|
Layer.provideMerge(todo),
|
||||||
Layer.provideMerge(question),
|
Layer.provideMerge(question),
|
||||||
Layer.provideMerge(deps),
|
Layer.provideMerge(deps),
|
||||||
|
|
@ -147,9 +147,14 @@ function makeHttp() {
|
||||||
const proc = SessionProcessor.layer.pipe(
|
const proc = SessionProcessor.layer.pipe(
|
||||||
Layer.provide(SessionSummary.defaultLayer),
|
Layer.provide(SessionSummary.defaultLayer),
|
||||||
Layer.provide(Image.defaultLayer),
|
Layer.provide(Image.defaultLayer),
|
||||||
|
Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })),
|
||||||
|
Layer.provideMerge(deps),
|
||||||
|
)
|
||||||
|
const compact = SessionCompaction.layer.pipe(
|
||||||
|
Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })),
|
||||||
|
Layer.provideMerge(proc),
|
||||||
Layer.provideMerge(deps),
|
Layer.provideMerge(deps),
|
||||||
)
|
)
|
||||||
const compact = SessionCompaction.layer.pipe(Layer.provideMerge(proc), Layer.provideMerge(deps))
|
|
||||||
return Layer.mergeAll(
|
return Layer.mergeAll(
|
||||||
TestLLMServer.layer,
|
TestLLMServer.layer,
|
||||||
SessionSummary.defaultLayer,
|
SessionSummary.defaultLayer,
|
||||||
|
|
@ -165,7 +170,7 @@ function makeHttp() {
|
||||||
Layer.provideMerge(trunc),
|
Layer.provideMerge(trunc),
|
||||||
Layer.provide(Instruction.defaultLayer),
|
Layer.provide(Instruction.defaultLayer),
|
||||||
Layer.provide(SystemPrompt.defaultLayer),
|
Layer.provide(SystemPrompt.defaultLayer),
|
||||||
Layer.provide(RuntimeFlags.layer()),
|
Layer.provide(RuntimeFlags.layer({ experimentalEventSystem: true })),
|
||||||
Layer.provideMerge(deps),
|
Layer.provideMerge(deps),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue