@sfmc-bds/db-server 0.1.0 → 0.2.0-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.
Files changed (112) hide show
  1. package/README.md +1 -1
  2. package/dist/db-tables.js +16 -17
  3. package/dist/db-tables.js.map +7 -1
  4. package/dist/domain/bridge.js +54 -77
  5. package/dist/domain/bridge.js.map +7 -1
  6. package/dist/domain/economy.d.ts +83 -2
  7. package/dist/domain/economy.d.ts.map +1 -1
  8. package/dist/domain/economy.js +292 -281
  9. package/dist/domain/economy.js.map +7 -1
  10. package/dist/domain/schema.js +480 -426
  11. package/dist/domain/schema.js.map +7 -1
  12. package/dist/domain/transaction.js +32 -80
  13. package/dist/domain/transaction.js.map +7 -1
  14. package/dist/env.d.ts.map +1 -1
  15. package/dist/env.js +85 -84
  16. package/dist/env.js.map +7 -1
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +218 -240
  20. package/dist/index.js.map +7 -1
  21. package/dist/lib/http.js +30 -39
  22. package/dist/lib/http.js.map +7 -1
  23. package/dist/lib/idempotency-store.js +34 -47
  24. package/dist/lib/idempotency-store.js.map +7 -1
  25. package/dist/lib/idempotency.js +8 -13
  26. package/dist/lib/idempotency.js.map +7 -1
  27. package/dist/lib/identifiers.js +18 -14
  28. package/dist/lib/identifiers.js.map +7 -1
  29. package/dist/lib/log.d.ts +3 -6
  30. package/dist/lib/log.d.ts.map +1 -1
  31. package/dist/lib/log.js +13 -14
  32. package/dist/lib/log.js.map +7 -1
  33. package/dist/lib/module-state.d.ts.map +1 -1
  34. package/dist/lib/module-state.js +32 -21
  35. package/dist/lib/module-state.js.map +7 -1
  36. package/dist/lib/order-by.d.ts +17 -0
  37. package/dist/lib/order-by.d.ts.map +1 -0
  38. package/dist/lib/order-by.js +24 -0
  39. package/dist/lib/order-by.js.map +7 -0
  40. package/dist/lib/runtime.js +16 -31
  41. package/dist/lib/runtime.js.map +7 -1
  42. package/dist/lib/sql-helpers.js +9 -27
  43. package/dist/lib/sql-helpers.js.map +7 -1
  44. package/dist/lib/sqlite.js +40 -52
  45. package/dist/lib/sqlite.js.map +7 -1
  46. package/dist/manifest-loader.d.ts.map +1 -1
  47. package/dist/manifest-loader.js +154 -195
  48. package/dist/manifest-loader.js.map +7 -1
  49. package/dist/manifest.d.ts +3 -7
  50. package/dist/manifest.d.ts.map +1 -1
  51. package/dist/manifest.js +76 -115
  52. package/dist/manifest.js.map +7 -1
  53. package/dist/module-auth.d.ts +17 -6
  54. package/dist/module-auth.d.ts.map +1 -1
  55. package/dist/module-auth.js +93 -107
  56. package/dist/module-auth.js.map +7 -1
  57. package/dist/module-runtime-sync.d.ts +37 -0
  58. package/dist/module-runtime-sync.d.ts.map +1 -0
  59. package/dist/module-runtime-sync.js +54 -0
  60. package/dist/module-runtime-sync.js.map +7 -0
  61. package/dist/permission-gate.d.ts.map +1 -1
  62. package/dist/permission-gate.js +55 -86
  63. package/dist/permission-gate.js.map +7 -1
  64. package/dist/routes/_shared.d.ts +7 -2
  65. package/dist/routes/_shared.d.ts.map +1 -1
  66. package/dist/routes/_shared.js +16 -25
  67. package/dist/routes/_shared.js.map +7 -1
  68. package/dist/routes/config.d.ts +11 -1
  69. package/dist/routes/config.d.ts.map +1 -1
  70. package/dist/routes/config.js +167 -213
  71. package/dist/routes/config.js.map +7 -1
  72. package/dist/routes/db-routes.d.ts +6 -10
  73. package/dist/routes/db-routes.d.ts.map +1 -1
  74. package/dist/routes/db-routes.js +198 -172
  75. package/dist/routes/db-routes.js.map +7 -1
  76. package/dist/routes/health.js +15 -20
  77. package/dist/routes/health.js.map +7 -1
  78. package/dist/routes/messages.d.ts.map +1 -1
  79. package/dist/routes/messages.js +56 -63
  80. package/dist/routes/messages.js.map +7 -1
  81. package/dist/routes/module-config-routes.d.ts.map +1 -1
  82. package/dist/routes/module-config-routes.js +92 -111
  83. package/dist/routes/module-config-routes.js.map +7 -1
  84. package/dist/routes/modules.d.ts.map +1 -1
  85. package/dist/routes/modules.js +82 -88
  86. package/dist/routes/modules.js.map +7 -1
  87. package/dist/routes/service-routes.d.ts.map +1 -1
  88. package/dist/routes/service-routes.js +54 -61
  89. package/dist/routes/service-routes.js.map +7 -1
  90. package/dist/runtime.test.js +248 -49
  91. package/dist/runtime.test.js.map +7 -1
  92. package/dist/schema-registry.d.ts.map +1 -1
  93. package/dist/schema-registry.js +119 -160
  94. package/dist/schema-registry.js.map +7 -1
  95. package/dist/server.js +69 -72
  96. package/dist/server.js.map +7 -1
  97. package/dist/service-registry.d.ts.map +1 -1
  98. package/dist/service-registry.js +60 -67
  99. package/dist/service-registry.js.map +7 -1
  100. package/dist/services/builtin-handlers.d.ts +4 -0
  101. package/dist/services/builtin-handlers.d.ts.map +1 -1
  102. package/dist/services/builtin-handlers.js +34 -20
  103. package/dist/services/builtin-handlers.js.map +7 -1
  104. package/dist/services/economy-handlers.js +143 -132
  105. package/dist/services/economy-handlers.js.map +7 -1
  106. package/dist/tx-runner.d.ts +35 -11
  107. package/dist/tx-runner.d.ts.map +1 -1
  108. package/dist/tx-runner.js +293 -250
  109. package/dist/tx-runner.js.map +7 -1
  110. package/dist/where.js +71 -94
  111. package/dist/where.js.map +7 -1
  112. package/package.json +4 -4
