aifastdb 2.2.2 → 2.2.7

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 (120) hide show
  1. package/aifastdb.win32-x64-msvc.node +0 -0
  2. package/dist/carpool/benchmark.d.ts +9 -0
  3. package/dist/carpool/benchmark.d.ts.map +1 -0
  4. package/dist/carpool/benchmark.js +310 -0
  5. package/dist/carpool/benchmark.js.map +1 -0
  6. package/dist/carpool/carpool-credit.d.ts +124 -0
  7. package/dist/carpool/carpool-credit.d.ts.map +1 -0
  8. package/dist/carpool/carpool-credit.js +202 -0
  9. package/dist/carpool/carpool-credit.js.map +1 -0
  10. package/dist/carpool/carpool-index.d.ts +71 -0
  11. package/dist/carpool/carpool-index.d.ts.map +1 -0
  12. package/dist/carpool/carpool-index.js +203 -0
  13. package/dist/carpool/carpool-index.js.map +1 -0
  14. package/dist/carpool/carpool-matcher.d.ts +48 -0
  15. package/dist/carpool/carpool-matcher.d.ts.map +1 -0
  16. package/dist/carpool/carpool-matcher.js +133 -0
  17. package/dist/carpool/carpool-matcher.js.map +1 -0
  18. package/dist/carpool/carpool-matcher.test.d.ts +9 -0
  19. package/dist/carpool/carpool-matcher.test.d.ts.map +1 -0
  20. package/dist/carpool/carpool-matcher.test.js +403 -0
  21. package/dist/carpool/carpool-matcher.test.js.map +1 -0
  22. package/dist/carpool/carpool-privacy.d.ts +72 -0
  23. package/dist/carpool/carpool-privacy.d.ts.map +1 -0
  24. package/dist/carpool/carpool-privacy.js +171 -0
  25. package/dist/carpool/carpool-privacy.js.map +1 -0
  26. package/dist/carpool/carpool-repo.d.ts +175 -0
  27. package/dist/carpool/carpool-repo.d.ts.map +1 -0
  28. package/dist/carpool/carpool-repo.js +698 -0
  29. package/dist/carpool/carpool-repo.js.map +1 -0
  30. package/dist/carpool/carpool-repo.test.d.ts +9 -0
  31. package/dist/carpool/carpool-repo.test.d.ts.map +1 -0
  32. package/dist/carpool/carpool-repo.test.js +452 -0
  33. package/dist/carpool/carpool-repo.test.js.map +1 -0
  34. package/dist/carpool/carpool-scheduler.d.ts +68 -0
  35. package/dist/carpool/carpool-scheduler.d.ts.map +1 -0
  36. package/dist/carpool/carpool-scheduler.js +114 -0
  37. package/dist/carpool/carpool-scheduler.js.map +1 -0
  38. package/dist/carpool/carpool-service.d.ts +105 -0
  39. package/dist/carpool/carpool-service.d.ts.map +1 -0
  40. package/dist/carpool/carpool-service.js +372 -0
  41. package/dist/carpool/carpool-service.js.map +1 -0
  42. package/dist/carpool/carpool-service.test.d.ts +9 -0
  43. package/dist/carpool/carpool-service.test.d.ts.map +1 -0
  44. package/dist/carpool/carpool-service.test.js +455 -0
  45. package/dist/carpool/carpool-service.test.js.map +1 -0
  46. package/dist/carpool/carpool-test.d.ts +11 -0
  47. package/dist/carpool/carpool-test.d.ts.map +1 -0
  48. package/dist/carpool/carpool-test.js +387 -0
  49. package/dist/carpool/carpool-test.js.map +1 -0
  50. package/dist/carpool/index.d.ts +42 -0
  51. package/dist/carpool/index.d.ts.map +1 -0
  52. package/dist/carpool/index.js +80 -0
  53. package/dist/carpool/index.js.map +1 -0
  54. package/dist/carpool/privacy-guard.d.ts +69 -0
  55. package/dist/carpool/privacy-guard.d.ts.map +1 -0
  56. package/dist/carpool/privacy-guard.js +211 -0
  57. package/dist/carpool/privacy-guard.js.map +1 -0
  58. package/dist/carpool/report-system.d.ts +106 -0
  59. package/dist/carpool/report-system.d.ts.map +1 -0
  60. package/dist/carpool/report-system.js +212 -0
  61. package/dist/carpool/report-system.js.map +1 -0
  62. package/dist/carpool/trip-index.d.ts +73 -0
  63. package/dist/carpool/trip-index.d.ts.map +1 -0
  64. package/dist/carpool/trip-index.js +269 -0
  65. package/dist/carpool/trip-index.js.map +1 -0
  66. package/dist/carpool/trip-scheduler.d.ts +71 -0
  67. package/dist/carpool/trip-scheduler.d.ts.map +1 -0
  68. package/dist/carpool/trip-scheduler.js +126 -0
  69. package/dist/carpool/trip-scheduler.js.map +1 -0
  70. package/dist/carpool/trust-evaluator.d.ts +27 -0
  71. package/dist/carpool/trust-evaluator.d.ts.map +1 -0
  72. package/dist/carpool/trust-evaluator.js +117 -0
  73. package/dist/carpool/trust-evaluator.js.map +1 -0
  74. package/dist/carpool/types.d.ts +353 -0
  75. package/dist/carpool/types.d.ts.map +1 -0
  76. package/dist/carpool/types.js +71 -0
  77. package/dist/carpool/types.js.map +1 -0
  78. package/dist/carpool/validators.d.ts +25 -0
  79. package/dist/carpool/validators.d.ts.map +1 -0
  80. package/dist/carpool/validators.js +192 -0
  81. package/dist/carpool/validators.js.map +1 -0
  82. package/dist/carpool/vehicle.test.d.ts +8 -0
  83. package/dist/carpool/vehicle.test.d.ts.map +1 -0
  84. package/dist/carpool/vehicle.test.js +540 -0
  85. package/dist/carpool/vehicle.test.js.map +1 -0
  86. package/dist/dev-plan-store.d.ts +104 -0
  87. package/dist/dev-plan-store.d.ts.map +1 -1
  88. package/dist/dev-plan-store.js +331 -34
  89. package/dist/dev-plan-store.js.map +1 -1
  90. package/dist/federation/FederatedDb.d.ts +138 -1
  91. package/dist/federation/FederatedDb.d.ts.map +1 -1
  92. package/dist/federation/FederatedDb.js +158 -0
  93. package/dist/federation/FederatedDb.js.map +1 -1
  94. package/dist/federation/index.d.ts +1 -1
  95. package/dist/federation/index.d.ts.map +1 -1
  96. package/dist/federation/index.js.map +1 -1
  97. package/dist/federation/types.d.ts +136 -4
  98. package/dist/federation/types.d.ts.map +1 -1
  99. package/dist/index.d.ts +1 -1
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +41 -9
  102. package/dist/index.js.map +1 -1
  103. package/dist/mcp-server/index.d.ts +5 -16
  104. package/dist/mcp-server/index.d.ts.map +1 -1
  105. package/dist/mcp-server/index.js +6 -689
  106. package/dist/mcp-server/index.js.map +1 -1
  107. package/dist/security/server/routes.d.ts +46 -0
  108. package/dist/security/server/routes.d.ts.map +1 -1
  109. package/dist/security/server/routes.js +568 -1
  110. package/dist/security/server/routes.js.map +1 -1
  111. package/dist/social-graph-v2.d.ts +7 -0
  112. package/dist/social-graph-v2.d.ts.map +1 -1
  113. package/dist/social-graph-v2.js +10 -0
  114. package/dist/social-graph-v2.js.map +1 -1
  115. package/dist/social-graph.d.ts.map +1 -1
  116. package/dist/social-graph.js +2 -0
  117. package/dist/social-graph.js.map +1 -1
  118. package/dist/social-types.d.ts +4 -0
  119. package/dist/social-types.d.ts.map +1 -1
  120. package/package.json +3 -1
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ /**
3
+ * Carpool Credit System - Reports & Trust Score (T20.4)
4
+ *
5
+ * 评价系统完善:举报机制与信用体系。
6
+ * - 用户可以举报不良行为
7
+ * - 基于评价、举报、完成率等计算信用分
8
+ * - 低信用分用户受到功能限制
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.CarpoolCreditSystem = void 0;
12
+ const types_1 = require("./types");
13
+ // ============================================================================
14
+ // Credit System Class
15
+ // ============================================================================
16
+ const DEFAULT_CREDIT_CONFIG = {
17
+ baseScore: 600,
18
+ ratingBonus: 10,
19
+ ratingPenalty: 20,
20
+ reportPenalty: 50,
21
+ completionWeight: 200,
22
+ banThreshold: 200,
23
+ poorRatingThreshold: 3.0,
24
+ };
25
+ class CarpoolCreditSystem {
26
+ constructor(graph, repo, config) {
27
+ this.graph = graph;
28
+ /** 内存中的举报记录 (生产环境应持久化) */
29
+ this.reports = [];
30
+ this.reportIdCounter = 0;
31
+ /** 封禁列表 */
32
+ this.bannedUsers = new Set();
33
+ this.config = { ...DEFAULT_CREDIT_CONFIG, ...config };
34
+ this.repo = repo;
35
+ }
36
+ // ==========================================================================
37
+ // Report Management
38
+ // ==========================================================================
39
+ /**
40
+ * 提交举报
41
+ */
42
+ submitReport(reporterId, reportedId, tripId, reason, description) {
43
+ // 不能举报自己
44
+ if (reporterId === reportedId) {
45
+ throw new types_1.CarpoolError(types_1.CarpoolErrorCode.INVALID_INPUT, '不能举报自己');
46
+ }
47
+ // 检查是否已举报过同一行程
48
+ const existing = this.reports.find(r => r.reporter_id === reporterId && r.reported_id === reportedId
49
+ && r.trip_id === tripId && r.status === 'pending');
50
+ if (existing) {
51
+ throw new types_1.CarpoolError(types_1.CarpoolErrorCode.INVALID_INPUT, '已提交过相同举报');
52
+ }
53
+ const report = {
54
+ id: `report-${++this.reportIdCounter}`,
55
+ reporter_id: reporterId,
56
+ reported_id: reportedId,
57
+ trip_id: tripId,
58
+ reason,
59
+ description,
60
+ status: 'pending',
61
+ created_at: Date.now(),
62
+ };
63
+ this.reports.push(report);
64
+ return report;
65
+ }
66
+ /**
67
+ * 处理举报(管理员操作)
68
+ */
69
+ handleReport(reportId, confirm) {
70
+ const report = this.reports.find(r => r.id === reportId);
71
+ if (!report) {
72
+ throw new types_1.CarpoolError(types_1.CarpoolErrorCode.INVALID_INPUT, `举报不存在: ${reportId}`);
73
+ }
74
+ report.status = confirm ? 'confirmed' : 'dismissed';
75
+ // 如果确认举报,检查是否需要封禁
76
+ if (confirm) {
77
+ const credit = this.calculateCreditScore(report.reported_id);
78
+ if (credit.score <= this.config.banThreshold) {
79
+ this.bannedUsers.add(report.reported_id);
80
+ }
81
+ }
82
+ return report;
83
+ }
84
+ /**
85
+ * 获取用户的举报记录
86
+ */
87
+ getReportsAgainst(userId) {
88
+ return this.reports.filter(r => r.reported_id === userId);
89
+ }
90
+ /**
91
+ * 获取用户提交的举报
92
+ */
93
+ getReportsBy(userId) {
94
+ return this.reports.filter(r => r.reporter_id === userId);
95
+ }
96
+ /**
97
+ * 获取待处理的举报
98
+ */
99
+ getPendingReports() {
100
+ return this.reports.filter(r => r.status === 'pending');
101
+ }
102
+ // ==========================================================================
103
+ // Credit Score Calculation
104
+ // ==========================================================================
105
+ /**
106
+ * 计算用户信用分
107
+ */
108
+ calculateCreditScore(userId) {
109
+ const cfg = this.config;
110
+ // 1. 获取用户发布的所有行程
111
+ const allTrips = this.repo.getPersonPublishedTrips(userId);
112
+ const completedTrips = allTrips.filter(t => t.properties.status === 'completed');
113
+ const cancelledTrips = allTrips.filter(t => t.properties.status === 'cancelled');
114
+ const totalTrips = allTrips.length;
115
+ // 2. 计算完成率
116
+ const completionRate = totalTrips > 0
117
+ ? completedTrips.length / totalTrips
118
+ : 1.0; // 新用户默认100%
119
+ // 3. 获取评价统计
120
+ let totalRating = 0;
121
+ let ratingCount = 0;
122
+ for (const trip of allTrips) {
123
+ const ratings = this.repo.getTripRatings(trip.id);
124
+ for (const r of ratings) {
125
+ totalRating += r.rating;
126
+ ratingCount++;
127
+ }
128
+ }
129
+ const averageRating = ratingCount > 0 ? totalRating / ratingCount : 3.0;
130
+ // 4. 获取确认的举报数
131
+ const confirmedReports = this.reports.filter(r => r.reported_id === userId && r.status === 'confirmed').length;
132
+ // 5. 计算信用分
133
+ let score = cfg.baseScore;
134
+ // 评价加减分
135
+ if (ratingCount > 0) {
136
+ const goodRatings = Math.max(0, ratingCount * (averageRating - cfg.poorRatingThreshold) / (5 - cfg.poorRatingThreshold));
137
+ const badRatings = Math.max(0, ratingCount - goodRatings);
138
+ score += goodRatings * cfg.ratingBonus;
139
+ score -= badRatings * cfg.ratingPenalty;
140
+ }
141
+ // 完成率加分
142
+ score += completionRate * cfg.completionWeight;
143
+ // 举报扣分
144
+ score -= confirmedReports * cfg.reportPenalty;
145
+ // 约束范围
146
+ score = Math.round(Math.min(1000, Math.max(0, score)));
147
+ // 6. 判断等级
148
+ const level = this.scoreToLevel(score);
149
+ const isBanned = this.bannedUsers.has(userId) || score <= cfg.banThreshold;
150
+ return {
151
+ score,
152
+ level,
153
+ average_rating: Math.round(averageRating * 100) / 100,
154
+ rating_count: ratingCount,
155
+ completion_rate: Math.round(completionRate * 1000) / 1000,
156
+ confirmed_reports: confirmedReports,
157
+ total_trips: totalTrips,
158
+ completed_trips: completedTrips.length,
159
+ cancelled_trips: cancelledTrips.length,
160
+ is_banned: isBanned,
161
+ };
162
+ }
163
+ /**
164
+ * 检查用户是否被封禁
165
+ */
166
+ isBanned(userId) {
167
+ return this.bannedUsers.has(userId);
168
+ }
169
+ /**
170
+ * 手动封禁/解封
171
+ */
172
+ setBanned(userId, banned) {
173
+ if (banned) {
174
+ this.bannedUsers.add(userId);
175
+ }
176
+ else {
177
+ this.bannedUsers.delete(userId);
178
+ }
179
+ }
180
+ /**
181
+ * 获取所有被封禁的用户
182
+ */
183
+ getBannedUsers() {
184
+ return [...this.bannedUsers];
185
+ }
186
+ // ==========================================================================
187
+ // Internal
188
+ // ==========================================================================
189
+ scoreToLevel(score) {
190
+ if (score >= 800)
191
+ return 'excellent';
192
+ if (score >= 650)
193
+ return 'good';
194
+ if (score >= 400)
195
+ return 'normal';
196
+ if (score > 200)
197
+ return 'poor';
198
+ return 'banned';
199
+ }
200
+ }
201
+ exports.CarpoolCreditSystem = CarpoolCreditSystem;
202
+ //# sourceMappingURL=carpool-credit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carpool-credit.js","sourceRoot":"","sources":["../../ts/carpool/carpool-credit.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAKH,mCAAyE;AAoFzE,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E,MAAM,qBAAqB,GAA2B;IACpD,SAAS,EAAE,GAAG;IACd,WAAW,EAAE,EAAE;IACf,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,EAAE;IACjB,gBAAgB,EAAE,GAAG;IACrB,YAAY,EAAE,GAAG;IACjB,mBAAmB,EAAE,GAAG;CACzB,CAAC;AAEF,MAAa,mBAAmB;IAW9B,YACU,KAAoB,EAC5B,IAAuB,EACvB,MAAqB;QAFb,UAAK,GAAL,KAAK,CAAe;QAR9B,0BAA0B;QAClB,YAAO,GAAa,EAAE,CAAC;QACvB,oBAAe,GAAG,CAAC,CAAC;QAE5B,WAAW;QACH,gBAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QAOtC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,qBAAqB,EAAE,GAAG,MAAM,EAAE,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,6EAA6E;IAC7E,oBAAoB;IACpB,6EAA6E;IAE7E;;OAEG;IACH,YAAY,CACV,UAAkB,EAClB,UAAkB,EAClB,MAAc,EACd,MAAoB,EACpB,WAAoB;QAEpB,SAAS;QACT,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;YAC9B,MAAM,IAAI,oBAAY,CAAC,wBAAgB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QACnE,CAAC;QAED,eAAe;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAChC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,UAAU,IAAI,CAAC,CAAC,WAAW,KAAK,UAAU;eAC5D,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CACpD,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,oBAAY,CAAC,wBAAgB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,MAAM,GAAW;YACrB,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE;YACtC,WAAW,EAAE,UAAU;YACvB,WAAW,EAAE,UAAU;YACvB,OAAO,EAAE,MAAM;YACf,MAAM;YACN,WAAW;YACX,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;SACvB,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,QAAgB,EAAE,OAAgB;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,oBAAY,CAAC,wBAAgB,CAAC,aAAa,EAAE,UAAU,QAAQ,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;QAEpD,kBAAkB;QAClB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC7D,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;gBAC7C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,MAAc;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,MAAc;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED,6EAA6E;IAC7E,2BAA2B;IAC3B,6EAA6E;IAE7E;;OAEG;IACH,oBAAoB,CAAC,MAAc;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QAExB,iBAAiB;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAC3D,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;QACjF,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;QACjF,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;QAEnC,WAAW;QACX,MAAM,cAAc,GAAG,UAAU,GAAG,CAAC;YACnC,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,UAAU;YACpC,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY;QAErB,YAAY;QACZ,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,WAAW,IAAI,CAAC,CAAC,MAAM,CAAC;gBACxB,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;QACD,MAAM,aAAa,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;QAExE,cAAc;QACd,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,CAC1D,CAAC,MAAM,CAAC;QAET,WAAW;QACX,IAAI,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC;QAE1B,QAAQ;QACR,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,aAAa,GAAG,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACzH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC,CAAC;YAC1D,KAAK,IAAI,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;YACvC,KAAK,IAAI,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC;QAC1C,CAAC;QAED,QAAQ;QACR,KAAK,IAAI,cAAc,GAAG,GAAG,CAAC,gBAAgB,CAAC;QAE/C,OAAO;QACP,KAAK,IAAI,gBAAgB,GAAG,GAAG,CAAC,aAAa,CAAC;QAE9C,OAAO;QACP,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAEvD,UAAU;QACV,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,YAAY,CAAC;QAE3E,OAAO;YACL,KAAK;YACL,KAAK;YACL,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,GAAG,GAAG;YACrD,YAAY,EAAE,WAAW;YACzB,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,IAAI;YACzD,iBAAiB,EAAE,gBAAgB;YACnC,WAAW,EAAE,UAAU;YACvB,eAAe,EAAE,cAAc,CAAC,MAAM;YACtC,eAAe,EAAE,cAAc,CAAC,MAAM;YACtC,SAAS,EAAE,QAAQ;SACpB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,MAAc;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAAc,EAAE,MAAe;QACvC,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,6EAA6E;IAC7E,WAAW;IACX,6EAA6E;IAErE,YAAY,CAAC,KAAa;QAChC,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,WAAW,CAAC;QACrC,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,MAAM,CAAC;QAChC,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,QAAQ,CAAC;QAClC,IAAI,KAAK,GAAG,GAAG;YAAE,OAAO,MAAM,CAAC;QAC/B,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AA1ND,kDA0NC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Carpool Trip Index - In-Memory Indexing Layer (T20.1)
3
+ *
4
+ * 为拼车行程提供内存索引,避免全量扫描。
5
+ * 支持按 departure_date、origin_city、destination_province、status 快速检索。
6
+ *
7
+ * 索引在首次查询时惰性构建,写操作自动维护索引一致性。
8
+ */
9
+ import type { CarpoolTrip, TripStatus } from './types';
10
+ export declare class TripIndex {
11
+ /** departure_date → Set<tripId> */
12
+ private dateIdx;
13
+ /** origin.city → Set<tripId> */
14
+ private originCityIdx;
15
+ /** destination.province → Set<tripId> */
16
+ private destProvinceIdx;
17
+ /** destination.city → Set<tripId> */
18
+ private destCityIdx;
19
+ /** origin.province → Set<tripId> */
20
+ private originProvinceIdx;
21
+ /** status → Set<tripId> */
22
+ private statusIdx;
23
+ /** trip_type → Set<tripId> */
24
+ private typeIdx;
25
+ /** "origin_city|dest_province" → Set<tripId> (复合路线索引) */
26
+ private routeIdx;
27
+ /** 所有已索引的 tripId */
28
+ private allIds;
29
+ /** 是否已从外部数据源完成初始构建 */
30
+ private _built;
31
+ get isBuilt(): boolean;
32
+ get size(): number;
33
+ /**
34
+ * 从一批行程批量构建索引(仅首次调用有效,后续通过增量维护)
35
+ */
36
+ buildFrom(trips: CarpoolTrip[]): void;
37
+ /** 添加/更新行程到索引 */
38
+ addOrUpdate(trip: CarpoolTrip): void;
39
+ /** 从索引中移除行程 */
40
+ remove(tripId: string): void;
41
+ /** 按日期查询 */
42
+ getByDate(date: string): Set<string>;
43
+ /** 按日期范围查询 */
44
+ getByDateRange(from: string, to: string): Set<string>;
45
+ /** 按出发城市查询 */
46
+ getByOriginCity(city: string): Set<string>;
47
+ /** 按出发省份查询 */
48
+ getByOriginProvince(province: string): Set<string>;
49
+ /** 按目的城市查询 */
50
+ getByDestCity(city: string): Set<string>;
51
+ /** 按目的省份查询 */
52
+ getByDestProvince(province: string): Set<string>;
53
+ /** 按状态查询 */
54
+ getByStatus(status: TripStatus): Set<string>;
55
+ /** 按行程类型查询 */
56
+ getByType(type: string): Set<string>;
57
+ /** 按复合路线查询 */
58
+ getByRoute(originCity: string, destProvince: string): Set<string>;
59
+ /** 获取所有已索引 ID */
60
+ getAllIds(): Set<string>;
61
+ /**
62
+ * 多条件交集查询:返回同时满足所有条件的 tripId 集合
63
+ */
64
+ intersect(...sets: (Set<string> | null | undefined)[]): Set<string>;
65
+ /** 获取索引统计信息 */
66
+ getStats(): Record<string, number>;
67
+ private addToIndex;
68
+ private removeById;
69
+ private addToMap;
70
+ }
71
+ //# sourceMappingURL=carpool-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carpool-index.d.ts","sourceRoot":"","sources":["../../ts/carpool/carpool-index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAgBvD,qBAAa,SAAS;IACpB,mCAAmC;IACnC,OAAO,CAAC,OAAO,CAAkC;IACjD,gCAAgC;IAChC,OAAO,CAAC,aAAa,CAAkC;IACvD,yCAAyC;IACzC,OAAO,CAAC,eAAe,CAAkC;IACzD,qCAAqC;IACrC,OAAO,CAAC,WAAW,CAAkC;IACrD,oCAAoC;IACpC,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,2BAA2B;IAC3B,OAAO,CAAC,SAAS,CAAkC;IACnD,8BAA8B;IAC9B,OAAO,CAAC,OAAO,CAAkC;IACjD,yDAAyD;IACzD,OAAO,CAAC,QAAQ,CAAkC;IAElD,oBAAoB;IACpB,OAAO,CAAC,MAAM,CAAqB;IAEnC,sBAAsB;IACtB,OAAO,CAAC,MAAM,CAAS;IAEvB,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAMD;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI;IAYrC,iBAAiB;IACjB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAQpC,eAAe;IACf,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ5B,YAAY;IACZ,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAIpC,cAAc;IACd,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAUrD,cAAc;IACd,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAI1C,cAAc;IACd,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAIlD,cAAc;IACd,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAIxC,cAAc;IACd,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAIhD,YAAY;IACZ,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC;IAI5C,cAAc;IACd,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAIpC,cAAc;IACd,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAIjE,iBAAiB;IACjB,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC;IAIxB;;OAEG;IACH,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;IAkBnE,eAAe;IACf,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAelC,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,QAAQ;CAQjB"}
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ /**
3
+ * Carpool Trip Index - In-Memory Indexing Layer (T20.1)
4
+ *
5
+ * 为拼车行程提供内存索引,避免全量扫描。
6
+ * 支持按 departure_date、origin_city、destination_province、status 快速检索。
7
+ *
8
+ * 索引在首次查询时惰性构建,写操作自动维护索引一致性。
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.TripIndex = void 0;
12
+ // ============================================================================
13
+ // Index Key Generators
14
+ // ============================================================================
15
+ /** 复合路线键: "origin_city|dest_province" */
16
+ function routeKey(originCity, destProvince) {
17
+ return `${originCity}|${destProvince}`;
18
+ }
19
+ // ============================================================================
20
+ // TripIndex Class
21
+ // ============================================================================
22
+ class TripIndex {
23
+ constructor() {
24
+ /** departure_date → Set<tripId> */
25
+ this.dateIdx = new Map();
26
+ /** origin.city → Set<tripId> */
27
+ this.originCityIdx = new Map();
28
+ /** destination.province → Set<tripId> */
29
+ this.destProvinceIdx = new Map();
30
+ /** destination.city → Set<tripId> */
31
+ this.destCityIdx = new Map();
32
+ /** origin.province → Set<tripId> */
33
+ this.originProvinceIdx = new Map();
34
+ /** status → Set<tripId> */
35
+ this.statusIdx = new Map();
36
+ /** trip_type → Set<tripId> */
37
+ this.typeIdx = new Map();
38
+ /** "origin_city|dest_province" → Set<tripId> (复合路线索引) */
39
+ this.routeIdx = new Map();
40
+ /** 所有已索引的 tripId */
41
+ this.allIds = new Set();
42
+ /** 是否已从外部数据源完成初始构建 */
43
+ this._built = false;
44
+ }
45
+ get isBuilt() {
46
+ return this._built;
47
+ }
48
+ get size() {
49
+ return this.allIds.size;
50
+ }
51
+ // ==========================================================================
52
+ // Bulk Build
53
+ // ==========================================================================
54
+ /**
55
+ * 从一批行程批量构建索引(仅首次调用有效,后续通过增量维护)
56
+ */
57
+ buildFrom(trips) {
58
+ if (this._built)
59
+ return;
60
+ for (const trip of trips) {
61
+ this.addToIndex(trip);
62
+ }
63
+ this._built = true;
64
+ }
65
+ // ==========================================================================
66
+ // Incremental Maintenance
67
+ // ==========================================================================
68
+ /** 添加/更新行程到索引 */
69
+ addOrUpdate(trip) {
70
+ // 如果已存在,先移除旧索引
71
+ if (this.allIds.has(trip.id)) {
72
+ this.removeById(trip.id);
73
+ }
74
+ this.addToIndex(trip);
75
+ }
76
+ /** 从索引中移除行程 */
77
+ remove(tripId) {
78
+ this.removeById(tripId);
79
+ }
80
+ // ==========================================================================
81
+ // Indexed Lookup
82
+ // ==========================================================================
83
+ /** 按日期查询 */
84
+ getByDate(date) {
85
+ return this.dateIdx.get(date) ?? new Set();
86
+ }
87
+ /** 按日期范围查询 */
88
+ getByDateRange(from, to) {
89
+ const result = new Set();
90
+ for (const [date, ids] of this.dateIdx) {
91
+ if (date >= from && date <= to) {
92
+ for (const id of ids)
93
+ result.add(id);
94
+ }
95
+ }
96
+ return result;
97
+ }
98
+ /** 按出发城市查询 */
99
+ getByOriginCity(city) {
100
+ return this.originCityIdx.get(city) ?? new Set();
101
+ }
102
+ /** 按出发省份查询 */
103
+ getByOriginProvince(province) {
104
+ return this.originProvinceIdx.get(province) ?? new Set();
105
+ }
106
+ /** 按目的城市查询 */
107
+ getByDestCity(city) {
108
+ return this.destCityIdx.get(city) ?? new Set();
109
+ }
110
+ /** 按目的省份查询 */
111
+ getByDestProvince(province) {
112
+ return this.destProvinceIdx.get(province) ?? new Set();
113
+ }
114
+ /** 按状态查询 */
115
+ getByStatus(status) {
116
+ return this.statusIdx.get(status) ?? new Set();
117
+ }
118
+ /** 按行程类型查询 */
119
+ getByType(type) {
120
+ return this.typeIdx.get(type) ?? new Set();
121
+ }
122
+ /** 按复合路线查询 */
123
+ getByRoute(originCity, destProvince) {
124
+ return this.routeIdx.get(routeKey(originCity, destProvince)) ?? new Set();
125
+ }
126
+ /** 获取所有已索引 ID */
127
+ getAllIds() {
128
+ return new Set(this.allIds);
129
+ }
130
+ /**
131
+ * 多条件交集查询:返回同时满足所有条件的 tripId 集合
132
+ */
133
+ intersect(...sets) {
134
+ const validSets = sets.filter((s) => s != null && s.size > 0);
135
+ if (validSets.length === 0)
136
+ return new Set(this.allIds);
137
+ // 从最小集合开始交
138
+ validSets.sort((a, b) => a.size - b.size);
139
+ const result = new Set(validSets[0]);
140
+ for (let i = 1; i < validSets.length; i++) {
141
+ for (const id of result) {
142
+ if (!validSets[i].has(id)) {
143
+ result.delete(id);
144
+ }
145
+ }
146
+ if (result.size === 0)
147
+ break;
148
+ }
149
+ return result;
150
+ }
151
+ /** 获取索引统计信息 */
152
+ getStats() {
153
+ return {
154
+ total_indexed: this.allIds.size,
155
+ date_buckets: this.dateIdx.size,
156
+ origin_city_buckets: this.originCityIdx.size,
157
+ dest_province_buckets: this.destProvinceIdx.size,
158
+ status_buckets: this.statusIdx.size,
159
+ route_buckets: this.routeIdx.size,
160
+ };
161
+ }
162
+ // ==========================================================================
163
+ // Internal Helpers
164
+ // ==========================================================================
165
+ addToIndex(trip) {
166
+ const id = trip.id;
167
+ const p = trip.properties;
168
+ this.allIds.add(id);
169
+ this.addToMap(this.dateIdx, p.departure_date, id);
170
+ this.addToMap(this.originCityIdx, p.origin.city, id);
171
+ this.addToMap(this.originProvinceIdx, p.origin.province, id);
172
+ this.addToMap(this.destCityIdx, p.destination.city, id);
173
+ this.addToMap(this.destProvinceIdx, p.destination.province, id);
174
+ this.addToMap(this.statusIdx, p.status, id);
175
+ this.addToMap(this.typeIdx, p.trip_type, id);
176
+ this.addToMap(this.routeIdx, routeKey(p.origin.city, p.destination.province), id);
177
+ }
178
+ removeById(tripId) {
179
+ if (!this.allIds.has(tripId))
180
+ return;
181
+ this.allIds.delete(tripId);
182
+ // 从所有索引中移除
183
+ for (const idx of [
184
+ this.dateIdx, this.originCityIdx, this.originProvinceIdx,
185
+ this.destCityIdx, this.destProvinceIdx, this.statusIdx,
186
+ this.typeIdx, this.routeIdx,
187
+ ]) {
188
+ for (const [, set] of idx) {
189
+ set.delete(tripId);
190
+ }
191
+ }
192
+ }
193
+ addToMap(map, key, id) {
194
+ let set = map.get(key);
195
+ if (!set) {
196
+ set = new Set();
197
+ map.set(key, set);
198
+ }
199
+ set.add(id);
200
+ }
201
+ }
202
+ exports.TripIndex = TripIndex;
203
+ //# sourceMappingURL=carpool-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carpool-index.js","sourceRoot":"","sources":["../../ts/carpool/carpool-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Carpool Matcher - Matching Engine
3
+ *
4
+ * 拼车匹配引擎:过滤、评分、排序。
5
+ * 综合社交信任度、历史评分、路线匹配度、发布时间来排序搜索结果。
6
+ */
7
+ import type { CarpoolTrip, Location, MatchResult, SearchTripsFilter, TrustScore } from './types';
8
+ /** 匹配排序权重配置 */
9
+ export interface MatchWeights {
10
+ /** 社交信任度权重(默认 0.4) */
11
+ trust: number;
12
+ /** 历史评分权重(默认 0.3) */
13
+ rating: number;
14
+ /** 路线匹配度权重(默认 0.2) */
15
+ route: number;
16
+ /** 发布时间新鲜度权重(默认 0.1) */
17
+ freshness: number;
18
+ }
19
+ export declare class CarpoolMatcher {
20
+ private weights;
21
+ constructor(weights?: Partial<MatchWeights>);
22
+ /**
23
+ * 计算路线匹配度(0~1)
24
+ *
25
+ * 匹配规则:出发地和目的地各占 50%
26
+ * - 区级匹配:100%
27
+ * - 市级匹配:80%
28
+ * - 省级匹配:60%
29
+ * - 不匹配:0%
30
+ */
31
+ calculateRouteMatch(tripOrigin: Location, tripDest: Location, filterOrigin?: Partial<Location>, filterDest?: Partial<Location>): number;
32
+ /**
33
+ * 计算综合匹配分数(0~100)
34
+ */
35
+ calculateMatchScore(trip: CarpoolTrip, trustScore: TrustScore, personRating: number, filter?: SearchTripsFilter): {
36
+ score: number;
37
+ reasons: string[];
38
+ };
39
+ /**
40
+ * 对匹配结果排序
41
+ */
42
+ rankResults(results: MatchResult[]): MatchResult[];
43
+ /**
44
+ * 计算位置匹配度(0~1)
45
+ */
46
+ private locationMatch;
47
+ }
48
+ //# sourceMappingURL=carpool-matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carpool-matcher.d.ts","sourceRoot":"","sources":["../../ts/carpool/carpool-matcher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,UAAU,EACX,MAAM,SAAS,CAAC;AAMjB,eAAe;AACf,MAAM,WAAW,YAAY;IAC3B,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAaD,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAe;gBAElB,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC;IAI3C;;;;;;;;OAQG;IACH,mBAAmB,CACjB,UAAU,EAAE,QAAQ,EACpB,QAAQ,EAAE,QAAQ,EAClB,YAAY,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAChC,UAAU,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,GAC7B,MAAM;IAcT;;OAEG;IACH,mBAAmB,CACjB,IAAI,EAAE,WAAW,EACjB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,iBAAiB,GACzB;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE;IAmDvC;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IAQlD;;OAEG;IACH,OAAO,CAAC,aAAa;CA4BtB"}