@napuketto/adapter 0.0.21 → 0.0.22

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.
@@ -1,6 +1,6 @@
1
1
  import { i as ProtocolConfig, n as BaseProtocolAdapter, s as ActionRegistry, u as ErrorCodeMap } from "../index-CDKj-jus.mjs";
2
2
  import "../gray-tip-CcpfI1Og.mjs";
3
- import { BuddyEventChannel, CanonicalElement, ChatType, FriendApi, GroupApi, GroupCache, GroupEventChannel, GroupNotifyApi, MsgApi, MsgEventChannel, Peer, ProfileApi, ProfileLikeApi, RichMediaApi, TicketApi, WebApi } from "@napuketto/kernel";
3
+ import { BuddyCacheEventChannel, BuddyEventChannel, CanonicalElement, ChatType, FriendApi, GroupApi, GroupCache, GroupEventChannel, GroupNotifyApi, MsgApi, MsgEventChannel, Peer, ProfileApi, ProfileLikeApi, RichMediaApi, TicketApi, WebApi } from "@napuketto/kernel";
4
4
  import { z } from "zod";
5
5
  import { EventBroadcaster, TransportAdapter } from "@napuketto/network";
6
6
  //#region src/onebot11/helper/message-unique.d.ts
@@ -182,6 +182,11 @@ type OB11MessageSegment = {
182
182
  file: string;
183
183
  url?: string;
184
184
  };