package/README.md CHANGED
@@ -9,7 +9,7 @@ npm install @sfmc-bds/db-server
9
9
  node node_modules/@sfmc-bds/db-server/dist/index.js
10
10
  ```
11
11
 
12
- 通常由 `@sfmc-bds/cli` SEA 包统一拉起,无需单独安装。
12
+ 通常由 `@sfmc-bds/sfmc` / `@sfmc-bds/cli` 统一拉起,无需单独安装。
13
13
 
14
14
  ## 依赖
15
15
 
package/dist/db-tables.js CHANGED
@@ -1,15 +1,7 @@
1
- /**
2
- * db-tables.ts — 平台自带数据库表 bootstrap
3
- *
4
- * 平台表(不是模块声明的):
5
- * - sfmc__audit — db.audit() 自动写入
6
- * - sfmc__idempotent — db.idempotent() probe/commit 用
7
- *
8
- * 业务表(land / economy / coops / redpacket / ...)的 DDL 不在这里;
9
- * 它们由各自模块在 init() 调 db.defineTable() 声明,schema-registry 统一建表。
10
- */
11
- export function createPlatformTables(db) {
12
- db.exec(/* sql */ `
1
+ function createPlatformTables(db) {
2
+ db.exec(
3
+ /* sql */
4
+ `
13
5
  CREATE TABLE IF NOT EXISTS sfmc__audit (
14
6
  id INTEGER PRIMARY KEY AUTOINCREMENT,
15
7
  module_id TEXT NOT NULL,
@@ -19,9 +11,12 @@ export function createPlatformTables(db) {
19
11
  data TEXT,
20
12
  created_at TEXT NOT NULL
21
13
  )
22
- `);
23
- db.exec(`CREATE INDEX IF NOT EXISTS idx_sfmc__audit_module_table ON sfmc__audit(module_id, table_name)`);
24
- db.exec(/* sql */ `
14
+ `
15
+ );
16
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_sfmc__audit_module_table ON sfmc__audit(module_id, table_name)`);
17
+ db.exec(
18
+ /* sql */
19
+ `
25
20
  CREATE TABLE IF NOT EXISTS sfmc__idempotent (
26
21
  module_id TEXT NOT NULL,
27
22
  action TEXT NOT NULL,
@@ -30,6 +25,10 @@ export function createPlatformTables(db) {
30
25
  created_at TEXT NOT NULL,
31
26
  PRIMARY KEY (module_id, action, key)
32
27
  )
33
- `);
28
+ `
29
+ );
34
30
  }
