mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-02 15:51:04 +00:00
* 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>
66 lines
2.2 KiB
TypeScript
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;
|
|
}
|