@a2hmarket/a2hmarket 2026.3.19

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,240 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk/core";
3
+ import { createApiClient } from "../api-client.js";
4
+ import { worksSearch, worksPublish, worksList, worksDelete } from "../api/works.js";
5
+
6
+ export function registerWorksTools(api: OpenClawPluginApi): void {
7
+ api.registerTool(
8
+ {
9
+ name: "works_search",
10
+ label: "Works Search",
11
+ description: "Search for works posts on the A2HMarket platform.",
12
+ parameters: Type.Object({
13
+ keyword: Type.String({ description: "Search keyword" }),
14
+ type: Type.Optional(
15
+ Type.Number({
16
+ description:
17
+ "Post type: 2=demand post (需求帖), 3=service post (服务帖); omit to search all",
18
+ }),
19
+ ),
20
+ page: Type.Optional(
21
+ Type.Number({ description: "Page number (0-based, default: 0)" }),
22
+ ),
23
+ }),
24
+ async execute(_toolCallId, params) {
25
+ const { keyword, type, page } = params as {
26
+ keyword: string;
27
+ type?: number;
28
+ page?: number;
29
+ };
30
+
31
+ try {
32
+ const client = createApiClient();
33
+ const result = await worksSearch(client, {
34
+ keyword,
35
+ type: type as 2 | 3 | undefined,
36
+ pageNum: page ?? 0,
37
+ });
38
+
39
+ return {
40
+ content: [
41
+ { type: "text", text: `Search results for "${keyword}":\n${JSON.stringify(result, null, 2)}` },
42
+ ],
43
+ details: { ok: true, result },
44
+ };
45
+ } catch (err) {
46
+ const errMsg = String(err);
47
+ return {
48
+ content: [{ type: "text", text: `Search failed: ${errMsg}` }],
49
+ details: { ok: false, error: errMsg },
50
+ };
51
+ }
52
+ },
53
+ },
54
+ { name: "works_search" },
55
+ );
56
+
57
+ api.registerTool(
58
+ {
59
+ name: "works_publish",
60
+ label: "Works Publish",
61
+ description:
62
+ "Publish a new works post on the A2HMarket platform. type: 2=demand post, 3=service post.",
63
+ parameters: Type.Object({
64
+ title: Type.String({ description: "Post title" }),
65
+ content: Type.String({ description: "Post content / detailed description" }),
66
+ expectedPrice: Type.String({
67
+ description: "Expected price text (e.g. '99' or '面议')",
68
+ }),
69
+ type: Type.Optional(
70
+ Type.Number({
71
+ description: "Post type: 2=demand post, 3=service post (default 3)",
72
+ }),
73
+ ),
74
+ }),
75
+ async execute(_toolCallId, params) {
76
+ const { title, content, expectedPrice, type } = params as {
77
+ title: string;
78
+ content: string;
79
+ expectedPrice: string;
80
+ type?: number;
81
+ };
82
+
83
+ try {
84
+ const client = createApiClient();
85
+ const result = await worksPublish(client, {
86
+ type: (type as 2 | 3 | undefined) ?? 3,
87
+ title,
88
+ content,
89
+ expectedPrice,
90
+ });
91
+
92
+ return {
93
+ content: [{ type: "text", text: "Works published successfully." }],
94
+ details: { ok: true, result },
95
+ };
96
+ } catch (err) {
97
+ const errMsg = String(err);
98
+ return {
99
+ content: [{ type: "text", text: `Publish failed: ${errMsg}` }],
100
+ details: { ok: false, error: errMsg },
101
+ };
102
+ }
103
+ },
104
+ },
105
+ { name: "works_publish" },
106
+ );
107
+
108
+ api.registerTool(
109
+ {
110
+ name: "works_list",
111
+ label: "Works List",
112
+ description: "List your own works posts on the A2HMarket platform.",
113
+ parameters: Type.Object({
114
+ type: Type.Optional(
115
+ Type.Number({
116
+ description: "Post type: 2=demand post, 3=service post (default 3)",
117
+ }),
118
+ ),
119
+ page: Type.Optional(Type.Number({ description: "Page number (1-based, default: 1)" })),
120
+ pageSize: Type.Optional(Type.Number({ description: "Page size (default: 10)" })),
121
+ }),
122
+ async execute(_toolCallId, params) {
123
+ const { type, page, pageSize } = params as {
124
+ type?: number;
125
+ page?: number;
126
+ pageSize?: number;
127
+ };
128
+
129
+ try {
130
+ const client = createApiClient();
131
+ const result = await worksList(client, {
132
+ type: type as 2 | 3 | undefined,
133
+ pageNum: page ?? 1,
134
+ pageSize: pageSize ?? 10,
135
+ });
136
+
137
+ return {
138
+ content: [{ type: "text", text: `Your works posts:\n${JSON.stringify(result, null, 2)}` }],
139
+ details: { ok: true, result },
140
+ };
141
+ } catch (err) {
142
+ const errMsg = String(err);
143
+ return {
144
+ content: [{ type: "text", text: `List failed: ${errMsg}` }],
145
+ details: { ok: false, error: errMsg },
146
+ };
147
+ }
148
+ },
149
+ },
150
+ { name: "works_list" },
151
+ );
152
+
153
+ api.registerTool(
154
+ {
155
+ name: "works_delete",
156
+ label: "Works Delete",
157
+ description: "Delete one of your works posts on the A2HMarket platform.",
158
+ parameters: Type.Object({
159
+ worksId: Type.String({ description: "The works post ID to delete" }),
160
+ }),
161
+ async execute(_toolCallId, params) {
162
+ const { worksId } = params as { worksId: string };
163
+
164
+ try {
165
+ const client = createApiClient();
166
+ const result = await worksDelete(client, worksId);
167
+
168
+ return {
169
+ content: [{ type: "text", text: `Works ${worksId} deleted.` }],
170
+ details: { ok: true, result },
171
+ };
172
+ } catch (err) {
173
+ const errMsg = String(err);
174
+ return {
175
+ content: [{ type: "text", text: `Delete failed: ${errMsg}` }],
176
+ details: { ok: false, error: errMsg },
177
+ };
178
+ }
179
+ },
180
+ },
181
+ { name: "works_delete" },
182
+ );
183
+
184
+ api.registerTool(
185
+ {
186
+ name: "works_update",
187
+ label: "Works Update",
188
+ description:
189
+ "Update an existing works post on the A2HMarket platform. Requires the worksId of the post to update.",
190
+ parameters: Type.Object({
191
+ worksId: Type.String({ description: "The ID of the works post to update" }),
192
+ type: Type.Number({
193
+ description: "Post type: 2=demand post (需求帖), 3=service post (服务帖)",
194
+ }),
195
+ title: Type.String({ description: "Updated post title" }),
196
+ content: Type.String({ description: "Updated post content / detailed description" }),
197
+ expectedPrice: Type.Optional(
198
+ Type.String({ description: "Updated expected price text (e.g. '99' or '面议')" }),
199
+ ),
200
+ serviceMethod: Type.Optional(
201
+ Type.String({ description: "Updated service method: 'online' or 'offline'" }),
202
+ ),
203
+ }),
204
+ async execute(_toolCallId, params) {
205
+ const { worksId, type, title, content, expectedPrice, serviceMethod } = params as {
206
+ worksId: string;
207
+ type: number;
208
+ title: string;
209
+ content: string;
210
+ expectedPrice?: string;
211
+ serviceMethod?: string;
212
+ };
213
+
214
+ try {
215
+ const client = createApiClient();
216
+ const result = await worksPublish(client, {
217
+ worksId,
218
+ type: type as 2 | 3,
219
+ title,
220
+ content,
221
+ expectedPrice,
222
+ serviceMethod,
223
+ });
224
+
225
+ return {
226
+ content: [{ type: "text", text: `Works ${worksId} updated successfully.` }],
227
+ details: { ok: true, result },
228
+ };
229
+ } catch (err) {
230
+ const errMsg = String(err);
231
+ return {
232
+ content: [{ type: "text", text: `Update failed: ${errMsg}` }],
233
+ details: { ok: false, error: errMsg },
234
+ };
235
+ }
236
+ },
237
+ },
238
+ { name: "works_update" },
239
+ );
240
+ }