Files
shockbot/agents/shared.ts
T

61 lines
1.6 KiB
TypeScript

import { execFileSync } from "node:child_process";
import type { AgentId } from "../external.ts";
import type { ToolState } from "../toolState.ts";
import { log } from "../utils/cli.ts";
import type { ResolvedInstructions } from "../utils/instructions.ts";
import type { ResolvedPayload } from "../utils/payload.ts";
import type { TodoTracker } from "../utils/todoTracking.ts";
export const MAX_STDERR_LINES = 20;
export function getGitStatus(): string {
try {
return execFileSync("git", ["status", "--porcelain"], {
encoding: "utf-8",
timeout: 10_000,
}).trim();
} catch {
return "";
}
}
export interface AgentToolUseEvent {
toolName: string;
input: unknown;
}
export interface AgentResult {
success: boolean;
output?: string | undefined;
error?: string | undefined;
metadata?: Record<string, unknown>;
}
export interface AgentRunContext {
payload: ResolvedPayload;
model?: string | undefined;
mcpServerUrl: string;
tmpdir: string;
instructions: ResolvedInstructions;
todoTracker?: TodoTracker | undefined;
stopScript?: string | null | undefined;
toolState: ToolState;
onActivityTimeout?: (() => void) | undefined;
onToolUse?: ((event: AgentToolUseEvent) => void) | undefined;
}
export interface Agent {
name: AgentId;
run: (ctx: AgentRunContext) => Promise<AgentResult>;
}
export const agent = (input: Agent): Agent => {
return {
...input,
run: async (ctx: AgentRunContext): Promise<AgentResult> => {
log.debug(`» payload: ${JSON.stringify(ctx.payload, null, 2)}`);
return input.run(ctx);
},
};
};