feat(agents): add narrowly-scoped agent sort shim and install at plugin entry
OpenCode 1.4.x ignores the agent `order` field (sst/opencode#19127), so its `Agent.list()` sorts purely by `agent.name` via Remeda `sortBy` which uses native string `<`/`>` comparison. Without intervention, the four core agents fall into alphabetical order (Atlas -> Hephaestus -> Prometheus -> Sisyphus), which is not the canonical sisyphus -> hephaestus -> prometheus -> atlas order the project ships. Prior attempts to bias the sort key with invisible characters (ZWSP, U+2060 WORD JOINER, U+00AD SOFT HYPHEN, ANSI escape) all caused `Bun.stringWidth()` vs terminal-width drift, producing visible gaps and column truncation in the TUI status bar (#3259, #3238). Solution: a narrowly-scoped shim of `Array.prototype.toSorted` and `Array.prototype.sort` that activates only when the array contains two or more agent objects whose `.name` matches a canonical core display name. The activation predicate guards against mixed-type arrays so unrelated `.sort()` / `.toSorted()` calls (string arrays, number arrays, mixed objects) execute native behavior unchanged. Install is idempotent. Cubic P1 mitigations from PR #3267: - `isAgentArray` rejects any array with non-object or null elements, eliminating the throw-on-mixed-array failure mode. - Strict activation predicate (>= 2 ranked elements) keeps the global prototype patch from affecting unrelated sort calls. Remove this shim once OpenCode honors the agent `order` field (sst/opencode#19127). Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -14,11 +14,13 @@ import { loadPluginConfig } from "./plugin-config"
|
||||
import { createModelCacheState } from "./plugin-state"
|
||||
import { createFirstMessageVariantGate } from "./shared/first-message-variant"
|
||||
import { injectServerAuthIntoClient, log, logLegacyPluginStartupWarning } from "./shared"
|
||||
import { installAgentSortShim } from "./shared/agent-sort-shim"
|
||||
import { detectExternalSkillPlugin, getSkillPluginConflictWarning } from "./shared/external-plugin-detector"
|
||||
import { startBackgroundCheck as startTmuxCheck } from "./tools/interactive-bash"
|
||||
import { createPluginPostHog, getPostHogDistinctId } from "./shared/posthog"
|
||||
|
||||
const serverPlugin: Plugin = async (input, _options): Promise<Hooks> => {
|
||||
installAgentSortShim()
|
||||
initConfigContext("opencode", null)
|
||||
log("[oh-my-openagent] ENTRY - plugin loading", {
|
||||
directory: input.directory,
|
||||
|
||||
Reference in New Issue
Block a user