35
- //# sourceMappingURL=db-tables.js.map
31
+ export {
32
+ createPlatformTables
33
+ };
34
+ //# sourceMappingURL=db-tables.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"db-tables.js","sourceRoot":"","sources":["../src/db-tables.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,UAAU,oBAAoB,CAAC,EAAgB;IACnD,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;;;;;;;;;;GAUjB,CAAC,CAAC;IACH,EAAE,CAAC,IAAI,CAAC,+FAA+F,CAAC,CAAC;IAEzG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;;;;;;;;;GASjB,CAAC,CAAC;AACL,CAAC"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/db-tables.ts"],
4
+ "sourcesContent": ["/**\n * db-tables.ts \u2014 \u5E73\u53F0\u81EA\u5E26\u6570\u636E\u5E93\u8868 bootstrap\n *\n * \u5E73\u53F0\u8868(\u4E0D\u662F\u6A21\u5757\u58F0\u660E\u7684):\n * - sfmc__audit \u2014 db.audit() \u81EA\u52A8\u5199\u5165\n * - sfmc__idempotent \u2014 db.idempotent() probe/commit \u7528\n *\n * \u4E1A\u52A1\u8868(land / economy / coops / redpacket / ...)\u7684 DDL \u4E0D\u5728\u8FD9\u91CC;\n * \u5B83\u4EEC\u7531\u5404\u81EA\u6A21\u5757\u5728 init() \u8C03 db.defineTable() \u58F0\u660E,schema-registry \u7EDF\u4E00\u5EFA\u8868\u3002\n */\n\nimport type { DatabaseSync } from \"node:sqlite\";\n\nexport function createPlatformTables(db: DatabaseSync): void {\n db.exec(/* sql */ `\n CREATE TABLE IF NOT EXISTS sfmc__audit (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n module_id TEXT NOT NULL,\n table_name TEXT NOT NULL,\n row_id TEXT NOT NULL,\n action TEXT NOT NULL,\n data TEXT,\n created_at TEXT NOT NULL\n )\n `);\n db.exec(`CREATE INDEX IF NOT EXISTS idx_sfmc__audit_module_table ON sfmc__audit(module_id, table_name)`);\n\n db.exec(/* sql */ `\n CREATE TABLE IF NOT EXISTS sfmc__idempotent (\n module_id TEXT NOT NULL,\n action TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT,\n created_at TEXT NOT NULL,\n PRIMARY KEY (module_id, action, key)\n )\n `);\n}\n"],
5
+ "mappings": "AAaO,SAAS,qBAAqB,IAAwB;AAC3D,KAAG;AAAA;AAAA,IAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUjB;AACD,KAAG,KAAK,+FAA+F;AAEvG,KAAG;AAAA;AAAA,IAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASjB;AACH;",
6
+ "names": []
7
+ }
@@ -1,82 +1,59 @@
1
- /**
2
- * domain/bridge.ts — MC → QQ 桥接
3
- *
4
- * db-server 收到 SAPI 上报的消息后,直接调 LLBot HTTP `/send_group_msg`
5
- * 把消息转发到 QQ 群。不再走中间 qq-bridge 进程。
6
- *
7
- * 数据流:
8
- * SAPI ──POST──→ db-server:3001/api/sfmc/messages
9
- * └─ 写库 + forwardToQQBridge() ──HTTP──→ LLBot:3004/send_group_msg
10
- *
11
- * 事务描述:
12
- * - 无 DB 事务(本文件不操作 SQLite,只做 HTTP 出站转发)
13
- *
14
- * 领域函数:
15
- * - makeLLBotConfig(env) 工厂:从 env 构造 LLBotConfig
16
- * - forwardToQQBridge() 转发单条 MC 消息到 LLBot;失败仅 warn,不抛错
17
- */
18
1
  import { request } from "node:http";
