- Introduced a new heartbeat service that runs at defined intervals to perform health checks on workers and fill available task slots based on priority. - Added a health tool to scan worker health across projects with optional auto-fix capabilities. - Updated the status tool to provide a lightweight overview of worker states and queue counts without health checks. - Enhanced task creation tool descriptions to clarify task state handling. - Implemented tests for the work heartbeat logic, ensuring proper project resolution, worker state management, and task prioritization.
94 lines
3.7 KiB
TypeScript
94 lines
3.7 KiB
TypeScript
import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
|
|
import { createWorkStartTool } from "./lib/tools/work-start.js";
|
|
import { createWorkFinishTool } from "./lib/tools/work-finish.js";
|
|
import { createTaskCreateTool } from "./lib/tools/task-create.js";
|
|
import { createTaskUpdateTool } from "./lib/tools/task-update.js";
|
|
import { createTaskCommentTool } from "./lib/tools/task-comment.js";
|
|
import { createStatusTool } from "./lib/tools/status.js";
|
|
import { createHealthTool } from "./lib/tools/health.js";
|
|
import { createWorkHeartbeatTool } from "./lib/tools/work-heartbeat.js";
|
|
import { createProjectRegisterTool } from "./lib/tools/project-register.js";
|
|
import { createSetupTool } from "./lib/tools/setup.js";
|
|
import { createOnboardTool } from "./lib/tools/onboard.js";
|
|
import { registerCli } from "./lib/cli.js";
|
|
import { registerHeartbeatService } from "./lib/services/heartbeat.js";
|
|
|
|
const plugin = {
|
|
id: "devclaw",
|
|
name: "DevClaw",
|
|
description:
|
|
"Multi-project dev/qa pipeline orchestration with GitHub/GitLab integration, developer tiers, and audit logging.",
|
|
configSchema: {
|
|
type: "object",
|
|
properties: {
|
|
models: {
|
|
type: "object",
|
|
description: "Model mapping per developer tier",
|
|
properties: {
|
|
junior: { type: "string" },
|
|
medior: { type: "string" },
|
|
senior: { type: "string" },
|
|
qa: { type: "string" },
|
|
},
|
|
},
|
|
projectExecution: {
|
|
type: "string",
|
|
enum: ["parallel", "sequential"],
|
|
description: "Plugin-level: parallel (each project independent) or sequential (one project at a time)",
|
|
default: "parallel",
|
|
},
|
|
notifications: {
|
|
type: "object",
|
|
description: "Notification settings",
|
|
properties: {
|
|
heartbeatDm: { type: "boolean", default: true },
|
|
workerStart: { type: "boolean", default: true },
|
|
workerComplete: { type: "boolean", default: true },
|
|
},
|
|
},
|
|
work_heartbeat: {
|
|
type: "object",
|
|
description: "Token-free interval-based heartbeat service. Runs health checks + queue dispatch automatically.",
|
|
properties: {
|
|
enabled: { type: "boolean", default: true, description: "Enable the heartbeat service." },
|
|
intervalSeconds: { type: "number", default: 60, description: "Seconds between ticks." },
|
|
maxPickupsPerTick: { type: "number", default: 4, description: "Max worker dispatches per tick." },
|
|
},
|
|
},
|
|
},
|
|
},
|
|
|
|
register(api: OpenClawPluginApi) {
|
|
// Worker lifecycle
|
|
api.registerTool(createWorkStartTool(api), { names: ["work_start"] });
|
|
api.registerTool(createWorkFinishTool(api), { names: ["work_finish"] });
|
|
|
|
// Task management
|
|
api.registerTool(createTaskCreateTool(api), { names: ["task_create"] });
|
|
api.registerTool(createTaskUpdateTool(api), { names: ["task_update"] });
|
|
api.registerTool(createTaskCommentTool(api), { names: ["task_comment"] });
|
|
|
|
// Operations
|
|
api.registerTool(createStatusTool(api), { names: ["status"] });
|
|
api.registerTool(createHealthTool(api), { names: ["health"] });
|
|
api.registerTool(createWorkHeartbeatTool(api), { names: ["work_heartbeat"] });
|
|
|
|
// Setup & config
|
|
api.registerTool(createProjectRegisterTool(api), { names: ["project_register"] });
|
|
api.registerTool(createSetupTool(api), { names: ["setup"] });
|
|
api.registerTool(createOnboardTool(api), { names: ["onboard"] });
|
|
|
|
// CLI
|
|
api.registerCli(({ program }: { program: any }) => registerCli(program), {
|
|
commands: ["devclaw"],
|
|
});
|
|
|
|
// Services
|
|
registerHeartbeatService(api);
|
|
|
|
api.logger.info("DevClaw plugin registered (11 tools, 1 service, 1 CLI command)");
|
|
},
|
|
};
|
|
|
|
export default plugin;
|