From 46b302f7384df51d600c2d7bafcf6ae5afdcd6b7 Mon Sep 17 00:00:00 2001 From: DrSmoothl <1787882683@qq.com> Date: Thu, 21 May 2026 08:27:05 +0800 Subject: [PATCH] refactor(common): extract leaf utilities into @snowluma/common package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 1 of the 4-package split called out in RoadMap #3. Moves the "infrastructure" leaves — files with zero business dependencies that @snowluma/bridge, @snowluma/core, and @snowluma/onebot all consume — into a dedicated workspace package. Mirrors what #4 (proto-defs) did for wire-protobuf definitions. Why --- - Cleaner layering: these were never bridge- or onebot-specific. Logger / hex codec / runtime config sit at the bottom of every module's import graph; giving them their own package makes that graph readable and prevents future leaks the other direction. - Sets up #3's bridge + onebot extractions: those need a clean leaf to depend on. Without this, every cross-package import would have to re-export through core, which defeats the split. - Mirrors @snowluma/proto-defs layout — per-file subpath exports (`@snowluma/common/logger`, `@snowluma/common/hex`, …) keep import sites unambiguous and let bundlers tree-shake aggressively. Layout ------ Moved (via `git mv` — history preserved): packages/core/src/utils/logger.ts → @snowluma/common/logger packages/core/src/utils/hex.ts → @snowluma/common/hex packages/core/src/utils/log-file-transport.ts → @snowluma/common/log-file-transport packages/core/src/utils/log-summary.ts → @snowluma/common/log-summary packages/core/src/protocol/packet-sender.ts → @snowluma/common/packet-sender packages/core/src/protocol/types.ts → @snowluma/common/protocol-types packages/core/src/common/runtime.ts → @snowluma/common/runtime Not moved (deferred to Phase 2): `packages/core/src/utils/event-format.ts` — it has reverse imports on `bridge/events`, `bridge/identity-service`, `onebot/message-store`, `onebot/types`. It moves into @snowluma/bridge in Phase 2, with the MessageStore parameter decoupled via a structural type so bridge doesn't end up depending on onebot. Changes ------- - New package `packages/common/` (package.json, tsconfig.json — no src/index.ts barrel, callers use the subpath exports directly to avoid pulling in `node:fs` when only the hex codec is needed). - 7 `.ts` files moved via `git mv`. - 50+ import sites rewritten via sed across `packages/core/src` and `packages/core/tests`. Old shapes (`../utils/logger`, `../../protocol/types`, `./common/runtime`, `../src/utils/hex`) all collapse to `@snowluma/common/`. - `@snowluma/core` depends on `@snowluma/common` (workspace:*). - `packages/core/src/{protocol,common}/` directories removed (empty). Verification ------------ - core typecheck: clean - common typecheck: clean - Full workspace `pnpm -r typecheck`: all 9 projects clean - core test suite: 552 passed / 552 total (pre-existing websocket-darwin-arm64.node addon failure unchanged — same baseline as the previous refactor commits) - Vite build with stubbed native binary: clean (143 modules, 2.84 MB bundle, 224 KB gzip — same size envelope as before) Note: `utils/event-format.ts` is the only file remaining under the old `utils/` namespace. It moves into @snowluma/bridge alongside the events / identity-service / packet-pipeline trio in Phase 2. --- packages/common/package.json | 47 +++++++++++++++++++ .../{core/src/utils => common/src}/hex.ts | 0 .../src}/log-file-transport.ts | 0 .../src/utils => common/src}/log-summary.ts | 0 .../{core/src/utils => common/src}/logger.ts | 0 .../protocol => common/src}/packet-sender.ts | 0 .../types.ts => common/src/protocol-types.ts} | 0 .../src/common => common/src}/runtime.ts | 0 packages/common/tsconfig.json | 13 +++++ packages/core/package.json | 1 + packages/core/src/bridge/apis/forward.ts | 2 +- packages/core/src/bridge/apis/group-file.ts | 4 +- packages/core/src/bridge/bridge-context.ts | 2 +- packages/core/src/bridge/bridge.ts | 4 +- packages/core/src/bridge/event-bus.ts | 2 +- .../core/src/bridge/highway/image-upload.ts | 2 +- packages/core/src/bridge/highway/pipeline.ts | 2 +- .../core/src/bridge/highway/ptt-upload.ts | 2 +- .../core/src/bridge/highway/video-upload.ts | 2 +- packages/core/src/bridge/identity-service.ts | 2 +- packages/core/src/bridge/manager.ts | 6 +-- packages/core/src/bridge/msg-push/context.ts | 2 +- .../bridge/msg-push/decoders/event-0x210.ts | 2 +- .../bridge/msg-push/decoders/event-0x2dc.ts | 2 +- packages/core/src/bridge/msg-push/index.ts | 2 +- packages/core/src/bridge/msg-push/registry.ts | 2 +- .../src/bridge/msg-push/rich-body-decoder.ts | 2 +- packages/core/src/bridge/packet-pipeline.ts | 4 +- packages/core/src/bridge/web/group-essence.ts | 2 +- packages/core/src/bridge/web/group-honor.ts | 2 +- packages/core/src/bridge/web/group-notice.ts | 2 +- packages/core/src/hook/hook-manager.ts | 4 +- packages/core/src/hook/hook-packet-client.ts | 2 +- packages/core/src/hook/hook-session.ts | 4 +- packages/core/src/hook/pipe-watcher.ts | 2 +- packages/core/src/index.ts | 4 +- packages/core/src/onebot/api-handler.ts | 4 +- packages/core/src/onebot/config.ts | 2 +- packages/core/src/onebot/instance-rkey.ts | 2 +- packages/core/src/onebot/instance.ts | 2 +- packages/core/src/onebot/manager.ts | 2 +- packages/core/src/onebot/message-parser.ts | 2 +- .../core/src/onebot/modules/media-actions.ts | 2 +- .../src/onebot/modules/message-actions.ts | 2 +- .../src/onebot/network/http-post-adapter.ts | 2 +- .../src/onebot/network/http-server-adapter.ts | 2 +- .../src/onebot/network/network-manager.ts | 2 +- .../src/onebot/network/ws-client-adapter.ts | 2 +- .../src/onebot/network/ws-server-adapter.ts | 2 +- packages/core/src/webui/auth.ts | 2 +- packages/core/src/webui/server.ts | 2 +- packages/core/tests/actions/_helpers.ts | 2 +- .../core/tests/api-handler-logging.test.ts | 4 +- .../core/tests/bridge-member-identity.test.ts | 2 +- .../core/tests/bridge-private-routing.test.ts | 2 +- .../core/tests/group-msg-emoji-like.test.ts | 2 +- packages/core/tests/hex.test.ts | 2 +- packages/core/tests/hook-manager.test.ts | 2 +- packages/core/tests/hook-session.test.ts | 2 +- .../core/tests/log-file-transport.test.ts | 2 +- packages/core/tests/logger.test.ts | 4 +- packages/core/tests/msg-push-handler.test.ts | 4 +- .../core/tests/observability-logs.test.ts | 2 +- pnpm-lock.yaml | 12 +++++ 64 files changed, 138 insertions(+), 65 deletions(-) create mode 100644 packages/common/package.json rename packages/{core/src/utils => common/src}/hex.ts (100%) rename packages/{core/src/utils => common/src}/log-file-transport.ts (100%) rename packages/{core/src/utils => common/src}/log-summary.ts (100%) rename packages/{core/src/utils => common/src}/logger.ts (100%) rename packages/{core/src/protocol => common/src}/packet-sender.ts (100%) rename packages/{core/src/protocol/types.ts => common/src/protocol-types.ts} (100%) rename packages/{core/src/common => common/src}/runtime.ts (100%) create mode 100644 packages/common/tsconfig.json diff --git a/packages/common/package.json b/packages/common/package.json new file mode 100644 index 00000000..47d2e562 --- /dev/null +++ b/packages/common/package.json @@ -0,0 +1,47 @@ +{ + "name": "@snowluma/common", + "version": "1.9.0", + "private": true, + "type": "module", + "description": "SnowLuma shared infrastructure — leaf-package utilities with zero business dependencies. Logger / hex codec / log file transport / log line summariser / packet sender wire-protocol types / runtime config loader. Consumed by @snowluma/bridge, @snowluma/core, and @snowluma/onebot. Per-file subpath exports keep import sites unambiguous and let the bundler tree-shake aggressively (importing `@snowluma/common/hex` doesn't pull in `node:fs` from the logger transport).", + "main": "./src/index.ts", + "types": "./src/index.ts", + "exports": { + ".": { + "types": "./src/index.ts", + "default": "./src/index.ts" + }, + "./logger": { + "types": "./src/logger.ts", + "default": "./src/logger.ts" + }, + "./hex": { + "types": "./src/hex.ts", + "default": "./src/hex.ts" + }, + "./log-file-transport": { + "types": "./src/log-file-transport.ts", + "default": "./src/log-file-transport.ts" + }, + "./log-summary": { + "types": "./src/log-summary.ts", + "default": "./src/log-summary.ts" + }, + "./packet-sender": { + "types": "./src/packet-sender.ts", + "default": "./src/packet-sender.ts" + }, + "./protocol-types": { + "types": "./src/protocol-types.ts", + "default": "./src/protocol-types.ts" + }, + "./runtime": { + "types": "./src/runtime.ts", + "default": "./src/runtime.ts" + } + }, + "devDependencies": { + "@types/node": "^24.12.2", + "typescript": "catalog:" + } +} diff --git a/packages/core/src/utils/hex.ts b/packages/common/src/hex.ts similarity index 100% rename from packages/core/src/utils/hex.ts rename to packages/common/src/hex.ts diff --git a/packages/core/src/utils/log-file-transport.ts b/packages/common/src/log-file-transport.ts similarity index 100% rename from packages/core/src/utils/log-file-transport.ts rename to packages/common/src/log-file-transport.ts diff --git a/packages/core/src/utils/log-summary.ts b/packages/common/src/log-summary.ts similarity index 100% rename from packages/core/src/utils/log-summary.ts rename to packages/common/src/log-summary.ts diff --git a/packages/core/src/utils/logger.ts b/packages/common/src/logger.ts similarity index 100% rename from packages/core/src/utils/logger.ts rename to packages/common/src/logger.ts diff --git a/packages/core/src/protocol/packet-sender.ts b/packages/common/src/packet-sender.ts similarity index 100% rename from packages/core/src/protocol/packet-sender.ts rename to packages/common/src/packet-sender.ts diff --git a/packages/core/src/protocol/types.ts b/packages/common/src/protocol-types.ts similarity index 100% rename from packages/core/src/protocol/types.ts rename to packages/common/src/protocol-types.ts diff --git a/packages/core/src/common/runtime.ts b/packages/common/src/runtime.ts similarity index 100% rename from packages/core/src/common/runtime.ts rename to packages/common/src/runtime.ts diff --git a/packages/common/tsconfig.json b/packages/common/tsconfig.json new file mode 100644 index 00000000..4cd329d7 --- /dev/null +++ b/packages/common/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "types": ["node"], + "noEmit": true + }, + "include": [ + "src/**/*" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/packages/core/package.json b/packages/core/package.json index 23eac82e..506a52ed 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -14,6 +14,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { + "@snowluma/common": "workspace:*", "@snowluma/proto-defs": "workspace:*", "@snowluma/proton": "workspace:*", "@snowluma/websocket": "workspace:*" diff --git a/packages/core/src/bridge/apis/forward.ts b/packages/core/src/bridge/apis/forward.ts index 23a1b40d..888dda07 100644 --- a/packages/core/src/bridge/apis/forward.ts +++ b/packages/core/src/bridge/apis/forward.ts @@ -20,7 +20,7 @@ import type { SendLongMsgResp, } from '@snowluma/proto-defs/longmsg'; import type { FileExtra, PushMsg, PushMsgBody } from '@snowluma/proto-defs/message'; -import type { PacketInfo } from '../../protocol/types'; +import type { PacketInfo } from '@snowluma/common/protocol-types'; import type { BridgeContext } from '../bridge-context'; import type { Bridge } from '../bridge'; import { buildSendElems } from '../element-builder'; diff --git a/packages/core/src/bridge/apis/group-file.ts b/packages/core/src/bridge/apis/group-file.ts index a153ca1b..fc9503b2 100644 --- a/packages/core/src/bridge/apis/group-file.ts +++ b/packages/core/src/bridge/apis/group-file.ts @@ -10,8 +10,8 @@ // (`fetchNtv2DownloadUrl`, the upload-ext builder) live in one file. import { protobuf_decode, protobuf_encode } from '@snowluma/proton'; -import { toHexUpper } from '../../utils/hex'; -import { createLogger } from '../../utils/logger'; +import { toHexUpper } from '@snowluma/common/hex'; +import { createLogger } from '@snowluma/common/logger'; import type { BridgeContext } from '../bridge-context'; import type { Bridge } from '../bridge'; import { makeOidbEnvelope, runOidb } from '../bridge-oidb'; diff --git a/packages/core/src/bridge/bridge-context.ts b/packages/core/src/bridge/bridge-context.ts index 8a68653b..82dbe82e 100644 --- a/packages/core/src/bridge/bridge-context.ts +++ b/packages/core/src/bridge/bridge-context.ts @@ -25,7 +25,7 @@ import type { IdentityService } from './identity-service'; import type { BridgeEventBus } from './event-bus'; import type { ApiHub } from './apis'; -import type { SendPacketResult } from '../protocol/packet-sender'; +import type { SendPacketResult } from '@snowluma/common/packet-sender'; import type { UploadedFileMeta } from './bridge'; export interface BridgeContext { diff --git a/packages/core/src/bridge/bridge.ts b/packages/core/src/bridge/bridge.ts index 28b4cf24..a69ff6fa 100644 --- a/packages/core/src/bridge/bridge.ts +++ b/packages/core/src/bridge/bridge.ts @@ -1,5 +1,5 @@ -import type { PacketSender, SendPacketResult } from '../protocol/packet-sender'; -import type { PacketInfo } from '../protocol/types'; +import type { PacketSender, SendPacketResult } from '@snowluma/common/packet-sender'; +import type { PacketInfo } from '@snowluma/common/protocol-types'; import type { BridgeInterface } from './bridge-interface'; import { IdentityService } from './identity-service'; import { MSG_PUSH_CMD, parseMsgPush } from './msg-push'; diff --git a/packages/core/src/bridge/event-bus.ts b/packages/core/src/bridge/event-bus.ts index de116a93..3f59c0e5 100644 --- a/packages/core/src/bridge/event-bus.ts +++ b/packages/core/src/bridge/event-bus.ts @@ -1,4 +1,4 @@ -import { createLogger } from '../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; import type { QQEventVariant } from './events'; type EventKind = QQEventVariant['kind']; diff --git a/packages/core/src/bridge/highway/image-upload.ts b/packages/core/src/bridge/highway/image-upload.ts index 91cc51cf..8662b64c 100644 --- a/packages/core/src/bridge/highway/image-upload.ts +++ b/packages/core/src/bridge/highway/image-upload.ts @@ -1,4 +1,4 @@ -import { createLogger } from '../../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; import type { Bridge } from '../bridge'; import type { MessageElement } from '../events'; import { GROUP_IMAGE_CMD_ID, PRIVATE_IMAGE_CMD_ID } from './highway-client'; diff --git a/packages/core/src/bridge/highway/pipeline.ts b/packages/core/src/bridge/highway/pipeline.ts index 814f11cd..00899406 100644 --- a/packages/core/src/bridge/highway/pipeline.ts +++ b/packages/core/src/bridge/highway/pipeline.ts @@ -1,6 +1,6 @@ import { protobuf_decode, protobuf_encode } from '@snowluma/proton'; import crypto from 'crypto'; -import { createLogger } from '../../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; import type { Bridge } from '../bridge'; import { makeOidbEnvelope } from '../bridge-oidb'; import type { diff --git a/packages/core/src/bridge/highway/ptt-upload.ts b/packages/core/src/bridge/highway/ptt-upload.ts index 98147b98..8f8e2628 100644 --- a/packages/core/src/bridge/highway/ptt-upload.ts +++ b/packages/core/src/bridge/highway/ptt-upload.ts @@ -2,7 +2,7 @@ import crypto from 'crypto'; import fs from 'fs'; import path from 'path'; -import { createLogger } from '../../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; import type { Bridge } from '../bridge'; import type { MessageElement } from '../events'; import { defaultPttTempDir, encodeSilk } from './ffmpeg-addon'; diff --git a/packages/core/src/bridge/highway/video-upload.ts b/packages/core/src/bridge/highway/video-upload.ts index 91592e1d..09505b1a 100644 --- a/packages/core/src/bridge/highway/video-upload.ts +++ b/packages/core/src/bridge/highway/video-upload.ts @@ -2,7 +2,7 @@ import crypto from 'crypto'; import fs from 'fs'; import os from 'os'; import path from 'path'; -import { createLogger } from '../../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; import type { Bridge } from '../bridge'; import type { MessageElement } from '../events'; import { getFFmpegAddon } from './ffmpeg-addon'; diff --git a/packages/core/src/bridge/identity-service.ts b/packages/core/src/bridge/identity-service.ts index d5e41d3e..f6bfe89c 100644 --- a/packages/core/src/bridge/identity-service.ts +++ b/packages/core/src/bridge/identity-service.ts @@ -6,7 +6,7 @@ import type { FriendInfo, GroupMemberInfo, QQGroupInfo, UserProfileInfo, GroupRequestInfo, } from './qq-info'; -import { createLogger, type Logger } from '../utils/logger'; +import { createLogger, type Logger } from '@snowluma/common/logger'; const moduleLogger = createLogger('Identity'); diff --git a/packages/core/src/bridge/manager.ts b/packages/core/src/bridge/manager.ts index 74e58342..d72cb2ad 100644 --- a/packages/core/src/bridge/manager.ts +++ b/packages/core/src/bridge/manager.ts @@ -1,6 +1,6 @@ -import type { PacketSender } from '../protocol/packet-sender'; -import type { PacketInfo } from '../protocol/types'; -import { createLogger } from '../utils/logger'; +import type { PacketSender } from '@snowluma/common/packet-sender'; +import type { PacketInfo } from '@snowluma/common/protocol-types'; +import { createLogger } from '@snowluma/common/logger'; import { Bridge } from './bridge'; import { IdentityService } from './identity-service'; diff --git a/packages/core/src/bridge/msg-push/context.ts b/packages/core/src/bridge/msg-push/context.ts index 9d78413a..6bde60e0 100644 --- a/packages/core/src/bridge/msg-push/context.ts +++ b/packages/core/src/bridge/msg-push/context.ts @@ -1,5 +1,5 @@ import { protobuf_decode } from '@snowluma/proton'; -import type { PacketInfo } from '../../protocol/types'; +import type { PacketInfo } from '@snowluma/common/protocol-types'; import type { IdentityService } from '../identity-service'; import type { ContentHead, MessageBody, PushMsg, ResponseHead } from '@snowluma/proto-defs/message'; diff --git a/packages/core/src/bridge/msg-push/decoders/event-0x210.ts b/packages/core/src/bridge/msg-push/decoders/event-0x210.ts index da5493fc..31d94e56 100644 --- a/packages/core/src/bridge/msg-push/decoders/event-0x210.ts +++ b/packages/core/src/bridge/msg-push/decoders/event-0x210.ts @@ -1,5 +1,5 @@ import { protobuf_decode } from '@snowluma/proton'; -import { createLogger } from '../../../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; import type { FriendAddEvent, FriendPokeEvent, diff --git a/packages/core/src/bridge/msg-push/decoders/event-0x2dc.ts b/packages/core/src/bridge/msg-push/decoders/event-0x2dc.ts index 84961539..ca0b4dbe 100644 --- a/packages/core/src/bridge/msg-push/decoders/event-0x2dc.ts +++ b/packages/core/src/bridge/msg-push/decoders/event-0x2dc.ts @@ -1,5 +1,5 @@ import { protobuf_decode } from '@snowluma/proton'; -import { createLogger } from '../../../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; import type { GroupEssenceEvent, GroupMsgEmojiLikeEvent, diff --git a/packages/core/src/bridge/msg-push/index.ts b/packages/core/src/bridge/msg-push/index.ts index 64f39031..d69f00cd 100644 --- a/packages/core/src/bridge/msg-push/index.ts +++ b/packages/core/src/bridge/msg-push/index.ts @@ -1,4 +1,4 @@ -import type { PacketInfo } from '../../protocol/types'; +import type { PacketInfo } from '@snowluma/common/protocol-types'; import type { QQEventVariant } from '../events'; import type { IdentityService } from '../identity-service'; import { buildContext } from './context'; diff --git a/packages/core/src/bridge/msg-push/registry.ts b/packages/core/src/bridge/msg-push/registry.ts index 52effa60..cf00479d 100644 --- a/packages/core/src/bridge/msg-push/registry.ts +++ b/packages/core/src/bridge/msg-push/registry.ts @@ -1,4 +1,4 @@ -import { createLogger } from '../../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; import type { QQEventVariant } from '../events'; import type { MsgPushContext } from './context'; import type { PkgType } from './enums'; diff --git a/packages/core/src/bridge/msg-push/rich-body-decoder.ts b/packages/core/src/bridge/msg-push/rich-body-decoder.ts index 6246140f..2f1840e1 100644 --- a/packages/core/src/bridge/msg-push/rich-body-decoder.ts +++ b/packages/core/src/bridge/msg-push/rich-body-decoder.ts @@ -1,5 +1,5 @@ import { protobuf_decode } from '@snowluma/proton'; -import { toHexUpper } from '../../utils/hex'; +import { toHexUpper } from '@snowluma/common/hex'; import type { MessageElement } from '../events'; import type { Elem, diff --git a/packages/core/src/bridge/packet-pipeline.ts b/packages/core/src/bridge/packet-pipeline.ts index eaa63236..f47b64b2 100644 --- a/packages/core/src/bridge/packet-pipeline.ts +++ b/packages/core/src/bridge/packet-pipeline.ts @@ -1,6 +1,6 @@ -import type { PacketInfo } from '../protocol/types'; +import type { PacketInfo } from '@snowluma/common/protocol-types'; import { formatEvent } from '../utils/event-format'; -import { createLogger, type Logger } from '../utils/logger'; +import { createLogger, type Logger } from '@snowluma/common/logger'; import type { BridgeEventBus } from './event-bus'; import type { QQEventVariant } from './events'; import type { IdentityService } from './identity-service'; diff --git a/packages/core/src/bridge/web/group-essence.ts b/packages/core/src/bridge/web/group-essence.ts index 5d8a7347..cf46eff7 100644 --- a/packages/core/src/bridge/web/group-essence.ts +++ b/packages/core/src/bridge/web/group-essence.ts @@ -1,5 +1,5 @@ import { RequestUtil, cookieToString, getBknFromCookie } from './request-util'; -import { createLogger } from '../../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; const log = createLogger('Bridge.Web'); diff --git a/packages/core/src/bridge/web/group-honor.ts b/packages/core/src/bridge/web/group-honor.ts index 55a98546..133e4f9d 100644 --- a/packages/core/src/bridge/web/group-honor.ts +++ b/packages/core/src/bridge/web/group-honor.ts @@ -1,5 +1,5 @@ import { RequestUtil, cookieToString } from './request-util'; -import { createLogger } from '../../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; const log = createLogger('Bridge.Web'); diff --git a/packages/core/src/bridge/web/group-notice.ts b/packages/core/src/bridge/web/group-notice.ts index 824fc5b3..2fc3b8fa 100644 --- a/packages/core/src/bridge/web/group-notice.ts +++ b/packages/core/src/bridge/web/group-notice.ts @@ -1,6 +1,6 @@ import { RequestUtil, cookieToString } from './request-util'; import https from 'node:https'; -import { createLogger } from '../../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; const log = createLogger('Bridge.Web'); diff --git a/packages/core/src/hook/hook-manager.ts b/packages/core/src/hook/hook-manager.ts index 18728c54..85272129 100644 --- a/packages/core/src/hook/hook-manager.ts +++ b/packages/core/src/hook/hook-manager.ts @@ -1,7 +1,7 @@ import fs from 'fs'; import type { BridgeManager } from '../bridge/manager'; -import type { PacketSink } from '../protocol/types'; -import { createLogger, type Logger } from '../utils/logger'; +import type { PacketSink } from '@snowluma/common/protocol-types'; +import { createLogger, type Logger } from '@snowluma/common/logger'; import { injectHookProcess, listHookProcesses, diff --git a/packages/core/src/hook/hook-packet-client.ts b/packages/core/src/hook/hook-packet-client.ts index 30505eac..f2633737 100644 --- a/packages/core/src/hook/hook-packet-client.ts +++ b/packages/core/src/hook/hook-packet-client.ts @@ -1,4 +1,4 @@ -import type { PacketSender, SendPacketResult } from '../protocol/packet-sender'; +import type { PacketSender, SendPacketResult } from '@snowluma/common/packet-sender'; import { QqHookClient, type QqHookSendReply } from './qq-hook-client'; export class HookPacketClient implements PacketSender { diff --git a/packages/core/src/hook/hook-session.ts b/packages/core/src/hook/hook-session.ts index f4829309..42f5645a 100644 --- a/packages/core/src/hook/hook-session.ts +++ b/packages/core/src/hook/hook-session.ts @@ -1,6 +1,6 @@ import { EventEmitter } from 'events'; -import type { PacketSink } from '../protocol/types'; -import { createLogger, type Logger } from '../utils/logger'; +import type { PacketSink } from '@snowluma/common/protocol-types'; +import { createLogger, type Logger } from '@snowluma/common/logger'; import { HookPacketClient } from './hook-packet-client'; import type { HookInjectResult } from './injector'; import type { QqHookClient, QqHookLoginState, QqHookPacket } from './qq-hook-client'; diff --git a/packages/core/src/hook/pipe-watcher.ts b/packages/core/src/hook/pipe-watcher.ts index b69bb34e..59b87632 100644 --- a/packages/core/src/hook/pipe-watcher.ts +++ b/packages/core/src/hook/pipe-watcher.ts @@ -1,5 +1,5 @@ import { EventEmitter } from 'events'; -import { createLogger, type Logger } from '../utils/logger'; +import { createLogger, type Logger } from '@snowluma/common/logger'; import type { HookProcessBaseInfo } from './injector'; const DEFAULT_INTERVAL_MS = 1500; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 413024bc..e19ffea3 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,7 +1,7 @@ import { BridgeManager } from './bridge/manager'; import { OneBotManager } from './onebot/manager'; -import { loadRuntimeConfig } from './common/runtime'; -import { closeLogger, createLogger } from './utils/logger'; +import { loadRuntimeConfig } from '@snowluma/common/runtime'; +import { closeLogger, createLogger } from '@snowluma/common/logger'; import { HookManager } from './hook/hook-manager'; const runtimeConfig = loadRuntimeConfig(); diff --git a/packages/core/src/onebot/api-handler.ts b/packages/core/src/onebot/api-handler.ts index 721c1c7b..bde78a9a 100644 --- a/packages/core/src/onebot/api-handler.ts +++ b/packages/core/src/onebot/api-handler.ts @@ -2,8 +2,8 @@ import type { JsonObject, JsonValue, MessageMeta } from './types'; import type { ForwardPreviewMeta } from './modules/message-actions'; import type { BridgeInterface } from '../bridge/bridge-interface'; import { RETCODE, failedResponse } from './types'; -import { createLogger, type Logger } from '../utils/logger'; -import { summarizeParams } from '../utils/log-summary'; +import { createLogger, type Logger } from '@snowluma/common/logger'; +import { summarizeParams } from '@snowluma/common/log-summary'; const moduleLog = createLogger('Bridge.Action'); diff --git a/packages/core/src/onebot/config.ts b/packages/core/src/onebot/config.ts index 64aa8241..e2c94a18 100644 --- a/packages/core/src/onebot/config.ts +++ b/packages/core/src/onebot/config.ts @@ -1,7 +1,7 @@ import fs from 'fs'; import path from 'path'; import { randomBytes } from 'crypto'; -import { createLogger } from '../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; import type { HttpClientNetwork, HttpServerNetwork, diff --git a/packages/core/src/onebot/instance-rkey.ts b/packages/core/src/onebot/instance-rkey.ts index c9d1ad61..a1d8c9c9 100644 --- a/packages/core/src/onebot/instance-rkey.ts +++ b/packages/core/src/onebot/instance-rkey.ts @@ -1,7 +1,7 @@ import type { MessageElement } from '../bridge/events'; import type { DownloadRKeyInfo } from '../bridge/bridge'; import type { BridgeInterface } from '../bridge/bridge-interface'; -import { createLogger } from '../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; const log = createLogger('OneBot'); diff --git a/packages/core/src/onebot/instance.ts b/packages/core/src/onebot/instance.ts index 1d2cefcc..1ed62aae 100644 --- a/packages/core/src/onebot/instance.ts +++ b/packages/core/src/onebot/instance.ts @@ -19,7 +19,7 @@ import { HttpPostAdapter, type NetworkAdapterContext, } from './network'; -import { createLogger, type Logger } from '../utils/logger'; +import { createLogger, type Logger } from '@snowluma/common/logger'; import { formatGroup, formatMessageSegments, formatReply, formatUser } from '../utils/event-format'; const moduleLog = createLogger('Event'); diff --git a/packages/core/src/onebot/manager.ts b/packages/core/src/onebot/manager.ts index 73c09872..8117ed35 100644 --- a/packages/core/src/onebot/manager.ts +++ b/packages/core/src/onebot/manager.ts @@ -1,6 +1,6 @@ import type { BridgeInterface } from '../bridge/bridge-interface'; import type { BridgeManager } from '../bridge/manager'; -import { createLogger } from '../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; import { loadOneBotConfig } from './config'; import { OneBotInstance } from './instance'; diff --git a/packages/core/src/onebot/message-parser.ts b/packages/core/src/onebot/message-parser.ts index e932ca0a..d865b098 100644 --- a/packages/core/src/onebot/message-parser.ts +++ b/packages/core/src/onebot/message-parser.ts @@ -1,5 +1,5 @@ import type { MessageElement } from '../bridge/events'; -import { createLogger } from '../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; import type { JsonValue } from './types'; const log = createLogger('MsgParser'); diff --git a/packages/core/src/onebot/modules/media-actions.ts b/packages/core/src/onebot/modules/media-actions.ts index 2094c174..3fe4983d 100644 --- a/packages/core/src/onebot/modules/media-actions.ts +++ b/packages/core/src/onebot/modules/media-actions.ts @@ -1,5 +1,5 @@ import type { BridgeInterface } from '../../bridge/bridge-interface'; -import { createLogger } from '../../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; import type { MediaStore } from '../media-store'; import type { JsonObject } from '../types'; diff --git a/packages/core/src/onebot/modules/message-actions.ts b/packages/core/src/onebot/modules/message-actions.ts index 0ba482a0..69b6db1c 100644 --- a/packages/core/src/onebot/modules/message-actions.ts +++ b/packages/core/src/onebot/modules/message-actions.ts @@ -1,6 +1,6 @@ import type { BridgeInterface } from '../../bridge/bridge-interface'; import type { ForwardNodePayload, MessageElement } from '../../bridge/events'; -import { createLogger } from '../../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; import type { MessageSendResult } from '../api-handler'; import { elementsToOneBotSegments } from '../event-converter'; import { segmentsToRawMessage } from '../event-converter/utils'; diff --git a/packages/core/src/onebot/network/http-post-adapter.ts b/packages/core/src/onebot/network/http-post-adapter.ts index 2292ade8..9f47844f 100644 --- a/packages/core/src/onebot/network/http-post-adapter.ts +++ b/packages/core/src/onebot/network/http-post-adapter.ts @@ -1,4 +1,4 @@ -import { createLogger, type Logger } from '../../utils/logger'; +import { createLogger, type Logger } from '@snowluma/common/logger'; import { pickDispatchJson, resolveReportOptions, diff --git a/packages/core/src/onebot/network/http-server-adapter.ts b/packages/core/src/onebot/network/http-server-adapter.ts index 9a74c98e..565a07b1 100644 --- a/packages/core/src/onebot/network/http-server-adapter.ts +++ b/packages/core/src/onebot/network/http-server-adapter.ts @@ -4,7 +4,7 @@ import { type Server, type ServerResponse, } from 'http'; -import { createLogger, type Logger } from '../../utils/logger'; +import { createLogger, type Logger } from '@snowluma/common/logger'; import type { DispatchPayload } from '../event-filter'; import type { HttpServerNetwork, JsonObject, JsonValue } from '../types'; import { IOneBotNetworkAdapter, NetworkReloadType, type NetworkAdapterContext } from './adapter'; diff --git a/packages/core/src/onebot/network/network-manager.ts b/packages/core/src/onebot/network/network-manager.ts index 8b2fd7e0..5100d86b 100644 --- a/packages/core/src/onebot/network/network-manager.ts +++ b/packages/core/src/onebot/network/network-manager.ts @@ -1,4 +1,4 @@ -import { createLogger } from '../../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; import { buildDispatchPayload } from '../event-filter'; import type { JsonObject, NetworkBase } from '../types'; import { IOneBotNetworkAdapter } from './adapter'; diff --git a/packages/core/src/onebot/network/ws-client-adapter.ts b/packages/core/src/onebot/network/ws-client-adapter.ts index 6f11ce34..5b0b11ff 100644 --- a/packages/core/src/onebot/network/ws-client-adapter.ts +++ b/packages/core/src/onebot/network/ws-client-adapter.ts @@ -1,5 +1,5 @@ import { WebSocket } from '@snowluma/websocket'; -import { createLogger, type Logger } from '../../utils/logger'; +import { createLogger, type Logger } from '@snowluma/common/logger'; import { pickDispatchJson, resolveReportOptions, diff --git a/packages/core/src/onebot/network/ws-server-adapter.ts b/packages/core/src/onebot/network/ws-server-adapter.ts index c85b49ff..6368fa99 100644 --- a/packages/core/src/onebot/network/ws-server-adapter.ts +++ b/packages/core/src/onebot/network/ws-server-adapter.ts @@ -1,6 +1,6 @@ import { WebSocket, WebSocketServer } from '@snowluma/websocket'; import type { IncomingMessage } from 'http'; -import { createLogger, type Logger } from '../../utils/logger'; +import { createLogger, type Logger } from '@snowluma/common/logger'; import { pickDispatchJson, resolveReportOptions, diff --git a/packages/core/src/webui/auth.ts b/packages/core/src/webui/auth.ts index f3e6a136..f10bff81 100644 --- a/packages/core/src/webui/auth.ts +++ b/packages/core/src/webui/auth.ts @@ -1,7 +1,7 @@ import { randomBytes, scryptSync, timingSafeEqual } from 'crypto'; import fs from 'fs'; import path from 'path'; -import { createLogger } from '../utils/logger'; +import { createLogger } from '@snowluma/common/logger'; const log = createLogger('WebUI.Auth'); diff --git a/packages/core/src/webui/server.ts b/packages/core/src/webui/server.ts index 87cfa31d..8d888e67 100644 --- a/packages/core/src/webui/server.ts +++ b/packages/core/src/webui/server.ts @@ -2,7 +2,7 @@ import { serve } from '@hono/node-server'; import { serveStatic } from '@hono/node-server/serve-static'; import { Hono, type Context } from 'hono'; import { describeTrustProxy, makeClientIpResolver, parseTrustProxy } from './client-ip'; -import { createLogger, getLogLevel, getRecentLogs, LOG_LEVELS, setLogLevel, subscribeLogs } from '../utils/logger'; +import { createLogger, getLogLevel, getRecentLogs, LOG_LEVELS, setLogLevel, subscribeLogs } from '@snowluma/common/logger'; import { randomBytes } from 'crypto'; import type { OneBotManager } from '../onebot/manager'; import { loadOneBotConfig, saveOneBotConfig } from '../onebot/config'; diff --git a/packages/core/tests/actions/_helpers.ts b/packages/core/tests/actions/_helpers.ts index 6467dc83..53b3b095 100644 --- a/packages/core/tests/actions/_helpers.ts +++ b/packages/core/tests/actions/_helpers.ts @@ -14,7 +14,7 @@ // via `mockBridge({ apis: { message: ... } })`. import { vi } from 'vitest'; -import type { SendPacketResult } from '../../src/protocol/packet-sender'; +import type { SendPacketResult } from '@snowluma/common/packet-sender'; /** Default receipt returned by sendGroup / sendPrivate / sendC2cFile mocks. */ const STUB_RECEIPT = { messageId: 1, sequence: 1, clientSequence: 0, random: 1, timestamp: 0 }; diff --git a/packages/core/tests/api-handler-logging.test.ts b/packages/core/tests/api-handler-logging.test.ts index 6e3ef718..aeaf19da 100644 --- a/packages/core/tests/api-handler-logging.test.ts +++ b/packages/core/tests/api-handler-logging.test.ts @@ -6,8 +6,8 @@ import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { ApiHandler } from '../src/onebot/api-handler'; -import { subscribeLogs, type LogEntry } from '../src/utils/logger'; -import { summarizeParams } from '../src/utils/log-summary'; +import { subscribeLogs, type LogEntry } from '@snowluma/common/logger'; +import { summarizeParams } from '@snowluma/common/log-summary'; // Minimal context — we never reach the real action handlers; we // register our own via registerAction. diff --git a/packages/core/tests/bridge-member-identity.test.ts b/packages/core/tests/bridge-member-identity.test.ts index 9a59a876..e36f6f22 100644 --- a/packages/core/tests/bridge-member-identity.test.ts +++ b/packages/core/tests/bridge-member-identity.test.ts @@ -3,7 +3,7 @@ import { Bridge } from '../src/bridge/bridge'; import { IdentityService } from '../src/bridge/identity-service'; import type { GroupMemberInfo, QQGroupInfo } from '../src/bridge/qq-info'; import type { GroupMemberJoin, QQEventVariant } from '../src/bridge/events'; -import type { PacketInfo } from '../src/protocol/types'; +import type { PacketInfo } from '@snowluma/common/protocol-types'; const SELF_UIN = '10001'; const GROUP_ID = 123456789; diff --git a/packages/core/tests/bridge-private-routing.test.ts b/packages/core/tests/bridge-private-routing.test.ts index ef64f81d..7df3c61e 100644 --- a/packages/core/tests/bridge-private-routing.test.ts +++ b/packages/core/tests/bridge-private-routing.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from 'vitest'; import { protobuf_decode, protobuf_encode } from '@snowluma/proton'; -import type { SendPacketResult } from '../src/protocol/packet-sender'; +import type { SendPacketResult } from '@snowluma/common/packet-sender'; import type { SendMessageRequest, SendMessageResponse } from '@snowluma/proto-defs/action'; import type { FileExtra } from '@snowluma/proto-defs/message'; diff --git a/packages/core/tests/group-msg-emoji-like.test.ts b/packages/core/tests/group-msg-emoji-like.test.ts index 66daafd1..eb451aa5 100644 --- a/packages/core/tests/group-msg-emoji-like.test.ts +++ b/packages/core/tests/group-msg-emoji-like.test.ts @@ -15,7 +15,7 @@ import type { GroupMsgEmojiLikeEvent, QQEventVariant } from '../src/bridge/event import { convertGroupMsgEmojiLike } from '../src/onebot/event-converter/to-notice'; import { GROUP_MESSAGE_EVENT, hashMessageIdInt32 } from '../src/onebot/message-id'; import { formatEvent } from '../src/utils/event-format'; -import { subscribeLogs, type LogEntry } from '../src/utils/logger'; +import { subscribeLogs, type LogEntry } from '@snowluma/common/logger'; const SELF_UIN = '10001'; const GROUP_ID = 123456789; diff --git a/packages/core/tests/hex.test.ts b/packages/core/tests/hex.test.ts index 8190b9a0..b3d506ca 100644 --- a/packages/core/tests/hex.test.ts +++ b/packages/core/tests/hex.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from 'vitest'; -import { toHex, fromHex, hexPreview } from '../src/utils/hex'; +import { toHex, fromHex, hexPreview } from '@snowluma/common/hex'; describe('toHex', () => { it('converts empty buffer', () => { diff --git a/packages/core/tests/hook-manager.test.ts b/packages/core/tests/hook-manager.test.ts index 87c0e15c..de1aaf13 100644 --- a/packages/core/tests/hook-manager.test.ts +++ b/packages/core/tests/hook-manager.test.ts @@ -8,7 +8,7 @@ import { PipeWatcher } from '../src/hook/pipe-watcher'; import type { ManualMapHandle } from '../src/hook/injector'; import type { BridgeManager } from '../src/bridge/manager'; import type { QqHookClient } from '../src/hook/qq-hook-client'; -import { createLogger } from '../src/utils/logger'; +import { createLogger } from '@snowluma/common/logger'; const DUMMY_HANDLE: ManualMapHandle = { base: 0n, entry: 0n, exceptionTable: 0n, size: 0 }; const flush = () => new Promise(r => setImmediate(r)); diff --git a/packages/core/tests/hook-session.test.ts b/packages/core/tests/hook-session.test.ts index 26127d27..8a14f335 100644 --- a/packages/core/tests/hook-session.test.ts +++ b/packages/core/tests/hook-session.test.ts @@ -3,7 +3,7 @@ import { EventEmitter } from 'events'; import { HookSession } from '../src/hook/hook-session'; import type { ManualMapHandle } from '../src/hook/injector'; import type { QqHookClient, QqHookPacket } from '../src/hook/qq-hook-client'; -import type { PacketSink } from '../src/protocol/types'; +import type { PacketSink } from '@snowluma/common/protocol-types'; const DUMMY_HANDLE: ManualMapHandle = { base: 0n, entry: 0n, exceptionTable: 0n, size: 0 }; diff --git a/packages/core/tests/log-file-transport.test.ts b/packages/core/tests/log-file-transport.test.ts index b07c6dcb..4bd48404 100644 --- a/packages/core/tests/log-file-transport.test.ts +++ b/packages/core/tests/log-file-transport.test.ts @@ -6,7 +6,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import fs from 'node:fs'; import os from 'node:os'; import path from 'node:path'; -import { FileTransport } from '../src/utils/log-file-transport'; +import { FileTransport } from '@snowluma/common/log-file-transport'; let tmpDir: string; const ENV_KEYS = [ diff --git a/packages/core/tests/logger.test.ts b/packages/core/tests/logger.test.ts index 16342153..ea5dd1ea 100644 --- a/packages/core/tests/logger.test.ts +++ b/packages/core/tests/logger.test.ts @@ -11,8 +11,8 @@ import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import fs from 'node:fs'; import os from 'node:os'; import path from 'node:path'; -import { createLogger, getLogLevel, setLogLevel, subscribeLogs, type LogEntry } from '../src/utils/logger'; -import { _resetFileTransportForTesting } from '../src/utils/log-file-transport'; +import { createLogger, getLogLevel, setLogLevel, subscribeLogs, type LogEntry } from '@snowluma/common/logger'; +import { _resetFileTransportForTesting } from '@snowluma/common/log-file-transport'; let tmpDir: string; const ENV_KEYS = [ diff --git a/packages/core/tests/msg-push-handler.test.ts b/packages/core/tests/msg-push-handler.test.ts index 87241ea0..3efb73c8 100644 --- a/packages/core/tests/msg-push-handler.test.ts +++ b/packages/core/tests/msg-push-handler.test.ts @@ -24,8 +24,8 @@ import type { // we avoid an `import { FriendRecall as X }` that collides with the // proton import above. type FriendRecallEvent = Extract; -import type { PacketInfo } from '../src/protocol/types'; -import { subscribeLogs } from '../src/utils/logger'; +import type { PacketInfo } from '@snowluma/common/protocol-types'; +import { subscribeLogs } from '@snowluma/common/logger'; const SELF_UIN = '10001'; const GROUP_ID = 123456789; diff --git a/packages/core/tests/observability-logs.test.ts b/packages/core/tests/observability-logs.test.ts index 220b2f19..c76a536c 100644 --- a/packages/core/tests/observability-logs.test.ts +++ b/packages/core/tests/observability-logs.test.ts @@ -11,7 +11,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { protobuf_encode } from '@snowluma/proton'; -import { subscribeLogs, type LogEntry } from '../src/utils/logger'; +import { subscribeLogs, type LogEntry } from '@snowluma/common/logger'; vi.mock('../src/bridge/highway/highway-client', () => ({ fetchHighwaySession: vi.fn(async () => ({ sessionId: 'fake-session' })), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1de46d31..aff903eb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,8 +48,20 @@ importers: specifier: ^8.58.2 version: 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + packages/common: + devDependencies: + '@types/node': + specifier: ^24.12.2 + version: 24.12.2 + typescript: + specifier: 'catalog:' + version: 6.0.2 + packages/core: dependencies: + '@snowluma/common': + specifier: workspace:* + version: link:../common '@snowluma/proto-defs': specifier: workspace:* version: link:../proto-defs