oh-my-opencode 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -7463,7 +7463,6 @@ var init_model_versions = __esm(() => {
7463
7463
  "anthropic/claude-opus-4-5": "anthropic/claude-opus-4-7",
7464
7464
  "anthropic/claude-opus-4-6": "anthropic/claude-opus-4-7",
7465
7465
  "anthropic/claude-sonnet-4-5": "anthropic/claude-sonnet-4-6",
7466
- "openai/gpt-5.3-codex": "openai/gpt-5.4",
7467
7466
  "openai/gpt-5.4": "openai/gpt-5.5"
7468
7467
  };
7469
7468
  });
@@ -7719,6 +7718,12 @@ function migrateConfigFile(configPath, rawConfig) {
7719
7718
  delete copy.omo_agent;
7720
7719
  needsWrite = true;
7721
7720
  }
7721
+ if (copy.lsp !== undefined) {
7722
+ const droppedServers = copy.lsp && typeof copy.lsp === "object" ? Object.keys(copy.lsp) : [];
7723
+ log("Removed obsolete 'lsp' config key from oh-my-opencode config. Custom LSP servers are now configured in .opencode/lsp.json at the project root (consumed by the 'lsp' MCP server). Move any server definitions there to restore them.", { configPath, droppedServers });
7724
+ delete copy.lsp;
7725
+ needsWrite = true;
7726
+ }
7722
7727
  if (copy.experimental && typeof copy.experimental === "object") {
7723
7728
  const experimental = copy.experimental;
7724
7729
  if ("hashline_edit" in experimental) {
@@ -8093,8 +8098,14 @@ var init_external_plugin_detector = __esm(() => {
8093
8098
  });
8094
8099
 
8095
8100
  // src/shared/bun-spawn-shim.ts
8096
- import { spawn as nodeSpawn, spawnSync as nodeSpawnSync } from "child_process";
8101
+ import {
8102
+ spawn as nodeSpawn,
8103
+ spawnSync as nodeSpawnSync
8104
+ } from "child_process";
8097
8105
  import { Readable, Writable } from "stream";
8106
+ function getBunRuntime() {
8107
+ return typeof Bun === "undefined" ? undefined : runtime.Bun;
8108
+ }
8098
8109
  function emptyReadableStream() {
8099
8110
  return new ReadableStream({
8100
8111
  start(controller) {
@@ -8127,6 +8138,24 @@ function resolveStdio(options) {
8127
8138
  return options.stdio;
8128
8139
  return [options.stdin ?? "ignore", options.stdout ?? "pipe", options.stderr ?? "inherit"];
8129
8140
  }
8141
+ function createNodeSpawnOptions(options, platform = process.platform) {
8142
+ const nodeOptions = {
8143
+ stdio: resolveStdio(options),
8144
+ shell: false
8145
+ };
8146
+ if (options.cwd !== undefined)
8147
+ nodeOptions.cwd = options.cwd;
8148
+ if (options.env !== undefined)
8149
+ nodeOptions.env = options.env;
8150
+ if (options.detached !== undefined)
8151
+ nodeOptions.detached = options.detached;
8152
+ if (options.signal !== undefined)
8153
+ nodeOptions.signal = options.signal;
8154
+ if (platform === "win32") {
8155
+ nodeOptions.windowsHide = true;
8156
+ }
8157
+ return nodeOptions;
8158
+ }
8130
8159
  function wrapNodeProcess(proc) {
8131
8160
  let exitCode = null;
8132
8161
  const exited = new Promise((resolve4, reject) => {
@@ -8169,28 +8198,24 @@ function wrapNodeProcess(proc) {
8169
8198
  };
8170
8199
  }
8171
8200
  function spawn(cmdOrOpts, opts) {
8172
- if (IS_BUN)
8173
- return runtime.Bun.spawn(cmdOrOpts, opts);
8174
8201
  const { cmd, opts: options } = resolveCommand(cmdOrOpts, opts);
8202
+ const bun = getBunRuntime();
8203
+ if (bun)
8204
+ return bun.spawn(cmd, options);
8175
8205
  const [bin, ...args] = cmd;
8176
- const proc = nodeSpawn(bin, args, {
8177
- cwd: options.cwd,
8178
- env: options.env,
8179
- stdio: resolveStdio(options),
8180
- detached: options.detached,
8181
- signal: options.signal
8182
- });
8206
+ if (bin === undefined) {
8207
+ throw new Error("Cannot spawn an empty command");
8208
+ }
8209
+ const proc = nodeSpawn(bin, args, createNodeSpawnOptions(options));
8183
8210
  return wrapNodeProcess(proc);
8184
8211
  }
8185
- var runtime, IS_BUN;
8212
+ var runtime;
8186
8213
  var init_bun_spawn_shim = __esm(() => {
8187
8214
  runtime = globalThis;
8188
- IS_BUN = typeof runtime.Bun !== "undefined";
8189
8215
  });
8190
8216
 
8191
8217
  // src/shared/archive-entry-validator.ts
8192
8218
  var init_archive_entry_validator = () => {};
8193
-
8194
8219
  // src/shared/zip-entry-listing/python-zip-entry-listing.ts
8195
8220
  var init_python_zip_entry_listing = __esm(() => {
8196
8221
  init_bun_spawn_shim();
@@ -8234,10 +8259,10 @@ var init_zip_extractor = __esm(() => {
8234
8259
  });
8235
8260
 
8236
8261
  // src/shared/bun-file-shim.ts
8237
- var runtime2, IS_BUN2;
8262
+ var runtime2, IS_BUN;
8238
8263
  var init_bun_file_shim = __esm(() => {
8239
8264
  runtime2 = globalThis;
8240
- IS_BUN2 = typeof runtime2.Bun !== "undefined";
8265
+ IS_BUN = typeof runtime2.Bun !== "undefined";
8241
8266
  });
8242
8267
 
8243
8268
  // src/shared/binary-downloader.ts
@@ -55420,7 +55445,7 @@ var {
55420
55445
  // package.json
55421
55446
  var package_default = {
55422
55447
  name: "oh-my-opencode",
55423
- version: "4.3.0",
55448
+ version: "4.4.0",
55424
55449
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
55425
55450
  main: "./dist/index.js",
55426
55451
  types: "dist/index.d.ts",
@@ -55530,17 +55555,17 @@ var package_default = {
55530
55555
  zod: "^4.4.3"
55531
55556
  },
55532
55557
  optionalDependencies: {
55533
- "oh-my-opencode-darwin-arm64": "4.3.0",
55534
- "oh-my-opencode-darwin-x64": "4.3.0",
55535
- "oh-my-opencode-darwin-x64-baseline": "4.3.0",
55536
- "oh-my-opencode-linux-arm64": "4.3.0",
55537
- "oh-my-opencode-linux-arm64-musl": "4.3.0",
55538
- "oh-my-opencode-linux-x64": "4.3.0",
55539
- "oh-my-opencode-linux-x64-baseline": "4.3.0",
55540
- "oh-my-opencode-linux-x64-musl": "4.3.0",
55541
- "oh-my-opencode-linux-x64-musl-baseline": "4.3.0",
55542
- "oh-my-opencode-windows-x64": "4.3.0",
55543
- "oh-my-opencode-windows-x64-baseline": "4.3.0"
55558
+ "oh-my-opencode-darwin-arm64": "4.4.0",
55559
+ "oh-my-opencode-darwin-x64": "4.4.0",
55560
+ "oh-my-opencode-darwin-x64-baseline": "4.4.0",
55561
+ "oh-my-opencode-linux-arm64": "4.4.0",
55562
+ "oh-my-opencode-linux-arm64-musl": "4.4.0",
55563
+ "oh-my-opencode-linux-x64": "4.4.0",
55564
+ "oh-my-opencode-linux-x64-baseline": "4.4.0",
55565
+ "oh-my-opencode-linux-x64-musl": "4.4.0",
55566
+ "oh-my-opencode-linux-x64-musl-baseline": "4.4.0",
55567
+ "oh-my-opencode-windows-x64": "4.4.0",
55568
+ "oh-my-opencode-windows-x64-baseline": "4.4.0"
55544
55569
  },
55545
55570
  overrides: {
55546
55571
  hono: "^4.12.18",
@@ -57629,8 +57654,10 @@ var import_picocolors6 = __toESM(require_picocolors(), 1);
57629
57654
  function renderAgentHeader(agent, model, variant, agentColorsByName) {
57630
57655
  if (!agent && !model)
57631
57656
  return;
57632
- const agentLabel = agent ? import_picocolors6.default.bold(colorizeWithProfileColor(agent, agentColorsByName[agent])) : "";
57633
- const modelBase = model ?? "";
57657
+ const normalizedAgent = agent?.normalize("NFC") ?? null;
57658
+ const normalizedModel = model?.normalize("NFC") ?? null;
57659
+ const agentLabel = agent ? import_picocolors6.default.bold(colorizeWithProfileColor(normalizedAgent ?? agent, agentColorsByName[agent])) : "";
57660
+ const modelBase = normalizedModel ?? "";
57634
57661
  const variantSuffix = variant ? ` (${variant})` : "";
57635
57662
  const modelLabel = model ? import_picocolors6.default.dim(`${modelBase}${variantSuffix}`) : "";
57636
57663
  process.stdout.write(`
@@ -82985,7 +83012,7 @@ import { basename as basename5 } from "path";
82985
83012
  import { accessSync as accessSync3, constants as constants6 } from "fs";
82986
83013
  import { delimiter as delimiter2, join as join39 } from "path";
82987
83014
  var runtime3 = globalThis;
82988
- var IS_BUN3 = typeof runtime3.Bun !== "undefined";
83015
+ var IS_BUN2 = typeof runtime3.Bun !== "undefined";
82989
83016
  function isUnsafeCommandName(commandName) {
82990
83017
  if (commandName.includes("/") || commandName.includes("\\"))
82991
83018
  return true;
@@ -83020,7 +83047,7 @@ function bunWhich(commandName) {
83020
83047
  return null;
83021
83048
  if (isUnsafeCommandName(commandName))
83022
83049
  return null;
83023
- if (IS_BUN3)
83050
+ if (IS_BUN2)
83024
83051
  return runtime3.Bun?.which(commandName) ?? null;
83025
83052
  const pathValue = resolvePathValue();
83026
83053
  if (!pathValue)
@@ -0,0 +1,19 @@
1
+ export type ParentWakePromptContext = {
2
+ agent?: string;
3
+ model?: {
4
+ providerID: string;
5
+ modelID: string;
6
+ };
7
+ variant?: string;
8
+ tools?: Record<string, boolean>;
9
+ };
10
+ export type PendingParentWake = {
11
+ promptContext: ParentWakePromptContext;
12
+ notifications: string[];
13
+ shouldReply: boolean;
14
+ dispatchedAt?: number;
15
+ toolCallDeferralStartedAt?: number;
16
+ };
17
+ export declare function resolveParentWakePromptContext(promptContext: ParentWakePromptContext): ParentWakePromptContext;
18
+ export declare function cloneParentWake(wake: PendingParentWake): PendingParentWake;
19
+ export declare function isRedundantParentWake(latestWake: PendingParentWake, dispatchedWake: PendingParentWake): boolean;
@@ -1,21 +1,7 @@
1
1
  import type { PluginInput } from "@opencode-ai/plugin";
2
+ import { type ParentWakePromptContext, type PendingParentWake } from "./parent-wake-dedupe";
2
3
  type OpencodeClient = PluginInput["client"];
3
- export type ParentWakePromptContext = {
4
- agent?: string;
5
- model?: {
6
- providerID: string;
7
- modelID: string;
8
- };
9
- variant?: string;
10
- tools?: Record<string, boolean>;
11
- };
12
- export type PendingParentWake = {
13
- promptContext: ParentWakePromptContext;
14
- notifications: string[];
15
- shouldReply: boolean;
16
- dispatchedAt?: number;
17
- toolCallDeferralStartedAt?: number;
18
- };
4
+ export type { ParentWakePromptContext, PendingParentWake } from "./parent-wake-dedupe";
19
5
  type ParentWakeNotifierDeps = {
20
6
  client: OpencodeClient;
21
7
  directory: string;
@@ -59,8 +45,6 @@ export declare class ParentWakeNotifier {
59
45
  shutdown(): void;
60
46
  private isSessionActive;
61
47
  private hasRecentParentSessionActivity;
62
- private resolveParentWakePromptContext;
63
- private cloneParentWake;
64
48
  private trackDispatchedParentWake;
65
49
  private loadParentWakeSessionMessages;
66
50
  private getParentWakeMessageRole;
@@ -75,4 +59,3 @@ export declare class ParentWakeNotifier {
75
59
  private hasAcceptedMessageAfterDispatchedParentWake;
76
60
  private requeueWake;
77
61
  }
78
- export {};
@@ -15,7 +15,12 @@ type ToolResultPart = {
15
15
  }>;
16
16
  [key: string]: unknown;
17
17
  };
18
- type TransformPart = Part | ToolUsePart | ToolResultPart;
18
+ type TextPart = {
19
+ type: "text";
20
+ text: string;
21
+ synthetic: true;
22
+ };
23
+ type TransformPart = Part | ToolUsePart | ToolResultPart | TextPart;
19
24
  type TransformMessageInfo = Message | {
20
25
  role: "user";
21
26
  sessionID?: string;