185
+ } | {
186
+ type: "file";
187
+ data: {
188
+ file: string;
189
+ };
185
190
  } | {
186
191
  type: "reply";
187
192
  data: {
@@ -650,6 +655,7 @@ declare const ob11ConfigSchema: z.ZodObject<{
650
655
  array: "array";
651
656
  string: "string";
652
657
  }>>;
658
+ groupUploadAsNotice: z.ZodDefault<z.ZodBoolean>;
653
659
  httpServers: z.ZodDefault<z.ZodArray<z.ZodObject<{
654
660
  enabled: z.ZodDefault<z.ZodBoolean>;
655
661
  host: z.ZodDefault<z.ZodString>;
@@ -712,6 +718,8 @@ interface OneBot11AdapterOptions extends OneBotApiOptions {
712
718
  groupChannel?: GroupEventChannel;
713
719
  /** kernel 好友事件通道(可选:Buddy/onBuddyReqChange → OB11 request 源)。 */
714
720
  friendChannel?: BuddyEventChannel;
721
+ /** 好友缓存 diff 通道(可选:BuddyCache/onBuddyAdded → OB11 friend_add 源,B2)。 */
722
+ buddyCacheEvents?: BuddyCacheEventChannel;
715
723
  /** 校准日志(可选:未知事件形状 raw JSON;IPC 模式传 loader pino 实例)。 */
716
724
  logger?: AdapterLoggerLike;
717
725
  }
@@ -721,6 +729,7 @@ declare class NapukettoOneBot11Adapter extends BaseProtocolAdapter<OB11Config> {
721
729
  private readonly msgChannel;
722
730
  private readonly groupChannel;
723
731
  private readonly friendChannel;
732
+ private readonly buddyCacheEvents;
724
733
  private readonly calibLogger;
725
734
  private readonly selfUin;
726
735
  private readonly oneBotApi;
@@ -731,6 +740,8 @@ declare class NapukettoOneBot11Adapter extends BaseProtocolAdapter<OB11Config> {
731
740
  private heartbeatTimer;
732
741
  private reportSelfMessage;
733
742
  private messageFormat;
743
+ /** 群文件报形式(B4):true = fileElement 群消息报 group_upload notice 替代 message。 */
744
+ private groupUploadAsNotice;
734
745
  /** IPC 桥模式标记(subscribeOnly 启动;reload 时跳过传输重建)。 */
735
746
  private subscribedOnly;
736
747
  constructor(opts: OneBot11AdapterOptions);
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/onebot11/helper/message-unique.ts","../../src/onebot11/api/one-bot-api.ts","../../src/onebot11/action/error-map.ts","../../src/onebot11/action/group/get-group-at-all-remain.ts","../../src/onebot11/types/index.ts","../../src/onebot11/event/base.ts","../../src/onebot11/event/message.ts","../../src/onebot11/event/meta.ts","../../src/onebot11/event/notice.ts","../../src/onebot11/event/request.ts","../../src/onebot11/event/index.ts","../../src/onebot11/action/index.ts","../../src/onebot11/helper/codec/cqcode.ts","../../src/onebot11/helper/codec/segment.ts","../../src/onebot11/helper/config.ts","../../src/onebot11/helper/data.ts","../../src/onebot11/adapter.ts","../../src/onebot11/transport.ts"],"mappings":";;;;;;cAkBa;;mBAEQ;;mBAEA;;mBAEA;;UAET;;mBAES;;;;;EAMjB,MAAM,eAAe,OAAO;;EAmB5B,SAAS;;EAKT,aAAa;;EAKb,QAAQ,gBAAgB;;EAKxB,QAAQ;;UAYA;;;;;UCvDK;;EAEb;;EAEA,mBAAmB;;EAEnB;;EAEA;;EAEA,aAAa;;EAEb,gBAAgB;;;UAIH;EACb,QAAQ;EACR,UAAU;EACV,gBAAgB;EAChB,WAAW;EACX,WAAW;EACX,cAAc;EACd,YAAY;EACZ,gBAAgB;EAChB,QAAQ;;EAER;IAAQ;IAAa;;;EAErB,QAAQ;;EAER,aAAa;;;;;;cAOJ;;WAEA,QAAQ;;WAER,UAAU;;WAEV,gBAAgB;;WAEhB,WAAW;;WAEX,WAAW;;WAEX,cAAc;;WAEd,YAAY;;WAEZ,gBAAgB;;WAEhB,QAAQ;;WAER,YAAY;;WAEZ,eAAe;;WAEf;IAAQ;IAAa;;;WAErB;;WAEA;;WAEA,mBAAmB;;WAEnB;;WAEA;;WAEA,aAAa;;WAEb,gBAAgB;EAEzB,YAAY,MAAM;;EAuBlB,SAAS,iBAAiB,QAAQ;;EAKlC,SAAS,iBAAiB,QAAQ;;;;;cCzHzB,kBAAkB;;;;UCMd;EACb;EACA;EACA;;;;;;;;;UCba,WAAW;EACxB;EACA;EACA,MAAM;EACN;EACA;;;KAIQ;EACJ;EAAc;IAAQ;;;EACtB;EAAY;IAAQ;IAAY;;;EAChC;EAAc;IAAQ;;;EACtB;EAAe;IAAQ;IAAc;;;EACrC;EAAgB;IAAQ;IAAc;;;EACtC;EAAe;IAAQ;IAAc;;;EACrC;EAAe;IAAQ;;;EACvB;EAAiB;IAAQ;;;EACzB;EAAc;IAAQ;;;EACtB;EAAa;IAAQ;;;EACrB;EAAgB;IAAQ;;;;KAGpB,uBAAuB;;UAGlB;EACb;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;EACA;;;UAIa;EACb;EACA;;;UAIa;EACb;EACA;EACA;EACA;IACI;IACA;IACA;IACA;;EAEJ;EACA,SAAS;EACT;EACA;EACA;;;KAIQ;;UAGK;EACb;EACA;EACA;EACA;EACA,MAAM;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa;EACb;EACA;EACA,MAAM;EACN;;EAEA;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa;EACb;EACA,oBAAoB;EACpB,gBAAgB;EAChB,gBAAgB;EAChB,aAAa;EACb,oBAAoB;EACpB,cAAc;;;UAID;EACb;EACA;EACA;;EAEA;EACA;EACA;EACA,eAAe;EACf,gBAAgB;EAChB;;;;;;;;;;;;KCrJQ;;UAGK;;EAEb;;EAEA;;EAEA,WAAW;;;;;UCPE;EACb;EACA;EACA;;;UAIa,oBAAoB;EACjC;EACA;;;UAIa,8BAA8B;EAC3C;EACA;;EAEA;EACA;EACA;EACA;EACA,SAAS;EACT;EACA;EACA,QAAQ;EACR,YAAY;;;UAIC,gCAAgC;EAC7C;EACA;;EAEA;EACA;EACA;EACA,SAAS;EACT;EACA;EACA,QAAQ;;EAER;;;KAIQ,mBAAmB,wBAAwB;;;;UC9CtC;EACb;EACA;GACC;;;UAIY,+BAA+B;EAC5C;EACA;EACA;;;UAIa,+BAA+B;EAC5C;EACA;;EAEA;EACA,QAAQ;;;KAIA,gBAAgB,yBAAyB;;;;UCvBpC;EACb;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa,mCAAmC;EAChD;EACA;EACA;EACA;EACA,MAAM;;;UAIO,kCAAkC;EAC/C;EACA;EACA;EACA;EACA;;;UAIa,qCAAqC;EAClD;EACA;EACA;EACA;EACA;EACA;;;UAIa,qCAAqC;EAClD;EACA;EACA;EACA;EACA;EACA;;;UAIa,gCAAgC;EAC7C;EACA;EACA;EACA;EACA;EACA;;EAEA;;;UAIa,iCAAiC;EAC9C;EACA;EACA;;;UAIa,mCAAmC;EAChD;EACA;EACA;EACA;EACA;EACA;;;UAIa,oCAAoC;EACjD;EACA;EACA;EACA;;;UAIa,iCAAiC;EAC9C;EACA;EACA;EACA;EACA;EACA;;;UAIa,oCAAoC;EACjD;EACA;EACA;EACA;EACA;EACA;EACA;;;UAIa,8BAA8B;EAC3C;EACA;EACA;EACA;EACA;EACA;;EAEA;;;UAIa,mCAAmC;EAChD;EACA;EACA;EACA,MAAM;;;UAIO,iCAAiC;EAC9C;EACA;EACA;EACA;;;UAIa,oCAAoC;EACjD;EACA;EACA;EACA;EACA;EACA,OAAO;;;UAIM,kCAAkC;EAC/C;EACA;EACA;EACA;EACA;;;KAIQ,kBACN,6BACA,4BACA,+BACA,+BACA,0BACA,2BACA,6BACA,8BACA,2BACA,8BACA,wBACA,6BACA,2BACA,8BACA;;;;UCpLW,+BAA+B;EAC5C;EACA;EACA;;EAEA;;EAEA;;;UAIa,8BAA8B;EAC3C;EACA;;EAEA;EACA;EACA;EACA;EACA;;;KAIQ,mBAAmB,yBAAyB;;;;KCiB5C,YAAY,mBAAoB,kBAAmB,mBAAoB;;;;UCyDlE;;EAEb,KAAK;;;iBAIO,yBAAyB,MAAM,iBAAiB;;;;;;;;;;;;;;UC9E/C;EACb;EACA,QAAQ;;;iBAII,aAAa;;iBAKb,cAAc;;iBAKd,eAAe;;iBASf,aACZ,cACA,QAAQ;;iBAeI,eAAe,eAAe,eAAe;;iBAkB7C,iBAAiB,OAAO,eAAe;;;;iBC4GvC,oBAAoB,UAAU;;;;cC9IjC,kBAAgB,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiB3B,EAAA,KAAA;;KAGU,aAAa,EAAE,aAAa;;;;iBCzDxB,oBAAoB,UAAU,qBAAqB;;iBAYnD,oBAAoB,UAAU,uBAAuB;;iBAoIrD,oBAAoB,eAAe;;iBAkBnC,qBAAqB,UAAU;;iBAK/B,qBAAqB,eAAe;;;;UChJnC;EACb,KAAK,cAAc;EACnB,KAAK,cAAc;;;UAIN,+BAA+B;;EAE5C,QAAQ,eAAe;;EAEvB,aAAa;;EAEb,YAAY;;EAEZ,eAAe;;EAEf,gBAAgB;;EAEhB,SAAS;;;cAIA,iCAAiC,oBAAoB;WACrD;mBAEQ;mBACA;mBACA;mBACA;mBACA;mBACA;;WAER,UAAU;UACX;UACA;UACA;UACA;UACA;;UAEA;EAER,YAAY,MAAM;;;;;UAuBJ;;UAWA;;UAwCN;;UAiBM;;UAaN;;;;;;EAsEF,iBAAiB;;EASvB;;;;;;UAUc;;UA2BA;;UAiBA;;UA4BA;;UAiBN;;;;;EAWF,cAAc,cAAc,UAAU,wBAAwB;;;;;UC9TvD;;EAEb,SAAS;;EAET,YAAY;;EAEZ,aAAa;;;UAIA;;EAEb,QAAQ;;EAER,aAAa;;EAEb,gBAAgB,cAAc,UAAU;;EAExC;;;iBAiBY,uBAAuB,MAAM,gCAAgC"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/onebot11/helper/message-unique.ts","../../src/onebot11/api/one-bot-api.ts","../../src/onebot11/action/error-map.ts","../../src/onebot11/action/group/get-group-at-all-remain.ts","../../src/onebot11/types/index.ts","../../src/onebot11/event/base.ts","../../src/onebot11/event/message.ts","../../src/onebot11/event/meta.ts","../../src/onebot11/event/notice.ts","../../src/onebot11/event/request.ts","../../src/onebot11/event/index.ts","../../src/onebot11/action/index.ts","../../src/onebot11/helper/codec/cqcode.ts","../../src/onebot11/helper/codec/segment.ts","../../src/onebot11/helper/config.ts","../../src/onebot11/helper/data.ts","../../src/onebot11/adapter.ts","../../src/onebot11/transport.ts"],"mappings":";;;;;;cAkBa;;mBAEQ;;mBAEA;;mBAEA;;UAET;;mBAES;;;;;EAMjB,MAAM,eAAe,OAAO;;EAmB5B,SAAS;;EAKT,aAAa;;EAKb,QAAQ,gBAAgB;;EAKxB,QAAQ;;UAYA;;;;;UCvDK;;EAEb;;EAEA,mBAAmB;;EAEnB;;EAEA;;EAEA,aAAa;;EAEb,gBAAgB;;;UAIH;EACb,QAAQ;EACR,UAAU;EACV,gBAAgB;EAChB,WAAW;EACX,WAAW;EACX,cAAc;EACd,YAAY;EACZ,gBAAgB;EAChB,QAAQ;;EAER;IAAQ;IAAa;;;EAErB,QAAQ;;EAER,aAAa;;;;;;cAOJ;;WAEA,QAAQ;;WAER,UAAU;;WAEV,gBAAgB;;WAEhB,WAAW;;WAEX,WAAW;;WAEX,cAAc;;WAEd,YAAY;;WAEZ,gBAAgB;;WAEhB,QAAQ;;WAER,YAAY;;WAEZ,eAAe;;WAEf;IAAQ;IAAa;;;WAErB;;WAEA;;WAEA,mBAAmB;;WAEnB;;WAEA;;WAEA,aAAa;;WAEb,gBAAgB;EAEzB,YAAY,MAAM;;EAuBlB,SAAS,iBAAiB,QAAQ;;EAKlC,SAAS,iBAAiB,QAAQ;;;;;cCzHzB,kBAAkB;;;;UCMd;EACb;EACA;EACA;;;;;;;;;UCba,WAAW;EACxB;EACA;EACA,MAAM;EACN;EACA;;;KAIQ;EACJ;EAAc;IAAQ;;;EACtB;EAAY;IAAQ;IAAY;;;EAChC;EAAc;IAAQ;;;EACtB;EAAe;IAAQ;IAAc;;;EACrC;EAAgB;IAAQ;IAAc;;;EACtC;EAAe;IAAQ;IAAc;;;EACrC;EAAc;IAAQ;;;EACtB;EAAe;IAAQ;;;EACvB;EAAiB;IAAQ;;;EACzB;EAAc;IAAQ;;;EACtB;EAAa;IAAQ;;;EACrB;EAAgB;IAAQ;;;;KAGpB,uBAAuB;;UAGlB;EACb;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;EACA;;;UAIa;EACb;EACA;;;UAIa;EACb;EACA;EACA;EACA;IACI;IACA;IACA;IACA;;EAEJ;EACA,SAAS;EACT;EACA;EACA;;;KAIQ;;UAGK;EACb;EACA;EACA;EACA;EACA,MAAM;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa;EACb;EACA;EACA,MAAM;EACN;;EAEA;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa;EACb;EACA,oBAAoB;EACpB,gBAAgB;EAChB,gBAAgB;EAChB,aAAa;EACb,oBAAoB;EACpB,cAAc;;;UAID;EACb;EACA;EACA;;EAEA;EACA;EACA;EACA,eAAe;EACf,gBAAgB;EAChB;;;;;;;;;;;;KCtJQ;;UAGK;;EAEb;;EAEA;;EAEA,WAAW;;;;;UCPE;EACb;EACA;EACA;;;UAIa,oBAAoB;EACjC;EACA;;;UAIa,8BAA8B;EAC3C;EACA;;EAEA;EACA;EACA;EACA;EACA,SAAS;EACT;EACA;EACA,QAAQ;EACR,YAAY;;;UAIC,gCAAgC;EAC7C;EACA;;EAEA;EACA;EACA;EACA,SAAS;EACT;EACA;EACA,QAAQ;;EAER;;;KAIQ,mBAAmB,wBAAwB;;;;UC9CtC;EACb;EACA;GACC;;;UAIY,+BAA+B;EAC5C;EACA;EACA;;;UAIa,+BAA+B;EAC5C;EACA;;EAEA;EACA,QAAQ;;;KAIA,gBAAgB,yBAAyB;;;;UCvBpC;EACb;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa,mCAAmC;EAChD;EACA;EACA;EACA;EACA,MAAM;;;UAIO,kCAAkC;EAC/C;EACA;EACA;EACA;EACA;;;UAIa,qCAAqC;EAClD;EACA;EACA;EACA;EACA;EACA;;;UAIa,qCAAqC;EAClD;EACA;EACA;EACA;EACA;EACA;;;UAIa,gCAAgC;EAC7C;EACA;EACA;EACA;EACA;EACA;;EAEA;;;UAIa,iCAAiC;EAC9C;EACA;EACA;;;UAIa,mCAAmC;EAChD;EACA;EACA;EACA;EACA;EACA;;;UAIa,oCAAoC;EACjD;EACA;EACA;EACA;;;UAIa,iCAAiC;EAC9C;EACA;EACA;EACA;EACA;EACA;;;UAIa,oCAAoC;EACjD;EACA;EACA;EACA;EACA;EACA;EACA;;;UAIa,8BAA8B;EAC3C;EACA;EACA;EACA;EACA;EACA;;EAEA;;;UAIa,mCAAmC;EAChD;EACA;EACA;EACA,MAAM;;;UAIO,iCAAiC;EAC9C;EACA;EACA;EACA;;;UAIa,oCAAoC;EACjD;EACA;EACA;EACA;EACA;EACA,OAAO;;;UAIM,kCAAkC;EAC/C;EACA;EACA;EACA;EACA;;;KAIQ,kBACN,6BACA,4BACA,+BACA,+BACA,0BACA,2BACA,6BACA,8BACA,2BACA,8BACA,wBACA,6BACA,2BACA,8BACA;;;;UCpLW,+BAA+B;EAC5C;EACA;EACA;;EAEA;;EAEA;;;UAIa,8BAA8B;EAC3C;EACA;;EAEA;EACA;EACA;EACA;EACA;;;KAIQ,mBAAmB,yBAAyB;;;;KCiB5C,YAAY,mBAAoB,kBAAmB,mBAAoB;;;;UCyDlE;;EAEb,KAAK;;;iBAIO,yBAAyB,MAAM,iBAAiB;;;;;;;;;;;;;;UC9E/C;EACb;EACA,QAAQ;;;iBAII,aAAa;;iBAKb,cAAc;;iBAKd,eAAe;;iBASf,aACZ,cACA,QAAQ;;iBAeI,eAAe,eAAe,eAAe;;iBAkB7C,iBAAiB,OAAO,eAAe;;;;iBCsHvC,oBAAoB,UAAU;;;;cCxJjC,kBAAgB,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuB3B,EAAA,KAAA;;KAGU,aAAa,EAAE,aAAa;;;;iBC/DxB,oBAAoB,UAAU,qBAAqB;;iBAYnD,oBAAoB,UAAU,uBAAuB;;iBAoIrD,oBAAoB,eAAe;;iBAkBnC,qBAAqB,UAAU;;iBAK/B,qBAAqB,eAAe;;;;UCxInC;EACb,KAAK,cAAc;EACnB,KAAK,cAAc;;;UAIN,+BAA+B;;EAE5C,QAAQ,eAAe;;EAEvB,aAAa;;EAEb,YAAY;;EAEZ,eAAe;;EAEf,gBAAgB;;EAEhB,mBAAmB;;EAEnB,SAAS;;;cAIA,iCAAiC,oBAAoB;WACrD;mBAEQ;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;;WAER,UAAU;UACX;UACA;UACA;UACA;UACA;;UAEA;;UAEA;EAER,YAAY,MAAM;;;;;UAwBJ;;UAYA;;UAyCN;;UAiBM;;UAaN;;;;;;EA6FF,iBAAiB;;EAUvB;;;;;;UAUc;;UA2BA;;UAiBA;;UA4BA;;UAiBN;;;;;EAWF,cAAc,cAAc,UAAU,wBAAwB;;;;;UCtWvD;;EAEb,SAAS;;EAET,YAAY;;EAEZ,aAAa;;;UAIA;;EAEb,QAAQ;;EAER,aAAa;;EAEb,gBAAgB,cAAc,UAAU;;EAExC;;;iBAiBY,uBAAuB,MAAM,gCAAgC"}
@@ -1536,6 +1536,10 @@ const CANONICAL_TO_SEGMENT = {
1536
1536
  type: "video",
1537
1537
  data: mediaData(el.path, el.url)
1538
1538
  }),
1539
+ file: (el) => ({
1540
+ type: "file",
1541
+ data: { file: el.name ?? el.path }
1542
+ }),
1539
1543
  reply: (el) => ({
1540
1544
  type: "reply",
1541
1545
  data: { id: el.messageId }
@@ -1626,6 +1630,10 @@ const CQ_SEGMENT_BUILDERS = {
1626
1630
  type: "video",
1627
1631
  data: mediaData(params["file"] ?? "", params["url"])
1628
1632
  }),
1633
+ file: (params) => ({
1634
+ type: "file",
1635
+ data: { file: params["file"] ?? "" }
1636
+ }),
1629
1637
  reply: (params) => ({
1630
1638
  type: "reply",
1631
1639
  data: { id: params["id"] ?? "" }
@@ -1721,6 +1729,12 @@ const ob11ConfigSchema = z.object({
1721
1729
  reportSelfMessage: z.boolean().default(false),
1722
1730
  /** 消息内容格式:array = 消息段数组(标准),string = CQ 码字符串。 */
1723
1731
  messagePostFormat: z.enum(MESSAGE_FORMATS).default("array"),
1732
+ /**
1733
+ * 群文件报形式(B4,2026-09-08):false(缺省)= message 事件 + file 段
1734
+ * (go-cqhttp 兼容;此前 file 元素被静默丢弃,本版本起透出);true = 含
1735
+ * fileElement 的群消息改报 group_upload notice 事件(替代 message 事件)。
1736
+ */
1737
+ groupUploadAsNotice: z.boolean().default(false),
1724
1738
  /** HTTP 反向服务器列表。 */
1725
1739
  httpServers: z.array(httpServerSchema).default([]),
1726
1740
  /** HTTP 正向上报列表。 */
@@ -1886,27 +1900,14 @@ function toOb11MessageInfo(msg, unique, ctx = {}) {
1886
1900
  }
1887
1901
  //#endregion
1888
1902
  //#region src/onebot11/helper/notice.ts
1889
- /**
1890
- * OB11 notice 事件翻译(P2-7,2026-08-05;2026-09-08 T4 补全)
1891
- *
1892
- * NT QQ 中群成员变动/撤回等系统事件通过**消息的灰色提示元素(grayTip)**广播。
1893
- * 本模块把 RawMessage 里的 grayTip 翻译为 OB11 notice 事件(纯函数,ADR-008)。
1894
- *
1895
- * 支持:
1896
- * - group_recall(群撤回,grayTip.subElementType=REVOKE + chatType=GROUP)
1897
- * - friend_recall(好友撤回,REVOKE + chatType=C2C,2026-09-08)
1898
- * - group_increase / group_decrease(群成员变动,subElementType=GROUP + TipGroupElement.type)
1899
- * - group_admin(管理员变更,TipGroupElement.type=BLOCK/UNBLOCK 的 role 语义)
1900
- * - group_ban(禁言,TipGroupElement.type=SHUT_UP)
1901
- * - notify.poke(戳一戳,aioOpGrayTipElement;⚠️ 待真实 poke 事件验证,2026-09-08)
1902
- *
1903
- * 未知/未翻译的 grayTip 子类型(JSON/BUDDY/ESSENCE/GROUP_NOTIFY 等)打 raw JSON
1904
- * 日志(ctx.logger 可选)——为后续真实事件校准积累数据。
1905
- *
1906
- * user_id/operator_id 都是 uin:接收 uidToUin Map(调用方批量转换后传入,保持纯函数)。
1907
- */
1908
1903
  /** 毫秒 → 秒(Unix 时间戳)。 */
1909
1904
  const MS_TO_SEC$3 = 1e3;
1905
+ /** 群文件业务类型(group_upload 的 file.busid,与 kernel 群文件系列同源语义)。 */
1906
+ const GROUP_FILE_BUS_ID = 102;
1907
+ /** 检查消息是否含文件元素(group_upload 开关分支判定)。 */
1908
+ function hasFileElement(msg) {
1909
+ return msg.elements.some((el) => el.fileElement !== void 0);
1910
+ }
1910
1911
  /** 检查消息是否含可翻译的 grayTip 元素。 */
1911
1912
  function hasGrayTip(msg) {
1912
1913
  return msg.elements.some((el) => el.grayTipElement !== void 0);
@@ -2045,6 +2046,45 @@ function toBan(common, grp, ctx) {
2045
2046
  duration: Number(shutUp?.duration ?? 0)
2046
2047
  };
2047
2048
  }
2049
+ /**
2050
+ * 好友添加(friend_add,B2,2026-09-08)。
2051
+ * 数据源 = kernel BuddyCache 快照 diff(Buddy/onBuddyListChange 全量快照对比,
2052
+ * 首帧 baseline 不发)——非 grayTip 路径。user_id 取 coreInfo.uin(顶层 uin 兜底)。
2053
+ */
2054
+ function toFriendAdd(entry, selfUin) {
2055
+ const uin = entry.coreInfo?.uin ?? entry.uin ?? "";
2056
+ return {
2057
+ time: Math.floor(Date.now() / MS_TO_SEC$3),
2058
+ self_id: Number(selfUin),
2059
+ post_type: "notice",
2060
+ notice_type: "friend_add",
2061
+ user_id: Number(uin)
2062
+ };
2063
+ }
2064
+ /**
2065
+ * 群文件上传(group_upload,B4,2026-09-08)。
2066
+ * 数据源 = 含 fileElement 的群消息(开关 groupUploadAsNotice=true 时替代
2067
+ * message 事件报出)。file.id 取 fileUuid(缺省文件名)、size 取 fileSize、
2068
+ * busid 固定 102(群文件业务类型,与 kernel GROUP_FILE_BIZ_TYPE 同源语义)。
2069
+ */
2070
+ function toGroupUpload(msg, selfUin) {
2071
+ const file = msg.elements.find((e) => e.fileElement !== void 0)?.fileElement;
2072
+ if (file === void 0) return null;
2073
+ return {
2074
+ time: Math.floor(Number(msg.msgTime) / MS_TO_SEC$3),
2075
+ self_id: Number(selfUin),
2076
+ post_type: "notice",
2077
+ notice_type: "group_upload",
2078
+ group_id: Number(msg.peerUid),
2079
+ user_id: Number(msg.senderUin),
2080
+ file: {
2081
+ id: file.fileUuid ?? file.fileName ?? "",
2082
+ name: file.fileName ?? "",
2083
+ size: Number(file.fileSize ?? 0),
2084
+ busid: GROUP_FILE_BUS_ID
2085
+ }
2086
+ };
2087
+ }
2048
2088
  /** 单个 grayTip 元素 → notice 事件(null = 不可翻译;未知子类型打 raw 日志)。 */
2049
2089
  function translateGrayTip(msg, g, ctx) {
2050
2090
  const subType = g.subElementType;
@@ -2293,16 +2333,17 @@ var GetGroupMsgHistoryAction = class extends BaseAction {
2293
2333
  //#endregion
2294
2334
  //#region src/onebot11/action/message/get-media.ts
2295
2335
  /**
2296
- * get_image / get_record 动作:获取图片/语音文件(P2-14;2026-09-08 T5 接主动下载)
2336
+ * get_image / get_record 动作:获取图片/语音文件(P2-14;2026-09-08 T5 接主动下载;
2337
+ * 2026-09-08 B1 语音接原生 downloadRichMedia)
2297
2338
  *
2298
2339
  * message_id 反查 → fetchMsgsByMsgId → 找 PIC/PTT 元素:
2299
2340
  * - 本地文件解析:NT 相对路径(sourcePath/filePath)按 mediaBaseDir(QQ NT
2300
2341
  * global 目录)解析为绝对路径,命中磁盘即返回 file
2301
2342
  * - 图片主动下载:本地未命中且有 picUrl → @napuketto/media downloadUrl 落
2302
2343
  * cacheDir/media/,返回 file(绝对路径)+ url + file_size/file_name
2303
- * - 语音下载缺口:原生 downloadRichMedia 签名未探测(wrapper 字符串证据仅
2304
- * 方法名),本地未命中时返回原始 filePath(NT 相对)+ 元数据,待 T10 diag
2305
- * 实测后接入
2344
+ * - 语音主动下载(B1):本地未命中 → kernel MsgApi.downloadPtt(原生
2345
+ * downloadRichMedia + 轮询元素回查)→ filePath 落盘后返回绝对路径;
2346
+ * 失败回退原始 filePath(NT 相对/绝对)+ 元数据,不抛错
2306
2347
  */
2307
2348
  const getMediaSchema = z.object({
2308
2349
  /** CQ 码 file 字段或 message_id(简化:message_id 反查)。 */
@@ -2390,7 +2431,7 @@ var GetImageAction = class extends BaseAction {
2390
2431
  return base;
2391
2432
  }
2392
2433
  };
2393
- /** 获取语音信息(本地文件解析;主动下载缺口见文件头注释)。 */
2434
+ /** 获取语音信息(本地优先;未命中走原生 downloadRichMedia,失败回退原始路径)。 */
2394
2435
  var GetRecordAction = class extends BaseAction {
2395
2436
  name = "get_record";
2396
2437
  schema = getMediaSchema;
@@ -2401,15 +2442,37 @@ var GetRecordAction = class extends BaseAction {
2401
2442
  this.deps = deps;
2402
2443
  }
2403
2444
  async _handle(payload) {
2404
- return await resolveMedia(takeId(payload, "get_record"), "语音", this.deps, (el) => {
2405
- const ptt = el.pttElement;
2406
- if (ptt === void 0 || ptt.filePath === void 0) return;
2407
- const out = {};
2408
- if (ptt.fileSize !== void 0) out.file_size = ptt.fileSize;
2409
- if (ptt.fileName !== void 0) out.file_name = ptt.fileName;
2410
- out.file = resolveLocalMediaFile(ptt.filePath, this.deps) ?? ptt.filePath;
2411
- return out;
2445
+ const id = takeId(payload, "get_record");
2446
+ const { msgId, peer } = resolveMsgIdAndPeer(id, this.deps.messageUnique);
2447
+ const [first] = await this.deps.msgApi.fetchMsgsByMsgId(peer, [msgId]);
2448
+ if (first === void 0) throw kernelError(`消息 ${id} 不存在或已被撤回`, "NOT_FOUND");
2449
+ const ptt = first.elements.find((e) => e.pttElement !== void 0)?.pttElement;
2450
+ if (ptt === void 0 || ptt.filePath === void 0) throw kernelError(`消息 ${id} 不包含语音`, "NOT_FOUND");
2451
+ const meta = () => ({
2452
+ ...ptt.fileSize !== void 0 ? { file_size: ptt.fileSize } : {},
2453
+ ...ptt.fileName !== void 0 ? { file_name: ptt.fileName } : {}
2412
2454
  });
2455
+ const local = resolveLocalMediaFile(ptt.filePath, this.deps);
2456
+ if (local !== null) return {
2457
+ ...meta(),
2458
+ file: local
2459
+ };
2460
+ try {
2461
+ const downloaded = await this.deps.msgApi.downloadPtt(msgId, peer);
2462
+ const rel = downloaded.filePath;
2463
+ if (rel !== void 0 && rel !== "") {
2464
+ const localAfter = resolveLocalMediaFile(rel, this.deps);
2465
+ if (localAfter !== null) return {
2466
+ ...downloaded.fileSize !== void 0 ? { file_size: downloaded.fileSize } : {},
2467
+ ...downloaded.fileName !== void 0 ? { file_name: downloaded.fileName } : {},
2468
+ file: localAfter
2469
+ };
2470
+ }
2471
+ } catch {}
2472
+ return {
2473
+ ...meta(),
2474
+ file: ptt.filePath
2475
+ };
2413
2476
  }
2414
2477
  };
2415
2478
  //#endregion
@@ -3711,6 +3774,7 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
3711
3774
  msgChannel;
3712
3775
  groupChannel;
3713
3776
  friendChannel;
3777
+ buddyCacheEvents;
3714
3778
  calibLogger;
3715
3779
  selfUin;
3716
3780
  oneBotApi;
@@ -3721,6 +3785,8 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
3721
3785
  heartbeatTimer = null;
3722
3786
  reportSelfMessage = false;
3723
3787
  messageFormat = "array";
3788
+ /** 群文件报形式(B4):true = fileElement 群消息报 group_upload notice 替代 message。 */
3789
+ groupUploadAsNotice = false;
3724
3790
  /** IPC 桥模式标记(subscribeOnly 启动;reload 时跳过传输重建)。 */
3725
3791
  subscribedOnly = false;
3726
3792
  constructor(opts) {
@@ -3736,6 +3802,7 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
3736
3802
  this.msgChannel = opts.msgChannel;
3737
3803
  this.groupChannel = opts.groupChannel;
3738
3804
  this.friendChannel = opts.friendChannel;
3805
+ this.buddyCacheEvents = opts.buddyCacheEvents;
3739
3806
  this.calibLogger = opts.logger;
3740
3807
  this.selfUin = opts.self.uin;
3741
3808
  this.oneBotApi = new OneBotApi(opts);
@@ -3749,6 +3816,7 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
3749
3816
  if (this.subscribedOnly) {
3750
3817
  this.reportSelfMessage = config.reportSelfMessage;
3751
3818
  this.messageFormat = config.messagePostFormat;
3819
+ this.groupUploadAsNotice = config.groupUploadAsNotice;
3752
3820
  return;
3753
3821
  }
3754
3822
  await this.stopAll();
@@ -3759,6 +3827,7 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
3759
3827
  this.subscribedOnly = false;
3760
3828
  this.reportSelfMessage = config.reportSelfMessage;
3761
3829
  this.messageFormat = config.messagePostFormat;
3830
+ this.groupUploadAsNotice = config.groupUploadAsNotice;
3762
3831
  const broadcaster = this.getBroadcaster();
3763
3832
  if (broadcaster !== void 0) {
3764
3833
  this.transports = assembleOb11Transports({
@@ -3830,6 +3899,13 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
3830
3899
  return;
3831
3900
  }
3832
3901
  if (!this.reportSelfMessage && String(msg.senderUin) === this.selfUin) return;
3902
+ if (this.groupUploadAsNotice && msg.chatType === ChatType.GROUP && hasFileElement(msg)) {
3903
+ const notice = toGroupUpload(msg, this.selfUin);
3904
+ if (notice !== null) {
3905
+ this.broadcastEvent(notice);
3906
+ return;
3907
+ }
3908
+ }
3833
3909
  this.broadcastMessageEvent(msg);
3834
3910
  });
3835
3911
  }));
@@ -3850,6 +3926,9 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
3850
3926
  this.calibLogger?.info({ raw: JSON.stringify(arg)?.slice(0, 2e3) }, `ob11: ${evt} raw(friend_add 校准数据)`);
3851
3927
  }));
3852
3928
  }
3929
+ if (this.buddyCacheEvents !== void 0) this.unsubscribes.push(this.buddyCacheEvents.on("BuddyCache/onBuddyAdded", (entry) => {
3930
+ this.broadcastEvent(toFriendAdd(entry, this.selfUin));
3931
+ }));
3853
3932
  }
3854
3933
  /**
3855
3934
  * 仅启动接收链路(IPC 桥模式,2026-08-27):订阅消息通道维护 messageUnique +
@@ -3860,6 +3939,7 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
3860
3939
  const config = await this.config.load();
3861
3940
  this.reportSelfMessage = config.reportSelfMessage;
3862
3941
  this.messageFormat = config.messagePostFormat;
3942
+ this.groupUploadAsNotice = config.groupUploadAsNotice;
3863
3943
  this.subscribedOnly = true;
3864
3944
  this.subscribe();
3865
3945
  }