fix(cli): reduce startup overhead · argszero/opencode@22c23cb · GitHub
Skip to content

Commit 22c23cb

Browse files
committed
fix(cli): reduce startup overhead
1 parent 60ce33c commit 22c23cb

8 files changed

Lines changed: 183 additions & 14 deletions

File tree

Lines changed: 161 additions & 0 deletions

packages/cli/script/publish.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,23 @@ async function publishDistribution(input: { root: string; name: string; binary:
3232
if (!version) throw new Error(`No binary packages found for ${input.name}`)
3333

3434
await $`mkdir -p ${input.root}/${input.name}/bin`
35-
await $`cp ./bin/opencode2.cjs ${input.root}/${input.name}/bin/${input.binary}`
35+
await $`cp ./script/postinstall.mjs ${input.root}/${input.name}/postinstall.mjs`
36+
await Bun.file(`${input.root}/${input.name}/bin/${input.binary}.exe`).write(
37+
[
38+
`echo "Error: ${input.name}'s postinstall script was not run." >&2`,
39+
'echo "" >&2',
40+
'echo "This occurs when installation scripts are disabled." >&2',
41+
'echo "Run the package postinstall script or reinstall with scripts enabled." >&2',
42+
"exit 1",
43+
"",
44+
].join("\n"),
45+
)
3646
await Bun.file(`${input.root}/${input.name}/package.json`).write(
3747
JSON.stringify(
3848
{
3949
name: input.name,
40-
bin: { [input.binary]: `./bin/${input.binary}` },
50+
bin: { [input.binary]: `./bin/${input.binary}.exe` },
51+
scripts: { postinstall: "node ./postinstall.mjs" },
4152
version,
4253
license: pkg.license,
4354
repository: { type: "git", url: "git+https://github.com/anomalyco/opencode.git" },

packages/cli/src/commands/handlers/default.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder"
1+
import { LayerNode } from "@opencode-ai/core/effect/layer-node"
22
import { Global } from "@opencode-ai/core/global"
33
import { run } from "@opencode-ai/tui"
44
import { Commands } from "../commands"
@@ -75,6 +75,6 @@ export default Runtime.handler(Commands, (input) =>
7575
: Effect.logInfo(message, tags)
7676
runFork(effect)
7777
},
78-
}).pipe(Effect.provide(AppNodeBuilder.build(Global.node)))
78+
}).pipe(Effect.provide(LayerNode.compile(Global.node)))
7979
}),
8080
)

packages/cli/src/index.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { Runtime } from "./framework/runtime"
77
import { Observability } from "@opencode-ai/core/observability"
88
import { Updater } from "./services/updater"
99
import { InstallationChannel, InstallationVersion, InstallationLocal } from "@opencode-ai/core/installation/version"
10-
import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder"
1110
import { LayerNode } from "@opencode-ai/core/effect/layer-node"
1211
import { Global } from "@opencode-ai/core/global"
1312
import { AppProcess } from "@opencode-ai/core/process"
@@ -61,7 +60,7 @@ Effect.logInfo("cli starting", {
6160
Effect.annotateLogs({ role: "cli" }),
6261
Effect.provide(Config.layer),
6362
Effect.provide(Updater.layer),
64-
Effect.provide(AppNodeBuilder.build(LayerNode.group([Global.node, AppProcess.node, Npm.node]))),
63+
Effect.provide(LayerNode.compile(LayerNode.group([Global.node, AppProcess.node, Npm.node]))),
6564
Effect.provide(Observability.layer),
6665
Effect.provide(NodeServices.layer),
6766
Effect.scoped,

packages/cli/src/mini/runtime.boot.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
// none block each other.
88
import { Context, Effect, Layer } from "effect"
99
import { resolve } from "@opencode-ai/tui/config/v1"
10-
import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder"
1110
import { makeGlobalNode } from "@opencode-ai/core/effect/app-node"
11+
import { LayerNode } from "@opencode-ai/core/effect/layer-node"
1212
import { makeRuntime } from "@opencode-ai/core/effect/runtime"
1313
import { loadRunProviders } from "./catalog.shared"
1414
import { resolveCurrentSession, sessionHistory } from "./session.shared"
@@ -130,7 +130,7 @@ const layer = Layer.effect(
130130
)
131131

132132
const node = makeGlobalNode({ service: Service, layer, deps: [] })
133-
const runtime = makeRuntime(Service, AppNodeBuilder.build(node))
133+
const runtime = makeRuntime(Service, LayerNode.compile(node))
134134

135135
// Fetches available variants and context limits for every provider/model pair.
136136
export async function resolveModelInfo(

packages/cli/src/mini/variant.shared.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
// variant and the persisted file.
99
import path from "path"
1010
import { FSUtil } from "@opencode-ai/core/fs-util"
11-
import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder"
1211
import { Context, Effect, Layer } from "effect"
1312
import { LayerNode } from "@opencode-ai/core/effect/layer-node"
1413
import { makeGlobalNode } from "@opencode-ai/core/effect/app-node"
@@ -203,7 +202,7 @@ const node = makeGlobalNode({ service: Service, layer, deps: [FSUtil.node] })
203202

204203
/** @internal Exported for testing. */
205204
export function createVariantRuntime(replacements?: readonly LayerNode.Replacement[]): VariantRuntime {
206-
const runtime = makeRuntime(Service, AppNodeBuilder.build(node, replacements))
205+
const runtime = makeRuntime(Service, LayerNode.compile(node, replacements))
207206
return {
208207
resolveSavedVariant: (model) => runtime.runPromise((svc) => svc.resolveSavedVariant(model)).catch(() => undefined),
209208
saveVariant: (model, variant) => runtime.runPromise((svc) => svc.saveVariant(model, variant)).catch(() => {}),

packages/cli/src/server-process.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ export * as ServerProcess from "./server-process"
22

33
import { NodeServices } from "@effect/platform-node"
44
import { Service, type DiscoverOptions, type Info } from "@opencode-ai/client/effect/service"
5-
import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder"
65
import { LayerNode } from "@opencode-ai/core/effect/layer-node"
76
import { Global } from "@opencode-ai/core/global"
87
import { InstallationVersion } from "@opencode-ai/core/installation/version"
@@ -27,7 +26,7 @@ export type Options = {
2726
export const run = Effect.fnUntraced(function* (options: Options) {
2827
return yield* processEffect(options).pipe(
2928
Effect.provide(Updater.layer),
30-
Effect.provide(AppNodeBuilder.build(LayerNode.group([Global.node, AppProcess.node]))),
29+
Effect.provide(LayerNode.compile(LayerNode.group([Global.node, AppProcess.node]))),
3130
Effect.provide(NodeServices.layer),
3231
)
3332
})

packages/cli/src/services/standalone.ts

Lines changed: 2 additions & 2 deletions

0 commit comments

Comments
 (0)