Introduce openclaw adapter package with server execution, CLI stream formatting, and UI config fields. Register the adapter across CLI, server, and UI registries. Add adapter label in all relevant pages. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
85 lines
2.8 KiB
TypeScript
85 lines
2.8 KiB
TypeScript
import type { ServerAdapterModule } from "./types.js";
|
|
import {
|
|
execute as claudeExecute,
|
|
testEnvironment as claudeTestEnvironment,
|
|
sessionCodec as claudeSessionCodec,
|
|
} from "@paperclip/adapter-claude-local/server";
|
|
import { agentConfigurationDoc as claudeAgentConfigurationDoc, models as claudeModels } from "@paperclip/adapter-claude-local";
|
|
import {
|
|
execute as codexExecute,
|
|
testEnvironment as codexTestEnvironment,
|
|
sessionCodec as codexSessionCodec,
|
|
} from "@paperclip/adapter-codex-local/server";
|
|
import { agentConfigurationDoc as codexAgentConfigurationDoc, models as codexModels } from "@paperclip/adapter-codex-local";
|
|
import {
|
|
execute as openclawExecute,
|
|
testEnvironment as openclawTestEnvironment,
|
|
} from "@paperclip/adapter-openclaw/server";
|
|
import {
|
|
agentConfigurationDoc as openclawAgentConfigurationDoc,
|
|
models as openclawModels,
|
|
} from "@paperclip/adapter-openclaw";
|
|
import { listCodexModels } from "./codex-models.js";
|
|
import { processAdapter } from "./process/index.js";
|
|
import { httpAdapter } from "./http/index.js";
|
|
|
|
const claudeLocalAdapter: ServerAdapterModule = {
|
|
type: "claude_local",
|
|
execute: claudeExecute,
|
|
testEnvironment: claudeTestEnvironment,
|
|
sessionCodec: claudeSessionCodec,
|
|
models: claudeModels,
|
|
supportsLocalAgentJwt: true,
|
|
agentConfigurationDoc: claudeAgentConfigurationDoc,
|
|
};
|
|
|
|
const codexLocalAdapter: ServerAdapterModule = {
|
|
type: "codex_local",
|
|
execute: codexExecute,
|
|
testEnvironment: codexTestEnvironment,
|
|
sessionCodec: codexSessionCodec,
|
|
models: codexModels,
|
|
listModels: listCodexModels,
|
|
supportsLocalAgentJwt: true,
|
|
agentConfigurationDoc: codexAgentConfigurationDoc,
|
|
};
|
|
|
|
const openclawAdapter: ServerAdapterModule = {
|
|
type: "openclaw",
|
|
execute: openclawExecute,
|
|
testEnvironment: openclawTestEnvironment,
|
|
models: openclawModels,
|
|
supportsLocalAgentJwt: false,
|
|
agentConfigurationDoc: openclawAgentConfigurationDoc,
|
|
};
|
|
|
|
const adaptersByType = new Map<string, ServerAdapterModule>(
|
|
[claudeLocalAdapter, codexLocalAdapter, openclawAdapter, processAdapter, httpAdapter].map((a) => [a.type, a]),
|
|
);
|
|
|
|
export function getServerAdapter(type: string): ServerAdapterModule {
|
|
const adapter = adaptersByType.get(type);
|
|
if (!adapter) {
|
|
// Fall back to process adapter for unknown types
|
|
return processAdapter;
|
|
}
|
|
return adapter;
|
|
}
|
|
|
|
export async function listAdapterModels(type: string): Promise<{ id: string; label: string }[]> {
|
|
const adapter = adaptersByType.get(type);
|
|
if (!adapter) return [];
|
|
if (adapter.listModels) {
|
|
const discovered = await adapter.listModels();
|
|
if (discovered.length > 0) return discovered;
|
|
}
|
|
return adapter.models ?? [];
|
|
}
|
|
|
|
export function listServerAdapters(): ServerAdapterModule[] {
|
|
return Array.from(adaptersByType.values());
|
|
}
|
|
|
|
export function findServerAdapter(type: string): ServerAdapterModule | null {
|
|
return adaptersByType.get(type) ?? null;
|
|
}
|