@yach.zhiyinlou.com/yach 2.13.3 → 2.13.4-beta.1

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.
@@ -8,14 +8,20 @@ export function resolveMessageBody(message) {
8
8
  if (message.msgtype === "audio" && message.audio_text) {
9
9
  return message.audio_text;
10
10
  }
11
- if (message.msgtype === "image" && message.image_recognize_code === 200 && message.image_text) {
12
- try {
13
- const parsed = JSON.parse(message.image_text);
14
- return parsed.map((p) => p.texts).join("\n");
15
- }
16
- catch {
17
- return "";
11
+ if (message.msgtype === "image") {
12
+ const imageUrl = message.content || "";
13
+ let ocrText = "";
14
+ if (message.image_recognize_code === 200 && message.image_text) {
15
+ try {
16
+ const parsed = JSON.parse(message.image_text);
17
+ ocrText = parsed.map((p) => p.texts).join("\n");
18
+ }
19
+ catch {
20
+ ocrText = "";
21
+ }
18
22
  }
23
+ const imageMd = imageUrl ? `![图片](${imageUrl})` : "";
24
+ return [imageMd, ocrText].filter(Boolean).join("\n\n");
19
25
  }
20
26
  const content = (message.content || "").replace(/<at id="([^"]+)"><\/at>/g, "@$1");
21
27
  return content;
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../../src/messaging/inbound/parse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../../src/messaging/inbound/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * yach_topic_list_post_comment_replies — 获取话题群帖子评论的回复列表
3
+ *
4
+ * 续拉某条一级评论下的二级/三级回复(评论列表中 child 只随附有限条)。
5
+ * 返回扁平回复数组,每条带 target 指向被回复对象。分页用 last_id/has_more。
6
+ *
7
+ * ## 参数
8
+ * - mid 帖子标识(必填,格式 doc_id-ctime)
9
+ * - cid 一级评论 ID(必填)
10
+ * - last_cid 回复分页游标(可选):首页留空;翻页传上一页响应的 last_id
11
+ *
12
+ * ## 权限
13
+ * 需 OAuth 授权(user_access_token)
14
+ * scope: squad:post:comment:reply:list
15
+ */
16
+ import { Type } from "@sinclair/typebox";
17
+ import { jsonResult } from "openclaw/plugin-sdk/agent-runtime";
18
+ import { createYachToolClient } from "../../core/tool-client.js";
19
+ import { handleInvokeErrorWithAutoAuth } from "../auto-auth.js";
20
+ function unixToReadableString(unixTime, timezone = "Asia/Shanghai") {
21
+ return new Date(unixTime * 1000).toLocaleString("zh-CN", { timeZone: timezone, hour12: false });
22
+ }
23
+ const ListPostCommentRepliesSchema = Type.Object({
24
+ mid: Type.String({
25
+ description: "帖子标识(必填,格式 doc_id-ctime,来自帖子列表的 mid)",
26
+ }),
27
+ cid: Type.String({
28
+ description: "一级评论 ID(必填,来自评论列表 list[].cid 或 child.list[].target.cid)",
29
+ }),
30
+ last_cid: Type.Optional(Type.String({
31
+ description: "回复分页游标(可选):首页留空;翻页传上一页响应的 last_id",
32
+ })),
33
+ });
34
+ export function createTopicListPostCommentRepliesTool() {
35
+ return {
36
+ name: "yach_topic_list_post_comment_replies",
37
+ label: "话题群帖子评论回复列表",
38
+ description: "获取指定一级评论下的二级/三级回复列表(分页)。用于续拉评论列表中 child 未取全的回复。" +
39
+ "返回扁平回复数组,每条带 target 指向被回复对象。mid+cid 必填;分页用响应 last_id 作为下一页 last_cid,reply_count=0 表示已拉完。" +
40
+ "以当前用户身份调用,需 OAuth 授权。",
41
+ parameters: ListPostCommentRepliesSchema,
42
+ execute: async (_toolCallId, rawParams) => {
43
+ const params = rawParams;
44
+ if (!params.mid || !params.cid) {
45
+ return jsonResult({ ok: false, error: "mid、cid 为必填" });
46
+ }
47
+ const client = createYachToolClient();
48
+ try {
49
+ const result = await client.invoke("yach_topic_list_post_comment_replies", (c) => c.topic.listPostCommentReplies({
50
+ mid: params.mid,
51
+ cid: params.cid,
52
+ lastCid: params.last_cid,
53
+ }), { as: "user" });
54
+ // 把每条回复的 ctime(秒级时间戳)转成可读时间
55
+ if (result?.list) {
56
+ result.list = result.list.map((reply) => ({
57
+ ...reply,
58
+ ctime_str: reply.ctime != null ? unixToReadableString(reply.ctime) : undefined,
59
+ }));
60
+ }
61
+ return jsonResult({ ok: true, ...result });
62
+ }
63
+ catch (err) {
64
+ return handleInvokeErrorWithAutoAuth(err, undefined, {
65
+ toolName: "yach_topic_list_post_comment_replies",
66
+ });
67
+ }
68
+ },
69
+ };
70
+ }
71
+ //# sourceMappingURL=list-post-comment-replies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-post-comment-replies.js","sourceRoot":"","sources":["../../../../src/tools/topic/list-post-comment-replies.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAEhE,SAAS,oBAAoB,CAAC,QAAgB,EAAE,QAAQ,GAAG,eAAe;IACxE,OAAO,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAClG,CAAC;AAED,MAAM,4BAA4B,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/C,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,sCAAsC;KACpD,CAAC;IACF,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,yDAAyD;KACvE,CAAC;IACF,QAAQ,EAAE,IAAI,CAAC,QAAQ,CACrB,IAAI,CAAC,MAAM,CAAC;QACV,WAAW,EAAE,mCAAmC;KACjD,CAAC,CACH;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,qCAAqC;IACnD,OAAO;QACL,IAAI,EAAE,sCAAsC;QAC5C,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,iDAAiD;YACjD,0FAA0F;YAC1F,uBAAuB;QACzB,UAAU,EAAE,4BAA4B;QACxC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE;YACxC,MAAM,MAAM,GAAG,SAId,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBAC/B,OAAO,UAAU,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAC;YAEtC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAChC,sCAAsC,EACtC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC;oBAC7B,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,OAAO,EAAE,MAAM,CAAC,QAAQ;iBACzB,CAAC,EACJ,EAAE,EAAE,EAAE,MAAM,EAAE,CACf,CAAC;gBAEF,4BAA4B;gBAC5B,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;oBACjB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC;wBAC7C,GAAG,KAAK;wBACR,SAAS,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;qBAC/E,CAAC,CAAC,CAAC;gBACN,CAAC;gBAED,OAAO,UAAU,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,6BAA6B,CAAC,GAAG,EAAE,SAAS,EAAE;oBACnD,QAAQ,EAAE,sCAAsC;iBACjD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * yach_topic_list_post_comments — 获取话题群帖子评论列表
3
+ *
4
+ * 按帖子标识拉取一级评论,每条一级评论在 child 中随附有限条二级回复(楼中楼)。
5
+ * 一级评论分页用 last_id;二级回复更多内容需用专门的回复列表接口按 child.last_id 翻页。
6
+ *
7
+ * ## 参数
8
+ * - mid 帖子标识(必填,来自帖子列表的 mid,格式 doc_id-ctime)
9
+ * - last_cid 一级评论分页游标(可选):首页留空;翻页传上一页响应的 last_id
10
+ * - reply_limit 每条一级评论随附的二级回复条数(可选,1-10,超界服务端自动截断)
11
+ *
12
+ * ## 权限
13
+ * 需 OAuth 授权(user_access_token)
14
+ * scope: squad:post:comment:list
15
+ */
16
+ import { Type } from "@sinclair/typebox";
17
+ import { jsonResult } from "openclaw/plugin-sdk/agent-runtime";
18
+ import { createYachToolClient } from "../../core/tool-client.js";
19
+ import { handleInvokeErrorWithAutoAuth } from "../auto-auth.js";
20
+ function unixToReadableString(unixTime, timezone = "Asia/Shanghai") {
21
+ return new Date(unixTime * 1000).toLocaleString("zh-CN", { timeZone: timezone, hour12: false });
22
+ }
23
+ /** 递归为每层评论的 ctime 补上可读时间字符串,避免模型误换算 */
24
+ function withReadableCtime(items) {
25
+ return (items ?? []).map((item) => ({
26
+ ...item,
27
+ ctime_str: item.ctime != null ? unixToReadableString(item.ctime) : undefined,
28
+ child: item.child
29
+ ? { ...item.child, list: withReadableCtime(item.child.list) }
30
+ : item.child,
31
+ }));
32
+ }
33
+ const ListPostCommentsSchema = Type.Object({
34
+ mid: Type.String({
35
+ description: "帖子标识(必填,来自帖子列表的 mid,格式 doc_id-ctime)",
36
+ }),
37
+ last_cid: Type.Optional(Type.String({
38
+ description: "一级评论分页游标(可选):首页留空;翻页传上一页响应的 last_id",
39
+ })),
40
+ reply_limit: Type.Optional(Type.Number({
41
+ description: "每条一级评论随附的二级回复条数,范围 1-10(可选,超界服务端自动截断到边界值)",
42
+ })),
43
+ });
44
+ export function createTopicListPostCommentsTool() {
45
+ return {
46
+ name: "yach_topic_list_post_comments",
47
+ label: "话题群帖子评论列表",
48
+ description: "获取指定帖子的评论列表(分页)。返回一级评论数组,每条一级评论在 child 中随附有限条二级回复(楼中楼)。" +
49
+ "一级评论分页用响应的 last_id 作为下一页 last_cid;二级回复更多内容需用专门的回复列表接口按 child.last_id 翻页。" +
50
+ "mid 来自帖子列表(yach_topic_list_posts 返回的 list[].mid)。以当前用户身份调用,需 OAuth 授权。",
51
+ parameters: ListPostCommentsSchema,
52
+ execute: async (_toolCallId, rawParams) => {
53
+ const params = rawParams;
54
+ if (!params.mid) {
55
+ return jsonResult({ ok: false, error: "mid 为必填" });
56
+ }
57
+ const client = createYachToolClient();
58
+ try {
59
+ const result = await client.invoke("yach_topic_list_post_comments", (c) => c.topic.listPostComments({
60
+ mid: params.mid,
61
+ lastCid: params.last_cid,
62
+ replyLimit: params.reply_limit,
63
+ }), { as: "user" });
64
+ // 递归把每层评论的 ctime(秒级时间戳)转成可读时间
65
+ if (result?.list) {
66
+ result.list = withReadableCtime(result.list);
67
+ }
68
+ return jsonResult({ ok: true, ...result });
69
+ }
70
+ catch (err) {
71
+ return handleInvokeErrorWithAutoAuth(err, undefined, {
72
+ toolName: "yach_topic_list_post_comments",
73
+ });
74
+ }
75
+ },
76
+ };
77
+ }
78
+ //# sourceMappingURL=list-post-comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-post-comments.js","sourceRoot":"","sources":["../../../../src/tools/topic/list-post-comments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * yach_topic_list_posts — 获取话题群帖子列表
3
+ *
4
+ * 分页拉取指定话题群的帖子。返回每个帖子的 doc_id、mid、发帖人、文本、
5
+ * 图片/视频/链接/标签、评论数等。mid 可用于进一步拉取帖子评论列表。
6
+ *
7
+ * ## 参数
8
+ * - squad_id 话题群ID(必填,即 publish_post 返回的 squadId)
9
+ * - page_size 每页条数,范围 1-50(可选,超界服务端自动截断)
10
+ * - last_doc_id 分页游标(可选):首页留空;翻页传上一页响应的 next_last_doc_id
11
+ *
12
+ * ## 权限
13
+ * 需 OAuth 授权(user_access_token)
14
+ */
15
+ import { Type } from "@sinclair/typebox";
16
+ import { jsonResult } from "openclaw/plugin-sdk/agent-runtime";
17
+ import { createYachToolClient } from "../../core/tool-client.js";
18
+ import { handleInvokeErrorWithAutoAuth } from "../auto-auth.js";
19
+ function unixToReadableString(unixTime, timezone = "Asia/Shanghai") {
20
+ return new Date(unixTime * 1000).toLocaleString("zh-CN", { timeZone: timezone, hour12: false });
21
+ }
22
+ const ListPostsSchema = Type.Object({
23
+ squad_id: Type.String({
24
+ description: "话题群ID(必填,即 publish_post 返回的 squadId)",
25
+ }),
26
+ page_size: Type.Optional(Type.Number({
27
+ description: "每页条数,范围 1-50(可选,超界服务端自动截断到边界值)",
28
+ })),
29
+ last_doc_id: Type.Optional(Type.String({
30
+ description: "分页游标(可选):首页留空;翻页传上一页响应的 next_last_doc_id",
31
+ })),
32
+ });
33
+ export function createTopicListPostsTool() {
34
+ return {
35
+ name: "yach_topic_list_posts",
36
+ label: "话题群帖子列表",
37
+ description: "获取指定话题群的帖子列表(分页)。返回每个帖子的 doc_id、mid、发帖人、文本、图片/视频/链接/标签、评论数等。" +
38
+ "mid 用于进一步拉取帖子评论列表。以当前用户身份调用,需 OAuth 授权。",
39
+ parameters: ListPostsSchema,
40
+ execute: async (_toolCallId, rawParams) => {
41
+ const params = rawParams;
42
+ if (!params.squad_id) {
43
+ return jsonResult({ ok: false, error: "squad_id 为必填" });
44
+ }
45
+ const client = createYachToolClient();
46
+ try {
47
+ const result = await client.invoke("yach_topic_list_posts", (c) => c.topic.listPosts({
48
+ squadId: params.squad_id,
49
+ pageSize: params.page_size,
50
+ lastDocId: params.last_doc_id,
51
+ }), { as: "user" });
52
+ // 把 ctime(秒级时间戳)转成可读时间,避免模型误换算
53
+ if (result?.list) {
54
+ result.list = result.list.map((post) => ({
55
+ ...post,
56
+ ctime_str: post.ctime != null ? unixToReadableString(post.ctime) : undefined,
57
+ }));
58
+ }
59
+ return jsonResult({ ok: true, ...result });
60
+ }
61
+ catch (err) {
62
+ return handleInvokeErrorWithAutoAuth(err, undefined, { toolName: "yach_topic_list_posts" });
63
+ }
64
+ },
65
+ };
66
+ }
67
+ //# sourceMappingURL=list-posts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-posts.js","sourceRoot":"","sources":["../../../../src/tools/topic/list-posts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAEhE,SAAS,oBAAoB,CAAC,QAAgB,EAAE,QAAQ,GAAG,eAAe;IACxE,OAAO,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAClG,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC;IAClC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,sCAAsC;KACpD,CAAC;IACF,SAAS,EAAE,IAAI,CAAC,QAAQ,CACtB,IAAI,CAAC,MAAM,CAAC;QACV,WAAW,EAAE,gCAAgC;KAC9C,CAAC,CACH;IACD,WAAW,EAAE,IAAI,CAAC,QAAQ,CACxB,IAAI,CAAC,MAAM,CAAC;QACV,WAAW,EAAE,0CAA0C;KACxD,CAAC,CACH;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,SAAS;QAChB,WAAW,EACT,8DAA8D;YAC9D,yCAAyC;QAC3C,UAAU,EAAE,eAAe;QAC3B,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE;YACxC,MAAM,MAAM,GAAG,SAId,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACrB,OAAO,UAAU,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAC;YAEtC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAChC,uBAAuB,EACvB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;oBAChB,OAAO,EAAE,MAAM,CAAC,QAAQ;oBACxB,QAAQ,EAAE,MAAM,CAAC,SAAS;oBAC1B,SAAS,EAAE,MAAM,CAAC,WAAW;iBAC9B,CAAC,EACJ,EAAE,EAAE,EAAE,MAAM,EAAE,CACf,CAAC;gBAEF,+BAA+B;gBAC/B,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;oBACjB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;wBAC5C,GAAG,IAAI;wBACP,SAAS,EACP,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;qBACpE,CAAC,CAAC,CAAC;gBACN,CAAC;gBAED,OAAO,UAAU,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,6BAA6B,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,uBAAuB,EAAE,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yach.zhiyinlou.com/yach",
3
- "version": "2.13.3",
3
+ "version": "2.13.4-beta.1",
4
4
  "description": "OpenClaw Yach (知音楼) channel plugin",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -64,7 +64,7 @@
64
64
  "order": 80
65
65
  },
66
66
  "install": {
67
- "npmSpec": "@yach.zhiyinlou.com/yach@2.13.3",
67
+ "npmSpec": "@yach.zhiyinlou.com/yach@2.13.4-beta.1",
68
68
  "defaultChoice": "npm",
69
69
  "minHostVersion": ">=2026.3.22"
70
70
  }