Files
openclaw/extensions/codex/src/commands.ts
Eva 2a0350b5b4 Separate prompt surfaces by selected harness (#83454)
* fix: scope agent prompt surfaces

* fix(codex): preserve lightweight project doc suppression

* fix(codex): demote openclaw context for native turns

* fix(codex): report demoted prompt context

* fix(codex): align demoted prompt observability

* docs: format codex runtime table

* docs: align codex prompt overlay docs

* test: align codex prompt snapshots

* test: update prompt snapshot contract

---------

Co-authored-by: Eva (agent) <eva+agent-78055@100yen.org>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-05-18 13:00:53 +01:00

66 lines
2.2 KiB
TypeScript

import type {
OpenClawPluginCommandDefinition,
PluginCommandContext,
PluginCommandResult,
} from "openclaw/plugin-sdk/plugin-entry";
import { describeControlFailure } from "./app-server/capabilities.js";
import { formatCodexDisplayText } from "./command-formatters.js";
import type { CodexCommandDeps } from "./command-handlers.js";
type CodexCommandOptions = {
pluginConfig?: unknown;
deps?: Partial<CodexCommandDeps>;
};
type CodexSubcommandHandler = (
ctx: PluginCommandContext,
options: CodexCommandOptions,
) => Promise<PluginCommandResult>;
type CodexCommandInternalOptions = CodexCommandOptions & {
loadSubcommandHandler?: () => Promise<CodexSubcommandHandler>;
};
export function createCodexCommand(options: CodexCommandOptions): OpenClawPluginCommandDefinition {
return {
name: "codex",
description: "Inspect and control the Codex app-server harness",
ownership: "reserved",
agentPromptGuidance: [
{
text: "Native Codex app-server plugin is available (`/codex ...`). For Codex bind/control/thread/resume/steer/stop requests, prefer `/codex bind`, `/codex threads`, `/codex resume`, `/codex steer`, and `/codex stop` over ACP.",
surfaces: ["pi_main"],
},
{
text: "Use ACP for Codex only when the user explicitly asks for ACP/acpx or wants to test the ACP path.",
surfaces: ["pi_main"],
},
],
acceptsArgs: true,
requireAuth: true,
handler: (ctx) => handleCodexCommand(ctx, options),
};
}
export async function handleCodexCommand(
ctx: PluginCommandContext,
options: CodexCommandInternalOptions = {},
): Promise<PluginCommandResult> {
const { loadSubcommandHandler, ...subcommandOptions } = options;
try {
const handleCodexSubcommand = loadSubcommandHandler
? await loadSubcommandHandler()
: await loadDefaultCodexSubcommandHandler();
return await handleCodexSubcommand(ctx, subcommandOptions);
} catch (error) {
return {
text: `Codex command failed: ${formatCodexDisplayText(describeControlFailure(error))}`,
};
}
}
async function loadDefaultCodexSubcommandHandler(): Promise<CodexSubcommandHandler> {
const { handleCodexSubcommand } = await import("./command-handlers.js");
return handleCodexSubcommand;
}