mirror of
https://github.com/headroomlabs-ai/headroom.git
synced 2026-08-27 14:17:10 -04:00
69 lines
1.9 KiB
TypeScript
69 lines
1.9 KiB
TypeScript
|
|
import type { Plugin } from "@opencode-ai/plugin";
|
||
|
|
import { tool } from "@opencode-ai/plugin";
|
||
|
|
import { z } from "zod";
|
||
|
|
|
||
|
|
import { createHeadroomRetrieveTool, getDefaultProxyUrl } from "./retrieve.js";
|
||
|
|
import { installHeadroomTransport } from "./transport.js";
|
||
|
|
|
||
|
|
export interface HeadroomOpenCodePluginOptions {
|
||
|
|
proxyUrl?: string;
|
||
|
|
project?: string;
|
||
|
|
backend?: string;
|
||
|
|
debug?: boolean;
|
||
|
|
}
|
||
|
|
|
||
|
|
function normalizeProxyUrl(url: string): string {
|
||
|
|
return url.replace(/\/+$/, "");
|
||
|
|
}
|
||
|
|
|
||
|
|
function resolveProxyUrl(options?: HeadroomOpenCodePluginOptions): string {
|
||
|
|
return normalizeProxyUrl(
|
||
|
|
options?.proxyUrl ??
|
||
|
|
process.env.HEADROOM_PROXY_URL ??
|
||
|
|
process.env.HEADROOM_BASE_URL ??
|
||
|
|
getDefaultProxyUrl(),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
export const HeadroomPlugin: Plugin = async (input, options = {}) => {
|
||
|
|
const pluginOptions = options as HeadroomOpenCodePluginOptions;
|
||
|
|
const proxyUrl = resolveProxyUrl(pluginOptions);
|
||
|
|
const retrieveTool = createHeadroomRetrieveTool({ proxyBaseUrl: proxyUrl });
|
||
|
|
const uninstallTransport = installHeadroomTransport({
|
||
|
|
proxyUrl,
|
||
|
|
debug: pluginOptions.debug,
|
||
|
|
});
|
||
|
|
|
||
|
|
return {
|
||
|
|
dispose: async () => {
|
||
|
|
uninstallTransport();
|
||
|
|
},
|
||
|
|
tool: {
|
||
|
|
headroom_retrieve: tool({
|
||
|
|
description: retrieveTool.description,
|
||
|
|
args: {
|
||
|
|
hash: z
|
||
|
|
.string()
|
||
|
|
.regex(/^[a-f0-9]{24}$/i, "Expected 24-character hex hash"),
|
||
|
|
},
|
||
|
|
async execute(args) {
|
||
|
|
return retrieveTool.execute(args);
|
||
|
|
},
|
||
|
|
}),
|
||
|
|
},
|
||
|
|
"shell.env": async (_input, output) => {
|
||
|
|
output.env.HEADROOM_ACTIVE = "1";
|
||
|
|
output.env.HEADROOM_PROXY_URL = proxyUrl;
|
||
|
|
output.env.HEADROOM_PROJECT =
|
||
|
|
pluginOptions.project ??
|
||
|
|
(input.project as { id?: string }).id ??
|
||
|
|
input.directory;
|
||
|
|
if (pluginOptions.backend) {
|
||
|
|
output.env.HEADROOM_BACKEND = pluginOptions.backend;
|
||
|
|
}
|
||
|
|
},
|
||
|
|
};
|
||
|
|
};
|
||
|
|
|
||
|
|
export default HeadroomPlugin;
|