commanderclaw 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,254 @@
1
+ /**
2
+ * commanderclaw_task tool
3
+ */
4
+
5
+ import { Type } from "@sinclair/typebox";
6
+ import type { CommanderClawClient } from "../client";
7
+ import type { ToolDefinition, Task } from "../types";
8
+
9
+ export function createTaskTool(getClient: () => CommanderClawClient | null): ToolDefinition {
10
+ return {
11
+ name: "commanderclaw_task",
12
+ description: `Create, query, or manage tasks on the CommanderClaw cluster.
13
+
14
+ Actions:
15
+ - create: Create a new task with a name and optional description, priority, input, and target node
16
+ - list: List all tasks in the cluster
17
+ - get: Get details of a specific task by ID
18
+ - abort: Abort a running task
19
+ - pause: Pause a running task
20
+ - resume: Resume a paused task
21
+
22
+ Use this to coordinate work across multiple AI agents in the cluster.`,
23
+ parameters: Type.Object({
24
+ action: Type.Union([
25
+ Type.Literal("create"),
26
+ Type.Literal("list"),
27
+ Type.Literal("get"),
28
+ Type.Literal("abort"),
29
+ Type.Literal("pause"),
30
+ Type.Literal("resume"),
31
+ ]),
32
+ // Create parameters
33
+ name: Type.Optional(Type.String()),
34
+ description: Type.Optional(Type.String()),
35
+ priority: Type.Optional(
36
+ Type.Union([
37
+ Type.Literal("low"),
38
+ Type.Literal("normal"),
39
+ Type.Literal("high"),
40
+ Type.Literal("critical"),
41
+ ])
42
+ ),
43
+ input: Type.Optional(Type.Any()),
44
+ targetNodeId: Type.Optional(Type.String()),
45
+ maxRounds: Type.Optional(Type.Number()),
46
+ // Get/Abort/Pause/Resume parameters
47
+ taskId: Type.Optional(Type.String()),
48
+ reason: Type.Optional(Type.String()),
49
+ }),
50
+ async execute(_id: string, params: Record<string, unknown>) {
51
+ const client = getClient();
52
+ if (!client?.isConnected()) {
53
+ return {
54
+ content: [
55
+ {
56
+ type: "text" as const,
57
+ text: "Not connected to CommanderClaw server. Check plugin configuration.",
58
+ },
59
+ ],
60
+ };
61
+ }
62
+
63
+ try {
64
+ switch (params.action) {
65
+ case "create": {
66
+ if (!params.name || typeof params.name !== "string") {
67
+ return {
68
+ content: [
69
+ { type: "text" as const, text: "Error: 'name' is required for create action" },
70
+ ],
71
+ };
72
+ }
73
+ const task = await client.createTask({
74
+ name: params.name,
75
+ description: params.description as string | undefined,
76
+ priority: params.priority as "low" | "normal" | "high" | "critical" | undefined,
77
+ input: params.input,
78
+ targetNodeId: params.targetNodeId as string | undefined,
79
+ maxRounds: params.maxRounds as number | undefined,
80
+ });
81
+ return {
82
+ content: [
83
+ {
84
+ type: "text" as const,
85
+ text: `Task created successfully:\n\`\`\`json\n${JSON.stringify(task, null, 2)}\n\`\`\``,
86
+ },
87
+ ],
88
+ };
89
+ }
90
+
91
+ case "list": {
92
+ const tasks = await client.listTasks();
93
+ if (tasks.length === 0) {
94
+ return {
95
+ content: [{ type: "text" as const, text: "No tasks in the cluster." }],
96
+ };
97
+ }
98
+
99
+ let text = `## Tasks (${tasks.length})\n\n`;
100
+ for (const task of tasks) {
101
+ text += formatTaskSummary(task);
102
+ }
103
+ return { content: [{ type: "text" as const, text }] };
104
+ }
105
+
106
+ case "get": {
107
+ if (!params.taskId || typeof params.taskId !== "string") {
108
+ return {
109
+ content: [
110
+ { type: "text" as const, text: "Error: 'taskId' is required for get action" },
111
+ ],
112
+ };
113
+ }
114
+ const task = await client.getTask(params.taskId);
115
+ return {
116
+ content: [
117
+ {
118
+ type: "text" as const,
119
+ text: formatTaskDetail(task),
120
+ },
121
+ ],
122
+ };
123
+ }
124
+
125
+ case "abort": {
126
+ if (!params.taskId || typeof params.taskId !== "string") {
127
+ return {
128
+ content: [
129
+ { type: "text" as const, text: "Error: 'taskId' is required for abort action" },
130
+ ],
131
+ };
132
+ }
133
+ await client.abortTask(params.taskId, params.reason as string | undefined);
134
+ return {
135
+ content: [
136
+ { type: "text" as const, text: `Task ${params.taskId} has been aborted.` },
137
+ ],
138
+ };
139
+ }
140
+
141
+ case "pause": {
142
+ if (!params.taskId || typeof params.taskId !== "string") {
143
+ return {
144
+ content: [
145
+ { type: "text" as const, text: "Error: 'taskId' is required for pause action" },
146
+ ],
147
+ };
148
+ }
149
+ await client.pauseTask(params.taskId);
150
+ return {
151
+ content: [
152
+ { type: "text" as const, text: `Task ${params.taskId} has been paused.` },
153
+ ],
154
+ };
155
+ }
156
+
157
+ case "resume": {
158
+ if (!params.taskId || typeof params.taskId !== "string") {
159
+ return {
160
+ content: [
161
+ { type: "text" as const, text: "Error: 'taskId' is required for resume action" },
162
+ ],
163
+ };
164
+ }
165
+ await client.resumeTask(params.taskId);
166
+ return {
167
+ content: [
168
+ { type: "text" as const, text: `Task ${params.taskId} has been resumed.` },
169
+ ],
170
+ };
171
+ }
172
+
173
+ default:
174
+ return {
175
+ content: [
176
+ { type: "text" as const, text: `Unknown action: ${params.action}` },
177
+ ],
178
+ };
179
+ }
180
+ } catch (error) {
181
+ return {
182
+ content: [
183
+ {
184
+ type: "text" as const,
185
+ text: `Failed to execute task action: ${error instanceof Error ? error.message : String(error)}`,
186
+ },
187
+ ],
188
+ };
189
+ }
190
+ },
191
+ };
192
+ }
193
+
194
+ function formatTaskSummary(task: Task): string {
195
+ const statusEmoji = {
196
+ pending: "⏳",
197
+ assigned: "📋",
198
+ running: "▶️",
199
+ paused: "⏸️",
200
+ completed: "✅",
201
+ failed: "❌",
202
+ aborted: "🚫",
203
+ }[task.status] || "❓";
204
+
205
+ let text = `### ${task.name} (${task.id})\n`;
206
+ text += `- **Status:** ${statusEmoji} ${task.status}\n`;
207
+ text += `- **Priority:** ${task.priority}\n`;
208
+ text += `- **Progress:** ${task.progress}%\n`;
209
+ if (task.assignees?.length) {
210
+ text += `- **Assignees:** ${task.assignees.join(", ")}\n`;
211
+ }
212
+ text += "\n";
213
+ return text;
214
+ }
215
+
216
+ function formatTaskDetail(task: Task): string {
217
+ let text = `## Task: ${task.name}\n\n`;
218
+ text += `**ID:** ${task.id}\n`;
219
+ text += `**Status:** ${task.status}\n`;
220
+ text += `**Priority:** ${task.priority}\n`;
221
+ text += `**Progress:** ${task.progress}%\n`;
222
+ text += `**Rounds:** ${task.rounds}/${task.maxRounds}\n\n`;
223
+
224
+ if (task.description) {
225
+ text += `**Description:**\n${task.description}\n\n`;
226
+ }
227
+
228
+ if (task.creatorId) {
229
+ text += `**Creator:** ${task.creatorId}\n`;
230
+ }
231
+ if (task.commanderId) {
232
+ text += `**Commander:** ${task.commanderId}\n`;
233
+ }
234
+ if (task.assignees?.length) {
235
+ text += `**Assignees:** ${task.assignees.join(", ")}\n`;
236
+ }
237
+
238
+ text += `\n**Created:** ${task.createdAt}\n`;
239
+ text += `**Updated:** ${task.updatedAt}\n`;
240
+
241
+ if (task.input) {
242
+ text += `\n**Input:**\n\`\`\`json\n${JSON.stringify(task.input, null, 2)}\n\`\`\`\n`;
243
+ }
244
+
245
+ if (task.output) {
246
+ text += `\n**Output:**\n\`\`\`json\n${JSON.stringify(task.output, null, 2)}\n\`\`\`\n`;
247
+ }
248
+
249
+ if (task.error) {
250
+ text += `\n**Error:** ${task.error}\n`;
251
+ }
252
+
253
+ return text;
254
+ }
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Type definitions for CommanderClaw plugin
3
+ */
4
+ export interface CommanderClawConfig {
5
+ serverUrl: string;
6
+ token?: string;
7
+ deviceName: string;
8
+ autoConnect: boolean;
9
+ reconnect: {
10
+ enabled: boolean;
11
+ maxAttempts: number;
12
+ delayMs: number;
13
+ };
14
+ }
15
+ export interface Message {
16
+ type: string;
17
+ id: string;
18
+ from: string;
19
+ to?: string;
20
+ payload?: unknown;
21
+ timestamp: number;
22
+ }
23
+ export interface HelloPayload {
24
+ id: string;
25
+ name: string;
26
+ capabilities: string[];
27
+ token?: string;
28
+ }
29
+ export interface HelloAckPayload {
30
+ nodeId: string;
31
+ peers: PeerInfo[];
32
+ commanderId?: string;
33
+ error?: string;
34
+ }
35
+ export interface PeerInfo {
36
+ id: string;
37
+ name: string;
38
+ status: string;
39
+ role: string;
40
+ capabilities?: string[];
41
+ load: number;
42
+ }
43
+ export interface HeartbeatPayload {
44
+ status: string;
45
+ load: number;
46
+ }
47
+ export interface PeerUpdatePayload {
48
+ event: "join" | "leave" | "update";
49
+ node: PeerInfo;
50
+ }
51
+ export interface Task {
52
+ id: string;
53
+ name: string;
54
+ description?: string;
55
+ creatorId: string;
56
+ commanderId?: string;
57
+ assignees: string[];
58
+ status: TaskStatus;
59
+ priority: TaskPriority;
60
+ progress: number;
61
+ createdAt: string;
62
+ updatedAt: string;
63
+ startedAt?: string;
64
+ completedAt?: string;
65
+ input?: unknown;
66
+ output?: unknown;
67
+ error?: string;
68
+ rounds: number;
69
+ maxRounds: number;
70
+ }
71
+ export type TaskStatus = "pending" | "assigned" | "running" | "paused" | "completed" | "failed" | "aborted";
72
+ export type TaskPriority = "low" | "normal" | "high" | "critical";
73
+ export interface CreateTaskInput {
74
+ name: string;
75
+ description?: string;
76
+ priority?: TaskPriority;
77
+ input?: unknown;
78
+ targetNodeId?: string;
79
+ maxRounds?: number;
80
+ }
81
+ export interface TaskUpdatePayload {
82
+ taskId: string;
83
+ subTaskId?: string;
84
+ status?: string;
85
+ progress?: number;
86
+ message?: string;
87
+ data?: unknown;
88
+ }
89
+ export interface TaskResultPayload {
90
+ taskId: string;
91
+ subTaskId?: string;
92
+ status: string;
93
+ output?: unknown;
94
+ error?: string;
95
+ duration: number;
96
+ }
97
+ export type ClientEventType = "connected" | "disconnected" | "error" | "task_assign" | "peer_update" | "commander_change" | "chat";
98
+ export interface ClientEvent {
99
+ type: ClientEventType;
100
+ data?: unknown;
101
+ }
102
+ export interface OpenClawApi {
103
+ getConfig: (pluginId: string) => CommanderClawConfig;
104
+ registerTool: (tool: ToolDefinition, options?: {
105
+ optional?: boolean;
106
+ }) => void;
107
+ registerCommand: (command: CommandDefinition) => void;
108
+ on: (event: string, handler: () => Promise<void>) => void;
109
+ logger: {
110
+ info: (message: string, data?: Record<string, unknown>) => void;
111
+ warn: (message: string, data?: Record<string, unknown>) => void;
112
+ error: (message: string, data?: Record<string, unknown>) => void;
113
+ debug: (message: string, data?: Record<string, unknown>) => void;
114
+ };
115
+ }
116
+ export interface ToolDefinition {
117
+ name: string;
118
+ description: string;
119
+ parameters: unknown;
120
+ execute: (id: string, params: Record<string, unknown>) => Promise<ToolResult>;
121
+ }
122
+ export interface ToolResult {
123
+ content: Array<{
124
+ type: "text";
125
+ text: string;
126
+ }>;
127
+ }
128
+ export interface CommandDefinition {
129
+ name: string;
130
+ description: string;
131
+ handler: () => Promise<Record<string, unknown>>;
132
+ }
133
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plugin/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ {
2
+ "id": "commanderclaw",
3
+ "name": "CommanderClaw",
4
+ "description": "Connect to CommanderClaw coordination server as a node for multi-agent task coordination",
5
+ "version": "1.1.3",
6
+ "channels": ["commanderclaw"],
7
+ "configSchema": {
8
+ "type": "object",
9
+ "additionalProperties": false,
10
+ "properties": {
11
+ "serverUrl": {
12
+ "type": "string",
13
+ "description": "CommanderClaw server WebSocket URL",
14
+ "default": "ws://127.0.0.1:19739/ws"
15
+ },
16
+ "token": {
17
+ "type": "string",
18
+ "description": "Authentication token for the CommanderClaw server"
19
+ },
20
+ "deviceName": {
21
+ "type": "string",
22
+ "description": "Node name to register with the cluster",
23
+ "default": "OpenClaw Agent"
24
+ },
25
+ "autoConnect": {
26
+ "type": "boolean",
27
+ "description": "Automatically connect to server on gateway start",
28
+ "default": true
29
+ },
30
+ "reconnect": {
31
+ "type": "object",
32
+ "properties": {
33
+ "enabled": {
34
+ "type": "boolean",
35
+ "default": true
36
+ },
37
+ "maxAttempts": {
38
+ "type": "number",
39
+ "default": 10
40
+ },
41
+ "delayMs": {
42
+ "type": "number",
43
+ "default": 5000
44
+ }
45
+ }
46
+ }
47
+ },
48
+ "required": ["serverUrl"]
49
+ },
50
+ "skills": ["./dist/plugin/skills/commanderclaw"]
51
+ }
package/package.json ADDED
@@ -0,0 +1,86 @@
1
+ {
2
+ "name": "commanderclaw",
3
+ "version": "1.1.3",
4
+ "description": "Multi-device Agent Coordination Framework - CLI and OpenClaw/QClaw Plugin",
5
+ "type": "module",
6
+ "bin": {
7
+ "commanderclaw": "./bin/commanderclaw.cjs"
8
+ },
9
+ "main": "./dist/plugin/index.cjs",
10
+ "module": "./dist/plugin/index.mjs",
11
+ "types": "./dist/plugin/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "import": "./dist/plugin/index.mjs",
15
+ "require": "./dist/plugin/index.cjs",
16
+ "types": "./dist/plugin/index.d.ts"
17
+ }
18
+ },
19
+ "files": [
20
+ "bin",
21
+ "dist",
22
+ "binaries",
23
+ "openclaw.plugin.json",
24
+ "README.md"
25
+ ],
26
+ "scripts": {
27
+ "build": "npm run build:cli && npm run build:plugin",
28
+ "build:cli": "tsc -p tsconfig.cli.json",
29
+ "build:plugin": "rollup -c rollup.plugin.config.mjs && npm run copy-assets",
30
+ "copy-assets": "cp -r src/plugin/skills dist/plugin/ && cp -r src/plugin/tools dist/plugin/",
31
+ "dev": "tsc -p tsconfig.cli.json --watch",
32
+ "prepublishOnly": "npm run build"
33
+ },
34
+ "keywords": [
35
+ "openclaw",
36
+ "qclaw",
37
+ "plugin",
38
+ "commanderclaw",
39
+ "multi-agent",
40
+ "coordination",
41
+ "distributed"
42
+ ],
43
+ "author": "DarrenHoo",
44
+ "license": "MIT",
45
+ "engines": {
46
+ "node": ">=18.0.0"
47
+ },
48
+ "peerDependencies": {
49
+ "openclaw": ">=2026.1.0"
50
+ },
51
+ "dependencies": {
52
+ "@sinclair/typebox": "^0.32.0"
53
+ },
54
+ "devDependencies": {
55
+ "@rollup/plugin-commonjs": "^29.0.2",
56
+ "@rollup/plugin-json": "^6.1.0",
57
+ "@rollup/plugin-node-resolve": "^16.0.3",
58
+ "@rollup/plugin-typescript": "^12.3.0",
59
+ "@types/node": "^20.0.0",
60
+ "@types/ws": "^8.5.0",
61
+ "rollup": "^4.59.0",
62
+ "typescript": "^5.0.0"
63
+ },
64
+ "openclaw": {
65
+ "extensions": [
66
+ "./dist/plugin/index.mjs"
67
+ ],
68
+ "channel": {
69
+ "id": "commanderclaw",
70
+ "label": "CommanderClaw",
71
+ "selectionLabel": "CommanderClaw Multi-Agent",
72
+ "detailLabel": "CommanderClaw Multi-Agent Coordination",
73
+ "blurb": "Connect to CommanderClaw coordination server for multi-agent task coordination",
74
+ "order": 100
75
+ }
76
+ },
77
+ "repository": {
78
+ "type": "git",
79
+ "url": "https://github.com/commander-claw/commander-claw.git",
80
+ "directory": "packages/commanderclaw"
81
+ },
82
+ "homepage": "https://github.com/commander-claw/commander-claw#readme",
83
+ "bugs": {
84
+ "url": "https://github.com/commander-claw/commander-claw/issues"
85
+ }
86
+ }