multiclaws 0.4.42 → 0.4.43

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.
Files changed (38) hide show
  1. package/README.md +2 -0
  2. package/dist/gateway/handlers.d.ts +4 -4
  3. package/dist/gateway/handlers.js +239 -239
  4. package/dist/index.d.ts +8 -8
  5. package/dist/index.js +710 -710
  6. package/dist/infra/frp.d.ts +55 -55
  7. package/dist/infra/frp.js +398 -398
  8. package/dist/infra/gateway-client.d.ts +27 -27
  9. package/dist/infra/gateway-client.js +136 -136
  10. package/dist/infra/json-store.d.ts +4 -4
  11. package/dist/infra/json-store.js +57 -57
  12. package/dist/infra/logger.d.ts +14 -14
  13. package/dist/infra/logger.js +25 -25
  14. package/dist/infra/rate-limiter.d.ts +19 -19
  15. package/dist/infra/rate-limiter.js +69 -69
  16. package/dist/infra/tailscale.d.ts +19 -19
  17. package/dist/infra/tailscale.js +120 -120
  18. package/dist/infra/telemetry.d.ts +3 -3
  19. package/dist/infra/telemetry.js +17 -17
  20. package/dist/infra/version.d.ts +1 -1
  21. package/dist/infra/version.js +19 -19
  22. package/dist/service/a2a-adapter.d.ts +80 -80
  23. package/dist/service/a2a-adapter.js +505 -505
  24. package/dist/service/agent-profile.d.ts +17 -17
  25. package/dist/service/agent-profile.js +58 -58
  26. package/dist/service/agent-registry.d.ts +29 -29
  27. package/dist/service/agent-registry.js +131 -131
  28. package/dist/service/multiclaws-service.d.ts +150 -150
  29. package/dist/service/multiclaws-service.js +1137 -1137
  30. package/dist/service/session-store.d.ts +46 -46
  31. package/dist/service/session-store.js +143 -143
  32. package/dist/task/tracker.d.ts +46 -46
  33. package/dist/task/tracker.js +191 -191
  34. package/dist/team/team-store.d.ts +42 -42
  35. package/dist/team/team-store.js +195 -195
  36. package/dist/types/openclaw.d.ts +109 -109
  37. package/dist/types/openclaw.js +2 -2
  38. package/package.json +1 -1
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # MultiClaws
2
2
 