19
2
  import { log } from "../lib/log.js";
20
- /**
21
- * 构造 LLBotConfig。允许显式传入(测试),默认从 env 推不出,
22
- * 所以调用方需自己把 env 里读到的值传进来。
23
- */
24
- export function makeLLBotConfig(env) {
25
- return {
26
- host: env.LLBOT_HOST,
27
- port: env.LLBOT_PORT,
28
- token: env.LLBOT_TOKEN,
29
- groupId: env.QQ_GROUP_ID,
30
- prefix: "[MC]",
31
- };
3
+ function makeLLBotConfig(env) {
4
+ return {
5
+ host: env.LLBOT_HOST,
6
+ port: env.LLBOT_PORT,
7
+ token: env.LLBOT_TOKEN,
8
+ groupId: env.QQ_GROUP_ID,
9
+ prefix: "[MC]"
10
+ };
32
11
  }
33
- /**
34
- * @description
35
- * @author Shiroha7z
36
- * @date 17/07/2026
37
- * @export
38
- * @param {LLBotConfig} config LLBot 连接信息(host/port/token/groupId/prefix)
39
- * @param {string} channelId MC 频道 ID(用于过滤 / 标记,目前仅做日志)
40
- * @param {string} fromName MC 玩家名
41
- * @param {string} content 消息正文
42
- * @param {string} fromId MC 玩家 ID
43
- */
44
- export function forwardToQQBridge(config, channelId, fromName, content, fromId) {
45
- if (!config.groupId || config.groupId === "0") {
46
- log.warn(`QQ 群未配置 (qq_group_id),跳过 MC→QQ 转发 (channel=${channelId})`);
47
- return;
12
+ function forwardToQQBridge(config, channelId, fromName, content, fromId) {
13
+ if (!config.groupId || config.groupId === "0") {
14
+ log.warn(`QQ \u7FA4\u672A\u914D\u7F6E (qq_group_id),\u8DF3\u8FC7 MC\u2192QQ \u8F6C\u53D1 (channel=${channelId})`);
15
+ return;
16
+ }
17
+ const text = `${config.prefix} ${fromName}: ${content}`;
18
+ const payload = JSON.stringify({
19
+ group_id: parseInt(config.groupId, 10),
20
+ message: [{ type: "text", data: { text } }]
21
+ });
22
+ const headers = {
23
+ "Content-Type": "application/json",
24
+ "Content-Length": Buffer.byteLength(payload)
25
+ };
26
+ if (config.token) {
27
+ headers["Authorization"] = `Bearer ${config.token}`;
28
+ }
29
+ const req = request(
30
+ {
31
+ hostname: config.host,
32
+ port: config.port,
33
+ path: "/send_group_msg",
34
+ method: "POST",
35
+ headers
36
+ },
37
+ (res) => {
38
+ let body = "";
39
+ res.on("data", (c) => body += c);
40
+ res.on("end", () => {
41
+ if (res.statusCode !== 200) {
42
+ log.warn(
43
+ `LLBot send_group_msg \u2192 ${res.statusCode}: ${String(body).slice(0, 200)} (from=${fromId}, channel=${channelId})`
44
+ );
45
+ }
46
+ });
48
47
  }
49
- const text = `${config.prefix} ${fromName}: ${content}`;
50
- const payload = JSON.stringify({
51
- group_id: parseInt(config.groupId, 10),
52
- message: [{ type: "text", data: { text } }],
53
- });
54
- const headers = {
55
- "Content-Type": "application/json",
56
- "Content-Length": Buffer.byteLength(payload),
57
- };
58
- if (config.token) {
59
- headers["Authorization"] = `Bearer ${config.token}`;
60
- }
61
- const req = request({
62
- hostname: config.host,
63
- port: config.port,
64
- path: "/send_group_msg",
65
- method: "POST",
66
- headers,
67
- }, (res) => {
68
- let body = "";
69
- res.on("data", (c) => (body += c));
70
- res.on("end", () => {
71
- if (res.statusCode !== 200) {
72
- log.warn(`LLBot send_group_msg → ${res.statusCode}: ${String(body).slice(0, 200)} (from=${fromId}, channel=${channelId})`);
73
- }
74
- });
75
- });
76
- req.on("error", (err) => {
77
- log.warn(`LLBot 不可达 (${config.host}:${config.port}): ${err.message}`);
78
- });
79
- req.write(payload);
80
- req.end();
48
+ );
49
+ req.on("error", (err) => {
50
+ log.warn(`LLBot \u4E0D\u53EF\u8FBE (${config.host}:${config.port}): ${err.message}`);
51
+ });
52
+ req.write(payload);
53
+ req.end();
81
54
  }
82
- //# sourceMappingURL=bridge.js.map
55
+ export {
56
+ forwardToQQBridge,
57
+ makeLLBotConfig
58
+ };
59
+ //# sourceMappingURL=bridge.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/domain/bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAUpC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAK/B;IACC,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,UAAU;QACpB,IAAI,EAAE,GAAG,CAAC,UAAU;QACpB,KAAK,EAAE,GAAG,CAAC,WAAW;QACtB,OAAO,EAAE,GAAG,CAAC,WAAW;QACxB,MAAM,EAAE,MAAM;KACf,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAmB,EACnB,SAAiB,EACjB,QAAgB,EAChB,OAAe,EACf,MAAc;IAEd,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,GAAG,EAAE,CAAC;QAC9C,GAAG,CAAC,IAAI,CAAC,8CAA8C,SAAS,GAAG,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QACtC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;KAC5C,CAAC,CAAC;IAEH,MAAM,OAAO,GAAoC;QAC/C,cAAc,EAAE,kBAAkB;QAClC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;KAC7C,CAAC;IACF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC;IACtD,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CACjB;QACE,QAAQ,EAAE,MAAM,CAAC,IAAI;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,MAAM;QACd,OAAO;KACR,EACD,CAAC,GAAG,EAAE,EAAE;QACN,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACjB,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC3B,GAAG,CAAC,IAAI,CACN,0BAA0B,GAAG,CAAC,UAAU,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,UAAU,MAAM,aAAa,SAAS,GAAG,CACjH,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACtB,GAAG,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IACH,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnB,GAAG,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/domain/bridge.ts"],
4
+ "sourcesContent": ["/**\n * domain/bridge.ts \u2014 MC \u2192 QQ \u6865\u63A5\n *\n * db-server \u6536\u5230 SAPI \u4E0A\u62A5\u7684\u6D88\u606F\u540E,\u76F4\u63A5\u8C03 LLBot HTTP `/send_group_msg`\n * \u628A\u6D88\u606F\u8F6C\u53D1\u5230 QQ \u7FA4\u3002\u4E0D\u518D\u8D70\u4E2D\u95F4 qq-bridge \u8FDB\u7A0B\u3002\n *\n * \u6570\u636E\u6D41:\n * SAPI \u2500\u2500POST\u2500\u2500\u2192 db-server:3001/api/sfmc/messages\n * \u2514\u2500 \u5199\u5E93 + forwardToQQBridge() \u2500\u2500HTTP\u2500\u2500\u2192 LLBot:3004/send_group_msg\n *\n * \u4E8B\u52A1\u63CF\u8FF0:\n * - \u65E0 DB \u4E8B\u52A1(\u672C\u6587\u4EF6\u4E0D\u64CD\u4F5C SQLite,\u53EA\u505A HTTP \u51FA\u7AD9\u8F6C\u53D1)\n *\n * \u9886\u57DF\u51FD\u6570:\n * - makeLLBotConfig(env) \u5DE5\u5382:\u4ECE env \u6784\u9020 LLBotConfig\n * - forwardToQQBridge() \u8F6C\u53D1\u5355\u6761 MC \u6D88\u606F\u5230 LLBot;\u5931\u8D25\u4EC5 warn,\u4E0D\u629B\u9519\n */\n\nimport { request } from \"node:http\";\n\nimport { log } from \"../lib/log.js\";\n\ntype LLBotConfig = {\n host: string;\n port: number;\n token: string;\n groupId: string;\n prefix: string;\n};\n\n/**\n * \u6784\u9020 LLBotConfig\u3002\u5141\u8BB8\u663E\u5F0F\u4F20\u5165(\u6D4B\u8BD5),\u9ED8\u8BA4\u4ECE env \u63A8\u4E0D\u51FA,\n * \u6240\u4EE5\u8C03\u7528\u65B9\u9700\u81EA\u5DF1\u628A env \u91CC\u8BFB\u5230\u7684\u503C\u4F20\u8FDB\u6765\u3002\n */\nexport function makeLLBotConfig(env: {\n LLBOT_HOST: string;\n LLBOT_PORT: number;\n LLBOT_TOKEN: string;\n QQ_GROUP_ID: string;\n}): LLBotConfig {\n return {\n host: env.LLBOT_HOST,\n port: env.LLBOT_PORT,\n token: env.LLBOT_TOKEN,\n groupId: env.QQ_GROUP_ID,\n prefix: \"[MC]\",\n };\n}\n\n/**\n * @description\n * @author Shiroha7z\n * @date 17/07/2026\n * @export\n * @param {LLBotConfig} config LLBot \u8FDE\u63A5\u4FE1\u606F(host/port/token/groupId/prefix)\n * @param {string} channelId MC \u9891\u9053 ID(\u7528\u4E8E\u8FC7\u6EE4 / \u6807\u8BB0,\u76EE\u524D\u4EC5\u505A\u65E5\u5FD7)\n * @param {string} fromName MC \u73A9\u5BB6\u540D\n * @param {string} content \u6D88\u606F\u6B63\u6587\n * @param {string} fromId MC \u73A9\u5BB6 ID\n */\nexport function forwardToQQBridge(\n config: LLBotConfig,\n channelId: string,\n fromName: string,\n content: string,\n fromId: string\n): void {\n if (!config.groupId || config.groupId === \"0\") {\n log.warn(`QQ \u7FA4\u672A\u914D\u7F6E (qq_group_id),\u8DF3\u8FC7 MC\u2192QQ \u8F6C\u53D1 (channel=${channelId})`);\n return;\n }\n\n const text = `${config.prefix} ${fromName}: ${content}`;\n const payload = JSON.stringify({\n group_id: parseInt(config.groupId, 10),\n message: [{ type: \"text\", data: { text } }],\n });\n\n const headers: Record<string, string | number> = {\n \"Content-Type\": \"application/json\",\n \"Content-Length\": Buffer.byteLength(payload),\n };\n if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n }\n\n const req = request(\n {\n hostname: config.host,\n port: config.port,\n path: \"/send_group_msg\",\n method: \"POST\",\n headers,\n },\n (res) => {\n let body = \"\";\n res.on(\"data\", (c) => (body += c));\n res.on(\"end\", () => {\n if (res.statusCode !== 200) {\n log.warn(\n `LLBot send_group_msg \u2192 ${res.statusCode}: ${String(body).slice(0, 200)} (from=${fromId}, channel=${channelId})`\n );\n }\n });\n }\n );\n req.on(\"error\", (err) => {\n log.warn(`LLBot \u4E0D\u53EF\u8FBE (${config.host}:${config.port}): ${err.message}`);\n });\n req.write(payload);\n req.end();\n}\n"],
5
+ "mappings": "AAkBA,SAAS,eAAe;AAExB,SAAS,WAAW;AAcb,SAAS,gBAAgB,KAKhB;AACd,SAAO;AAAA,IACL,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,OAAO,IAAI;AAAA,IACX,SAAS,IAAI;AAAA,IACb,QAAQ;AAAA,EACV;AACF;AAaO,SAAS,kBACd,QACA,WACA,UACA,SACA,QACM;AACN,MAAI,CAAC,OAAO,WAAW,OAAO,YAAY,KAAK;AAC7C,QAAI,KAAK,2FAA8C,SAAS,GAAG;AACnE;AAAA,EACF;AAEA,QAAM,OAAO,GAAG,OAAO,MAAM,IAAI,QAAQ,KAAK,OAAO;AACrD,QAAM,UAAU,KAAK,UAAU;AAAA,IAC7B,UAAU,SAAS,OAAO,SAAS,EAAE;AAAA,IACrC,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,EAAE,KAAK,EAAE,CAAC;AAAA,EAC5C,CAAC;AAED,QAAM,UAA2C;AAAA,IAC/C,gBAAgB;AAAA,IAChB,kBAAkB,OAAO,WAAW,OAAO;AAAA,EAC7C;AACA,MAAI,OAAO,OAAO;AAChB,YAAQ,eAAe,IAAI,UAAU,OAAO,KAAK;AAAA,EACnD;AAEA,QAAM,MAAM;AAAA,IACV;AAAA,MACE,UAAU,OAAO;AAAA,MACjB,MAAM,OAAO;AAAA,MACb,MAAM;AAAA,MACN,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,QAAQ;AACP,UAAI,OAAO;AACX,UAAI,GAAG,QAAQ,CAAC,MAAO,QAAQ,CAAE;AACjC,UAAI,GAAG,OAAO,MAAM;AAClB,YAAI,IAAI,eAAe,KAAK;AAC1B,cAAI;AAAA,YACF,+BAA0B,IAAI,UAAU,KAAK,OAAO,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,UAAU,MAAM,aAAa,SAAS;AAAA,UAC/G;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,MAAI,GAAG,SAAS,CAAC,QAAQ;AACvB,QAAI,KAAK,6BAAc,OAAO,IAAI,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO,EAAE;AAAA,EACtE,CAAC;AACD,MAAI,MAAM,OAAO;AACjB,MAAI,IAAI;AACV;",
6
+ "names": []
7
+ }
@@ -8,12 +8,56 @@
8
8
  * - applyEconomySteps / submitDailyTaskSteps — 无 BEGIN/COMMIT,可嵌进外层 db.tx
9
9
  * - applyEconomyTransaction / submitDailyTaskTx — 独立调用时自己开事务;
10
10
  * alreadyInTx=true 时只跑 steps
11
+ *
12
+ * 行类型在此本地定义(平台不依赖业务模块包;权威副本在 sfmc-modules/packages/economy)。
11
13
  */
12
- import type { EconomyAccountRow, EconomyTransactionRow } from "@sfmc-bds/sdk/contracts";
13
14
  import type { DatabaseSync } from "node:sqlite";
14
15
  import type { SQLStatement } from "sql-template-strings";
15
16
  import type { TxResult } from "./transaction.js";
16
17
  export type { TxResult };
18
+ /**
19
+ * 经济域行模型(原 SDK contracts/economy;契约内聚到表所有者 db-server)。
20
+ * 业务模块应通过 service(economy.*) 消费视图,不依赖这些内部行类型。
21
+ */
22
+ export interface EconomyAccountRow {
23
+ player_id: string;
24
+ player_name_snapshot: string;
25
+ balance: number;
26
+ version: number;
27
+ created_at: number;
28
+ updated_at: number;
29
+ }
30
+ /** 幂等键表行 */
31
+ export interface EconomyIdempotencyRow {
32
+ actor_id: string;
33
+ idempotency_key: string;
34
+ transaction_id: string;
35
+ response_json: string;
36
+ created_at: number;
37
+ }
38
+ /** 流水表行 */
39
+ export interface EconomyTransactionRow {
40
+ id: string;
41
+ transaction_type: string;
42
+ actor_id: string;
43
+ source_player_id?: string;
44
+ target_player_id?: string;
45
+ amount: number;
46
+ balance_before?: number;
47
+ balance_after?: number;
48
+ reference_type: string;
49
+ reference_id: string;
50
+ reason: string;
51
+ created_at: number;
52
+ idempotency_key: string;
53
+ /** JS-side alias fields used by domain/economy.ts */
54
+ actorId?: string;
55
+ type?: string;
56
+ referenceType?: string;
57
+ referenceId?: string;
58
+ sourcePlayerName?: string;
59
+ targetPlayerName?: string;
60
+ }
17
61
  /** query 兼容格式:string / SQLStatement / { sql, values } */
18
62
  export type AnyQuery = (sql: string | SQLStatement | {
19
63
  sql: string;
@@ -21,6 +65,44 @@ export type AnyQuery = (sql: string | SQLStatement | {
21
65
  }, values?: unknown[]) => unknown[] | {
22
66
  changes: number | bigint;
23
67
  };
68
+ /**
69
+ * 经济账户 DB 行(snake_case,对应 sfmc_economy_accounts)。
70
+ * 业务域类型由本模块维护,不再依赖 sdk/contracts。
71
+ */
72
+ export interface EconomyAccountRow {
73
+ player_id: string;
74
+ player_name_snapshot: string;
75
+ balance: number;
76
+ version: number;
77
+ created_at: number;
78
+ updated_at: number;
79
+ }
80
+ /**
81
+ * 经济交易流水 DB 行(snake_case,对应 sfmc_economy_transactions)。
82
+ * 含历史 JS 侧别名字段,供调用方兼容读取。
83
+ */
84
+ export interface EconomyTransactionRow {
85
+ id: string;
86
+ transaction_type: string;
87
+ actor_id: string;
88
+ source_player_id?: string;
89
+ target_player_id?: string;
90
+ amount: number;
91
+ balance_before?: number;
92
+ balance_after?: number;
93
+ reference_type: string;
94
+ reference_id: string;
95
+ reason: string;
96
+ created_at: number;
97
+ idempotency_key: string;
98
+ /** JS-side alias fields used by domain/economy.ts */
99
+ actorId?: string;
100
+ type?: string;
101
+ referenceType?: string;
102
+ referenceId?: string;
103
+ sourcePlayerName?: string;
104
+ targetPlayerName?: string;
105
+ }
24
106
  export interface EconomyAccountView {
25
107
  playerId: string;
26
108
  playerName: string;
@@ -82,7 +164,6 @@ export declare function applyEconomySteps(query: AnyQuery, data: ApplyEconomyInp
82
164
  export declare function applyEconomyTransaction(query: AnyQuery, db: DatabaseSync, data: ApplyEconomyInput, opts?: {
83
165
  alreadyInTx?: boolean;
84
166
  }): ApplyEconomyResult;
85
- export type { EconomyAccountRow, EconomyTransactionRow };
86
167
  /** 列出日常任务(默认仅 active 且未过期) */
87
168
  export declare function listDailyTasks(query: AnyQuery, filter?: {
88
169
  status?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"economy.d.ts","sourceRoot":"","sources":["../../src/domain/economy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"economy.d.ts","sourceRoot":"","sources":["../../src/domain/economy.ts"],"names":[],"mappings":"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"}