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 +59 -32
- package/dist/features/background-agent/parent-wake-dedupe.d.ts +19 -0
- package/dist/features/background-agent/parent-wake-notifier.d.ts +2 -19
- package/dist/hooks/tool-pair-validator/hook.d.ts +6 -1
- package/dist/index.js +504 -229
- package/dist/plugin-handlers/provider-config-handler.d.ts +1 -0
- package/dist/shared/bun-spawn-shim.d.ts +3 -0
- package/dist/shared/migration/model-versions.d.ts +6 -0
- package/dist/shared/process-stream-reader.d.ts +3 -0
- package/dist/tools/glob/cli.d.ts +3 -1
- package/dist/tools/grep/cli.d.ts +4 -2
- package/dist/tools/shared/search-process-output.d.ts +7 -0
- package/package.json +12 -12
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 {
|
|
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
|
-
|
|
8177
|
-
|
|
8178
|
-
|
|
8179
|
-
|
|
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
|
|
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,
|
|
8262
|
+
var runtime2, IS_BUN;
|
|
8238
8263
|
var init_bun_file_shim = __esm(() => {
|
|
8239
8264
|
runtime2 = globalThis;
|
|
8240
|
-
|
|
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.
|
|
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.
|
|
55534
|
-
"oh-my-opencode-darwin-x64": "4.
|
|
55535
|
-
"oh-my-opencode-darwin-x64-baseline": "4.
|
|
55536
|
-
"oh-my-opencode-linux-arm64": "4.
|
|
55537
|
-
"oh-my-opencode-linux-arm64-musl": "4.
|
|
55538
|
-
"oh-my-opencode-linux-x64": "4.
|
|
55539
|
-
"oh-my-opencode-linux-x64-baseline": "4.
|
|
55540
|
-
"oh-my-opencode-linux-x64-musl": "4.
|
|
55541
|
-
"oh-my-opencode-linux-x64-musl-baseline": "4.
|
|
55542
|
-
"oh-my-opencode-windows-x64": "4.
|
|
55543
|
-
"oh-my-opencode-windows-x64-baseline": "4.
|
|
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
|
|
57633
|
-
const
|
|
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
|
|
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 (
|
|
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
|
|
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;
|