3
+ > 本插件致力于提高办公效率。
4
+
3
5
  Multi-agent collaboration plugin for [OpenClaw](https://openclaw.ai). Connect multiple OpenClaw instances into a team and delegate tasks between them using the [A2A protocol](https://google.github.io/A2A/).
4
6
 
5
7
  [中文文档](README.zh-CN.md)
@@ -1,4 +1,4 @@
1
- import type { GatewayRequestHandler } from "../types/openclaw";
2
- import type { MulticlawsService } from "../service/multiclaws-service";
3
- import type { BasicLogger } from "../infra/logger";
4
- export declare function createGatewayHandlers(getService: () => MulticlawsService, logger?: BasicLogger): Record<string, GatewayRequestHandler>;
1
+ import type { GatewayRequestHandler } from "../types/openclaw";
2
+ import type { MulticlawsService } from "../service/multiclaws-service";
3
+ import type { BasicLogger } from "../infra/logger";
4
+ export declare function createGatewayHandlers(getService: () => MulticlawsService, logger?: BasicLogger): Record<string, GatewayRequestHandler>;
@@ -1,239 +1,239 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createGatewayHandlers = createGatewayHandlers;
4
- const zod_1 = require("zod");
5
- const nonEmptyString = zod_1.z.string().trim().min(1);
6
- const agentAddSchema = zod_1.z.object({
7
- url: nonEmptyString,
8
- apiKey: zod_1.z.string().trim().min(1).optional(),
9
- });
10
- const agentRemoveSchema = zod_1.z.object({ url: nonEmptyString });
11
- const taskDelegateSchema = zod_1.z.object({
12
- agentUrl: nonEmptyString,
13
- task: nonEmptyString,
14
- });
15
- const taskStatusSchema = zod_1.z.object({ taskId: nonEmptyString });
16
- const taskRespondSchema = zod_1.z.object({
17
- taskId: nonEmptyString,
18
- approved: zod_1.z.boolean(),
19
- });
20
- const profileSetSchema = zod_1.z.object({
21
- ownerName: zod_1.z.string().trim().optional(),
22
- bio: zod_1.z.string().optional(),
23
- });
24
- const teamCreateSchema = zod_1.z.object({ name: nonEmptyString });
25
- const teamJoinSchema = zod_1.z.object({ inviteCode: nonEmptyString });
26
- const teamLeaveSchema = zod_1.z.object({ teamId: zod_1.z.string().trim().min(1).optional() });
27
- const teamMembersSchema = zod_1.z.object({ teamId: zod_1.z.string().trim().min(1).optional() });
28
- function safeHandle(respond, code, error) {
29
- respond(false, undefined, {
30
- code,
31
- message: error instanceof Error ? error.message : String(error),
32
- });
33
- }
34
- function createGatewayHandlers(getService, logger) {
35
- const log = (level, msg) => {
36
- const fn = level === "debug" ? logger?.debug : logger?.[level];
37
- fn?.(`[multiclaws:gw] ${msg}`);
38
- };
39
- const handlers = {
40
- /* ── Agent handlers ─────────────────────────────────────────── */
41
- "multiclaws.agent.list": async ({ respond }) => {
42
- log("debug", "agent.list");
43
- try {
44
- const service = getService();
45
- const agents = await service.listAgents();
46
- respond(true, { agents });
47
- }
48
- catch (error) {
49
- log("error", `agent.list failed: ${error instanceof Error ? error.message : String(error)}`);
50
- safeHandle(respond, "agent_list_failed", error);
51
- }
52
- },
53
- "multiclaws.agent.add": async ({ params, respond }) => {
54
- log("debug", `agent.add(url=${params?.url})`);
55
- try {
56
- const parsed = agentAddSchema.parse(params);
57
- const service = getService();
58
- const agent = await service.addAgent(parsed);
59
- respond(true, agent);
60
- }
61
- catch (error) {
62
- log("error", `agent.add failed: ${error instanceof Error ? error.message : String(error)}`);
63
- safeHandle(respond, "invalid_params", error);
64
- }
65
- },
66
- "multiclaws.agent.remove": async ({ params, respond }) => {
67
- log("debug", `agent.remove(url=${params?.url})`);
68
- try {
69
- const parsed = agentRemoveSchema.parse(params);
70
- const service = getService();
71
- const removed = await service.removeAgent(parsed.url);
72
- respond(true, { removed });
73
- }
74
- catch (error) {
75
- log("error", `agent.remove failed: ${error instanceof Error ? error.message : String(error)}`);
76
- safeHandle(respond, "invalid_params", error);
77
- }
78
- },
79
- /* ── Task handlers ──────────────────────────────────────────── */
80
- "multiclaws.task.delegate": async ({ params, respond }) => {
81
- log("debug", `task.delegate(agentUrl=${params?.agentUrl})`);
82
- try {
83
- const parsed = taskDelegateSchema.parse(params);
84
- const service = getService();
85
- const result = await service.delegateTask(parsed);
86
- respond(true, result);
87
- }
88
- catch (error) {
89
- log("error", `task.delegate failed: ${error instanceof Error ? error.message : String(error)}`);
90
- safeHandle(respond, "task_delegate_failed", error);
91
- }
92
- },
93
- "multiclaws.task.respond": async ({ params, respond }) => {
94
- log("debug", `task.respond(taskId=${params?.taskId}, approved=${params?.approved})`);
95
- try {
96
- const parsed = taskRespondSchema.parse(params);
97
- const service = getService();
98
- const resolved = service.respondToTask(parsed.taskId, parsed.approved);
99
- respond(true, { resolved, approved: parsed.approved });
100
- }
101
- catch (error) {
102
- log("error", `task.respond failed: ${error instanceof Error ? error.message : String(error)}`);
103
- safeHandle(respond, "task_respond_failed", error);
104
- }
105
- },
106
- "multiclaws.task.status": async ({ params, respond }) => {
107
- log("debug", `task.status(taskId=${params?.taskId})`);
108
- try {
109
- const parsed = taskStatusSchema.parse(params);
110
- const service = getService();
111
- const task = service.getTaskStatus(parsed.taskId);
112
- if (!task) {
113
- respond(false, undefined, {
114
- code: "not_found",
115
- message: `task not found: ${parsed.taskId}`,
116
- });
117
- return;
118
- }
119
- respond(true, { task });
120
- }
121
- catch (error) {
122
- log("error", `task.status failed: ${error instanceof Error ? error.message : String(error)}`);
123
- safeHandle(respond, "task_status_failed", error);
124
- }
125
- },
126
- /* ── Team handlers ──────────────────────────────────────────── */
127
- "multiclaws.team.create": async ({ params, respond }) => {
128
- log("debug", `team.create(name=${params?.name})`);
129
- try {
130
- const parsed = teamCreateSchema.parse(params);
131
- const service = getService();
132
- const team = await service.createTeam(parsed.name);
133
- const invite = await service.createInvite(team.teamId);
134
- respond(true, { team, inviteCode: invite });
135
- }
136
- catch (error) {
137
- log("error", `team.create failed: ${error instanceof Error ? error.message : String(error)}`);
138
- safeHandle(respond, "team_create_failed", error);
139
- }
140
- },
141
- "multiclaws.team.join": async ({ params, respond }) => {
142
- log("debug", "team.join");
143
- try {
144
- const parsed = teamJoinSchema.parse(params);
145
- const service = getService();
146
- const team = await service.joinTeam(parsed.inviteCode);
147
- respond(true, { team });
148
- }
149
- catch (error) {
150
- log("error", `team.join failed: ${error instanceof Error ? error.message : String(error)}`);
151
- safeHandle(respond, "team_join_failed", error);
152
- }
153
- },
154
- "multiclaws.team.leave": async ({ params, respond }) => {
155
- log("debug", "team.leave");
156
- try {
157
- const parsed = teamLeaveSchema.parse(params);
158
- const service = getService();
159
- await service.leaveTeam(parsed.teamId || undefined);
160
- respond(true, { left: true });
161
- }
162
- catch (error) {
163
- log("error", `team.leave failed: ${error instanceof Error ? error.message : String(error)}`);
164
- safeHandle(respond, "team_leave_failed", error);
165
- }
166
- },
167
- "multiclaws.team.members": async ({ params, respond }) => {
168
- log("debug", `team.members(teamId=${params?.teamId})`);
169
- try {
170
- const parsed = teamMembersSchema.parse(params);
171
- const service = getService();
172
- const result = await service.listTeamMembers(parsed.teamId || undefined);
173
- if (!result) {
174
- respond(false, undefined, {
175
- code: "not_found",
176
- message: "no team found",
177
- });
178
- return;
179
- }
180
- respond(true, result);
181
- }
182
- catch (error) {
183
- log("error", `team.members failed: ${error instanceof Error ? error.message : String(error)}`);
184
- safeHandle(respond, "team_members_failed", error);
185
- }
186
- },
187
- /* ── Profile handlers ───────────────────────────────────────── */
188
- "multiclaws.profile.show": async ({ respond }) => {
189
- log("debug", "profile.show");
190
- try {
191
- const service = getService();
192
- const profile = await service.getProfile();
193
- respond(true, profile);
194
- }
195
- catch (error) {
196
- log("error", `profile.show failed: ${error instanceof Error ? error.message : String(error)}`);
197
- safeHandle(respond, "profile_show_failed", error);
198
- }
199
- },
200
- "multiclaws.profile.pending_review": async ({ respond }) => {
201
- log("debug", "profile.pending_review");
202
- try {
203
- const service = getService();
204
- const result = await service.getPendingProfileReview();
205
- respond(true, result);
206
- }
207
- catch (error) {
208
- log("error", `profile.pending_review failed: ${error instanceof Error ? error.message : String(error)}`);
209
- safeHandle(respond, "profile_pending_review_failed", error);
210
- }
211
- },
212
- "multiclaws.profile.clear_pending_review": async ({ respond }) => {
213
- log("debug", "profile.clear_pending_review");
214
- try {
215
- const service = getService();
216
- await service.clearPendingProfileReview();
217
- respond(true, { cleared: true });
218
- }
219
- catch (error) {
220
- log("error", `profile.clear_pending_review failed: ${error instanceof Error ? error.message : String(error)}`);
221
- safeHandle(respond, "profile_clear_pending_review_failed", error);
222
- }
223
- },
224
- "multiclaws.profile.set": async ({ params, respond }) => {
225
- log("debug", "profile.set");
226
- try {
227
- const parsed = profileSetSchema.parse(params);
228
- const service = getService();
229
- const profile = await service.setProfile(parsed);
230
- respond(true, profile);
231
- }
232
- catch (error) {
233
- log("error", `profile.set failed: ${error instanceof Error ? error.message : String(error)}`);
234
- safeHandle(respond, "profile_set_failed", error);
235
- }
236
- },
237
- };
238
- return handlers;
239
- }
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createGatewayHandlers = createGatewayHandlers;
4
+ const zod_1 = require("zod");
5
+ const nonEmptyString = zod_1.z.string().trim().min(1);
6
+ const agentAddSchema = zod_1.z.object({
7
+ url: nonEmptyString,
8
+ apiKey: zod_1.z.string().trim().min(1).optional(),
9
+ });
10
+ const agentRemoveSchema = zod_1.z.object({ url: nonEmptyString });
11
+ const taskDelegateSchema = zod_1.z.object({
12
+ agentUrl: nonEmptyString,
13
+ task: nonEmptyString,
14
+ });
15
+ const taskStatusSchema = zod_1.z.object({ taskId: nonEmptyString });
16
+ const taskRespondSchema = zod_1.z.object({
17
+ taskId: nonEmptyString,
18
+ approved: zod_1.z.boolean(),
19
+ });
20
+ const profileSetSchema = zod_1.z.object({
21
+ ownerName: zod_1.z.string().trim().optional(),
22
+ bio: zod_1.z.string().optional(),
23
+ });
24
+ const teamCreateSchema = zod_1.z.object({ name: nonEmptyString });
25
+ const teamJoinSchema = zod_1.z.object({ inviteCode: nonEmptyString });
26
+ const teamLeaveSchema = zod_1.z.object({ teamId: zod_1.z.string().trim().min(1).optional() });
27
+ const teamMembersSchema = zod_1.z.object({ teamId: zod_1.z.string().trim().min(1).optional() });
28
+ function safeHandle(respond, code, error) {
29
+ respond(false, undefined, {
30
+ code,
31
+ message: error instanceof Error ? error.message : String(error),
32
+ });
33
+ }
34
+ function createGatewayHandlers(getService, logger) {
35
+ const log = (level, msg) => {
36
+ const fn = level === "debug" ? logger?.debug : logger?.[level];
37
+ fn?.(`[multiclaws:gw] ${msg}`);
38
+ };
39
+ const handlers = {
40
+ /* ── Agent handlers ─────────────────────────────────────────── */
41
+ "multiclaws.agent.list": async ({ respond }) => {
42
+ log("debug", "agent.list");
43
+ try {
44
+ const service = getService();
45
+ const agents = await service.listAgents();
46
+ respond(true, { agents });
47
+ }
48
+ catch (error) {
49
+ log("error", `agent.list failed: ${error instanceof Error ? error.message : String(error)}`);
50
+ safeHandle(respond, "agent_list_failed", error);
51
+ }
52
+ },
53
+ "multiclaws.agent.add": async ({ params, respond }) => {
54
+ log("debug", `agent.add(url=${params?.url})`);
55
+ try {
56
+ const parsed = agentAddSchema.parse(params);
57
+ const service = getService();
58
+ const agent = await service.addAgent(parsed);
59
+ respond(true, agent);
60
+ }
61
+ catch (error) {
62
+ log("error", `agent.add failed: ${error instanceof Error ? error.message : String(error)}`);
63
+ safeHandle(respond, "invalid_params", error);
64
+ }
65
+ },
66
+ "multiclaws.agent.remove": async ({ params, respond }) => {
67
+ log("debug", `agent.remove(url=${params?.url})`);
68
+ try {
69
+ const parsed = agentRemoveSchema.parse(params);
70
+ const service = getService();
71
+ const removed = await service.removeAgent(parsed.url);
72
+ respond(true, { removed });
73
+ }
74
+ catch (error) {
75
+ log("error", `agent.remove failed: ${error instanceof Error ? error.message : String(error)}`);
76
+ safeHandle(respond, "invalid_params", error);
77
+ }
78
+ },
79
+ /* ── Task handlers ──────────────────────────────────────────── */
80
+ "multiclaws.task.delegate": async ({ params, respond }) => {
81
+ log("debug", `task.delegate(agentUrl=${params?.agentUrl})`);
82
+ try {
83
+ const parsed = taskDelegateSchema.parse(params);
84
+ const service = getService();
85
+ const result = await service.delegateTask(parsed);
86
+ respond(true, result);
87
+ }
88
+ catch (error) {
89
+ log("error", `task.delegate failed: ${error instanceof Error ? error.message : String(error)}`);
90
+ safeHandle(respond, "task_delegate_failed", error);
91
+ }
92
+ },
93
+ "multiclaws.task.respond": async ({ params, respond }) => {
94
+ log("debug", `task.respond(taskId=${params?.taskId}, approved=${params?.approved})`);
95
+ try {
96
+ const parsed = taskRespondSchema.parse(params);
97
+ const service = getService();
98
+ const resolved = service.respondToTask(parsed.taskId, parsed.approved);
99
+ respond(true, { resolved, approved: parsed.approved });
100
+ }
101
+ catch (error) {
102
+ log("error", `task.respond failed: ${error instanceof Error ? error.message : String(error)}`);
103
+ safeHandle(respond, "task_respond_failed", error);
104
+ }
105
+ },
106
+ "multiclaws.task.status": async ({ params, respond }) => {
107
+ log("debug", `task.status(taskId=${params?.taskId})`);
108
+ try {
109
+ const parsed = taskStatusSchema.parse(params);
110
+ const service = getService();
111
+ const task = service.getTaskStatus(parsed.taskId);
112
+ if (!task) {
113
+ respond(false, undefined, {
114
+ code: "not_found",
115
+ message: `task not found: ${parsed.taskId}`,
116
+ });
117
+ return;
118
+ }
119
+ respond(true, { task });
120
+ }
121
+ catch (error) {
122
+ log("error", `task.status failed: ${error instanceof Error ? error.message : String(error)}`);
123
+ safeHandle(respond, "task_status_failed", error);
124
+ }
125
+ },
126
+ /* ── Team handlers ──────────────────────────────────────────── */
127
+ "multiclaws.team.create": async ({ params, respond }) => {
128
+ log("debug", `team.create(name=${params?.name})`);
129
+ try {
130
+ const parsed = teamCreateSchema.parse(params);
131
+ const service = getService();
132
+ const team = await service.createTeam(parsed.name);
133
+ const invite = await service.createInvite(team.teamId);
134
+ respond(true, { team, inviteCode: invite });
135
+ }
136
+ catch (error) {
137
+ log("error", `team.create failed: ${error instanceof Error ? error.message : String(error)}`);
138
+ safeHandle(respond, "team_create_failed", error);
139
+ }
140
+ },
141
+ "multiclaws.team.join": async ({ params, respond }) => {
142
+ log("debug", "team.join");
143
+ try {
144
+ const parsed = teamJoinSchema.parse(params);
145
+ const service = getService();
146
+ const team = await service.joinTeam(parsed.inviteCode);
147
+ respond(true, { team });
148
+ }
149
+ catch (error) {
150
+ log("error", `team.join failed: ${error instanceof Error ? error.message : String(error)}`);
151
+ safeHandle(respond, "team_join_failed", error);
152
+ }
153
+ },
154
+ "multiclaws.team.leave": async ({ params, respond }) => {
155
+ log("debug", "team.leave");
156
+ try {
157
+ const parsed = teamLeaveSchema.parse(params);
158
+ const service = getService();
159
+ await service.leaveTeam(parsed.teamId || undefined);
160
+ respond(true, { left: true });
161
+ }
162
+ catch (error) {
163
+ log("error", `team.leave failed: ${error instanceof Error ? error.message : String(error)}`);
164
+ safeHandle(respond, "team_leave_failed", error);
165
+ }
166
+ },
167
+ "multiclaws.team.members": async ({ params, respond }) => {
168
+ log("debug", `team.members(teamId=${params?.teamId})`);
169
+ try {
170
+ const parsed = teamMembersSchema.parse(params);
171
+ const service = getService();
172
+ const result = await service.listTeamMembers(parsed.teamId || undefined);
173
+ if (!result) {
174
+ respond(false, undefined, {
175
+ code: "not_found",
176
+ message: "no team found",
177
+ });
178
+ return;
179
+ }
180
+ respond(true, result);
181
+ }
182
+ catch (error) {
183
+ log("error", `team.members failed: ${error instanceof Error ? error.message : String(error)}`);
184
+ safeHandle(respond, "team_members_failed", error);
185
+ }
186
+ },
187
+ /* ── Profile handlers ───────────────────────────────────────── */
188
+ "multiclaws.profile.show": async ({ respond }) => {
189
+ log("debug", "profile.show");
190
+ try {
191
+ const service = getService();
192
+ const profile = await service.getProfile();
193
+ respond(true, profile);
194
+ }
195
+ catch (error) {
196
+ log("error", `profile.show failed: ${error instanceof Error ? error.message : String(error)}`);
197
+ safeHandle(respond, "profile_show_failed", error);
198
+ }
199
+ },
200
+ "multiclaws.profile.pending_review": async ({ respond }) => {
201
+ log("debug", "profile.pending_review");
202
+ try {
203
+ const service = getService();
204
+ const result = await service.getPendingProfileReview();
205
+ respond(true, result);
206
+ }
207
+ catch (error) {
208
+ log("error", `profile.pending_review failed: ${error instanceof Error ? error.message : String(error)}`);
209
+ safeHandle(respond, "profile_pending_review_failed", error);
210
+ }
211
+ },
212
+ "multiclaws.profile.clear_pending_review": async ({ respond }) => {
213
+ log("debug", "profile.clear_pending_review");
214
+ try {
215
+ const service = getService();
216
+ await service.clearPendingProfileReview();
217
+ respond(true, { cleared: true });
218
+ }
219
+ catch (error) {
220
+ log("error", `profile.clear_pending_review failed: ${error instanceof Error ? error.message : String(error)}`);
221
+ safeHandle(respond, "profile_clear_pending_review_failed", error);
222
+ }
223
+ },
224
+ "multiclaws.profile.set": async ({ params, respond }) => {
225
+ log("debug", "profile.set");
226
+ try {
227
+ const parsed = profileSetSchema.parse(params);
228
+ const service = getService();
229
+ const profile = await service.setProfile(parsed);
230
+ respond(true, profile);
231
+ }
232
+ catch (error) {
233
+ log("error", `profile.set failed: ${error instanceof Error ? error.message : String(error)}`);
234
+ safeHandle(respond, "profile_set_failed", error);
235
+ }
236
+ },
237
+ };
238
+ return handlers;
239
+ }
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import type { OpenClawPluginApi } from "./types/openclaw";
2
- declare const plugin: {
3
- id: string;
4
- name: string;
5
- version: string;
6
- register(api: OpenClawPluginApi): void;
7
- };
8
- export default plugin;
1
+ import type { OpenClawPluginApi } from "./types/openclaw";
2
+ declare const plugin: {
3
+ id: string;
4
+ name: string;
5
+ version: string;
6
+ register(api: OpenClawPluginApi): void;
7
+ };
8
+ export default plugin;