@geoly-ai/social-hub-core 0.0.4 → 0.0.6
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.
- package/dist/activity.d.ts +138 -0
- package/dist/activity.d.ts.map +1 -0
- package/dist/activity.js +577 -0
- package/dist/activity.js.map +1 -0
- package/dist/activity.test.d.ts +2 -0
- package/dist/activity.test.d.ts.map +1 -0
- package/dist/activity.test.js +430 -0
- package/dist/activity.test.js.map +1 -0
- package/dist/client-delivery-config.d.ts +26 -0
- package/dist/client-delivery-config.d.ts.map +1 -0
- package/dist/client-delivery-config.js +40 -0
- package/dist/client-delivery-config.js.map +1 -0
- package/dist/client-delivery-config.test.d.ts +2 -0
- package/dist/client-delivery-config.test.d.ts.map +1 -0
- package/dist/client-delivery-config.test.js +36 -0
- package/dist/client-delivery-config.test.js.map +1 -0
- package/dist/content-review-scoring.d.ts +67 -0
- package/dist/content-review-scoring.d.ts.map +1 -0
- package/dist/content-review-scoring.js +128 -0
- package/dist/content-review-scoring.js.map +1 -0
- package/dist/content-review-scoring.test.d.ts +2 -0
- package/dist/content-review-scoring.test.d.ts.map +1 -0
- package/dist/content-review-scoring.test.js +109 -0
- package/dist/content-review-scoring.test.js.map +1 -0
- package/dist/errors.d.ts +3 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +7 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/notification-sources/field-paths.d.ts +93 -0
- package/dist/notification-sources/field-paths.d.ts.map +1 -0
- package/dist/notification-sources/field-paths.js +86 -0
- package/dist/notification-sources/field-paths.js.map +1 -0
- package/dist/notification-sources/field-set.d.ts +46 -0
- package/dist/notification-sources/field-set.d.ts.map +1 -0
- package/dist/notification-sources/field-set.js +178 -0
- package/dist/notification-sources/field-set.js.map +1 -0
- package/dist/notification-sources/index.d.ts +13 -0
- package/dist/notification-sources/index.d.ts.map +1 -0
- package/dist/notification-sources/index.js +13 -0
- package/dist/notification-sources/index.js.map +1 -0
- package/dist/notification-sources/notification-sources.test.d.ts +2 -0
- package/dist/notification-sources/notification-sources.test.d.ts.map +1 -0
- package/dist/notification-sources/notification-sources.test.js +211 -0
- package/dist/notification-sources/notification-sources.test.js.map +1 -0
- package/dist/notification-sources/post-performance-node-runtime.d.ts +155 -0
- package/dist/notification-sources/post-performance-node-runtime.d.ts.map +1 -0
- package/dist/notification-sources/post-performance-node-runtime.js +158 -0
- package/dist/notification-sources/post-performance-node-runtime.js.map +1 -0
- package/dist/notification-sources/post-performance-node-runtime.test.d.ts +2 -0
- package/dist/notification-sources/post-performance-node-runtime.test.d.ts.map +1 -0
- package/dist/notification-sources/post-performance-node-runtime.test.js +182 -0
- package/dist/notification-sources/post-performance-node-runtime.test.js.map +1 -0
- package/dist/notification-sources/post-performance-node.d.ts +34 -0
- package/dist/notification-sources/post-performance-node.d.ts.map +1 -0
- package/dist/notification-sources/post-performance-node.js +437 -0
- package/dist/notification-sources/post-performance-node.js.map +1 -0
- package/dist/notification-sources/registry.d.ts +27 -0
- package/dist/notification-sources/registry.d.ts.map +1 -0
- package/dist/notification-sources/registry.js +222 -0
- package/dist/notification-sources/registry.js.map +1 -0
- package/dist/notification-sources/source-definition.d.ts +97 -0
- package/dist/notification-sources/source-definition.d.ts.map +1 -0
- package/dist/notification-sources/source-definition.js +30 -0
- package/dist/notification-sources/source-definition.js.map +1 -0
- package/dist/openclaw-config.d.ts +9 -0
- package/dist/openclaw-config.d.ts.map +1 -1
- package/dist/openclaw-config.js +17 -0
- package/dist/openclaw-config.js.map +1 -1
- package/dist/openclaw-config.test.d.ts +2 -0
- package/dist/openclaw-config.test.d.ts.map +1 -0
- package/dist/openclaw-config.test.js +49 -0
- package/dist/openclaw-config.test.js.map +1 -0
- package/package.json +1 -1
package/dist/activity.js
ADDED
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 互动时序去同质化(需求 v5)的 Hub 侧纯函数层:
|
|
3
|
+
* canonical event payload 校验、civil-time 归日、recentActivitySummary 聚合、
|
|
4
|
+
* effectiveTimezone 计算。全部无 IO,便于 §11.4 fixture 逐条验收。
|
|
5
|
+
*
|
|
6
|
+
* 口径来源:openclaw-template docs/reddit-interaction-timing-hub-requirements-2026-07.md
|
|
7
|
+
* §4.3 + 实现方裁决(飞书评论 7662423677899656150):
|
|
8
|
+
* - occurredAt(带 offset 绝对时刻)为权威,eventTimezone 仅用于归日;
|
|
9
|
+
* - 三元组去重=整条 event 去重;
|
|
10
|
+
* - 历史无 eventTimezone 且当前时区 unknown → 不做逐日归属。
|
|
11
|
+
*/
|
|
12
|
+
export const CANONICAL_EVENT_SCHEMA_VERSION = 1;
|
|
13
|
+
/** 需求A:canonical v2 —— 允许 eventTimezone null + timezoneKnown。v1 语义不变。 */
|
|
14
|
+
export const CANONICAL_EVENT_SCHEMA_VERSION_V2 = 2;
|
|
15
|
+
export const SUPPORTED_CANONICAL_VERSIONS = [
|
|
16
|
+
CANONICAL_EVENT_SCHEMA_VERSION,
|
|
17
|
+
CANONICAL_EVENT_SCHEMA_VERSION_V2,
|
|
18
|
+
];
|
|
19
|
+
/** 需求A:执行/环境行为健康事件类型(interaction_events.type,非普通互动事件)。 */
|
|
20
|
+
export const INTERACTION_ACTION_OUTCOME_TYPE = "interaction_action_outcome";
|
|
21
|
+
export const CANONICAL_ACTION_KINDS = [
|
|
22
|
+
"browse",
|
|
23
|
+
"like",
|
|
24
|
+
"comment",
|
|
25
|
+
"reply",
|
|
26
|
+
"session_start",
|
|
27
|
+
"planned",
|
|
28
|
+
"skipped",
|
|
29
|
+
];
|
|
30
|
+
/** 计入 session/action 的真实动作(§4.3④);planned/skipped/session_start 不计。 */
|
|
31
|
+
const SESSION_ACTION_KINDS = new Set([
|
|
32
|
+
"browse",
|
|
33
|
+
"like",
|
|
34
|
+
"comment",
|
|
35
|
+
"reply",
|
|
36
|
+
]);
|
|
37
|
+
const CANONICAL_KEYS = [
|
|
38
|
+
"occurredAt",
|
|
39
|
+
"eventTimezone",
|
|
40
|
+
"actionKind",
|
|
41
|
+
"eventSchemaVersion",
|
|
42
|
+
"runId",
|
|
43
|
+
"sessionId",
|
|
44
|
+
"jobId",
|
|
45
|
+
];
|
|
46
|
+
/** 补录延迟上限:occurredAt 不得早于写入时刻 48h(否则 createdAt 索引查询会漏聚合)。 */
|
|
47
|
+
export const CANONICAL_MAX_BACKFILL_MS = 48 * 60 * 60 * 1000;
|
|
48
|
+
/** 允许的时钟漂移:occurredAt 不得晚于写入时刻 15min。 */
|
|
49
|
+
export const CANONICAL_MAX_FUTURE_SKEW_MS = 15 * 60 * 1000;
|
|
50
|
+
export function isValidIanaTimezone(tz) {
|
|
51
|
+
if (typeof tz !== "string" || tz.length === 0 || tz.length > 64)
|
|
52
|
+
return false;
|
|
53
|
+
try {
|
|
54
|
+
new Intl.DateTimeFormat("en-US", { timeZone: tz });
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** ISO8601 且显式携带 offset(Z 或 ±hh:mm)——本地时间无 offset 拒绝。 */
|
|
62
|
+
function isIsoWithOffset(value) {
|
|
63
|
+
if (typeof value !== "string")
|
|
64
|
+
return false;
|
|
65
|
+
if (!/(Z|[+-]\d{2}:?\d{2})$/.test(value))
|
|
66
|
+
return false;
|
|
67
|
+
return !Number.isNaN(Date.parse(value));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* canonical 全组校验(v5 终审②:禁止半 canonical 事件):
|
|
71
|
+
* - 7 个 canonical 键全缺 → legacy 事件,放行(向后兼容);
|
|
72
|
+
* - 任一出现 → occurredAt/eventTimezone/actionKind/eventSchemaVersion/jobId
|
|
73
|
+
* 必须完整合法;runId/sessionId 可选。
|
|
74
|
+
* API contract 层与 DB service 层(worker/import 直写路径)共用本函数。
|
|
75
|
+
*/
|
|
76
|
+
export function validateCanonicalEventPayload(payload, opts) {
|
|
77
|
+
// 复核修复(P1):interaction_action_outcome 不允许 legacy 短路——空 payload/
|
|
78
|
+
// 无 canonical 键即拒,否则 {type:"interaction_action_outcome"} 裸事件绕过全部
|
|
79
|
+
// 交叉校验混进读模型分母。
|
|
80
|
+
const isOutcomeType = opts?.eventType === INTERACTION_ACTION_OUTCOME_TYPE;
|
|
81
|
+
if (!payload) {
|
|
82
|
+
return isOutcomeType
|
|
83
|
+
? {
|
|
84
|
+
ok: false,
|
|
85
|
+
errors: ["interaction_action_outcome requires a canonical payload"],
|
|
86
|
+
}
|
|
87
|
+
: { ok: true, canonical: false };
|
|
88
|
+
}
|
|
89
|
+
const present = CANONICAL_KEYS.filter((k) => payload[k] !== undefined);
|
|
90
|
+
if (present.length === 0) {
|
|
91
|
+
return isOutcomeType
|
|
92
|
+
? {
|
|
93
|
+
ok: false,
|
|
94
|
+
errors: [
|
|
95
|
+
"interaction_action_outcome requires canonical payload fields",
|
|
96
|
+
],
|
|
97
|
+
}
|
|
98
|
+
: { ok: true, canonical: false };
|
|
99
|
+
}
|
|
100
|
+
const errors = [];
|
|
101
|
+
const now = opts?.now ?? new Date();
|
|
102
|
+
if (!isIsoWithOffset(payload["occurredAt"])) {
|
|
103
|
+
errors.push("occurredAt must be an ISO8601 datetime with explicit offset (Z or ±hh:mm)");
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
const t = Date.parse(payload["occurredAt"]);
|
|
107
|
+
if (t < now.getTime() - CANONICAL_MAX_BACKFILL_MS) {
|
|
108
|
+
errors.push("occurredAt exceeds the 48h backfill window");
|
|
109
|
+
}
|
|
110
|
+
if (t > now.getTime() + CANONICAL_MAX_FUTURE_SKEW_MS) {
|
|
111
|
+
errors.push("occurredAt is in the future beyond allowed clock skew");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// eventSchemaVersion 版本集:v1(现状,IANA 时区必填)+ v2(需求A,允许 null 时区
|
|
115
|
+
// + timezoneKnown 交叉校验)。v1 语义完全不变。
|
|
116
|
+
const version = payload["eventSchemaVersion"];
|
|
117
|
+
const isV2 = version === CANONICAL_EVENT_SCHEMA_VERSION_V2;
|
|
118
|
+
if (!SUPPORTED_CANONICAL_VERSIONS.includes(version)) {
|
|
119
|
+
errors.push(`eventSchemaVersion must be one of: ${SUPPORTED_CANONICAL_VERSIONS.join(", ")}`);
|
|
120
|
+
}
|
|
121
|
+
if (isV2) {
|
|
122
|
+
// v2:timezoneKnown 必填布尔;true→有效 IANA;false→eventTimezone 必须 null。
|
|
123
|
+
const tzKnown = payload["timezoneKnown"];
|
|
124
|
+
if (typeof tzKnown !== "boolean") {
|
|
125
|
+
errors.push("timezoneKnown (boolean) is required for v2 canonical events");
|
|
126
|
+
}
|
|
127
|
+
else if (tzKnown) {
|
|
128
|
+
if (!isValidIanaTimezone(payload["eventTimezone"])) {
|
|
129
|
+
errors.push("eventTimezone must be a valid IANA timezone when timezoneKnown=true");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else if (payload["eventTimezone"] !== null) {
|
|
133
|
+
errors.push("eventTimezone must be null when timezoneKnown=false");
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// v1(及未知版本沿用严格 IANA):禁止 UTC 默认毒化外的 null。
|
|
138
|
+
if (!isValidIanaTimezone(payload["eventTimezone"])) {
|
|
139
|
+
errors.push("eventTimezone must be a valid IANA timezone");
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (!CANONICAL_ACTION_KINDS.includes(payload["actionKind"])) {
|
|
143
|
+
errors.push(`actionKind must be one of: ${CANONICAL_ACTION_KINDS.join(", ")}`);
|
|
144
|
+
}
|
|
145
|
+
if (typeof payload["jobId"] !== "string" ||
|
|
146
|
+
payload["jobId"].length === 0) {
|
|
147
|
+
errors.push("jobId (scheduling job UUID) is required for canonical events");
|
|
148
|
+
}
|
|
149
|
+
for (const key of ["runId", "sessionId"]) {
|
|
150
|
+
const v = payload[key];
|
|
151
|
+
// null 视同缺省(附录 A.3 允许 "type":["string","null"])。
|
|
152
|
+
if (v !== undefined &&
|
|
153
|
+
v !== null &&
|
|
154
|
+
(typeof v !== "string" || v.length === 0)) {
|
|
155
|
+
errors.push(`${key} must be a non-empty string when present`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// 需求A:interaction_action_outcome type 追加 outcome 专有字段交叉校验。
|
|
159
|
+
if (opts?.eventType === INTERACTION_ACTION_OUTCOME_TYPE) {
|
|
160
|
+
errors.push(...validateInteractionActionOutcomePayload(payload).errors);
|
|
161
|
+
}
|
|
162
|
+
if (errors.length > 0)
|
|
163
|
+
return { ok: false, errors };
|
|
164
|
+
return { ok: true, canonical: true };
|
|
165
|
+
}
|
|
166
|
+
// ── 需求A:interaction_action_outcome 交叉校验(严格枚举 + 交叉关系闭合)──────
|
|
167
|
+
export const OUTCOME_VALUES = [
|
|
168
|
+
"succeeded",
|
|
169
|
+
"failed",
|
|
170
|
+
"stopped",
|
|
171
|
+
"uncertain",
|
|
172
|
+
];
|
|
173
|
+
/** 终止类 code(A 组,stop=true/retryable=false;STOP_WRITE_UNCERTAIN 例外→uncertain)。 */
|
|
174
|
+
export const OUTCOME_STOP_CODES = [
|
|
175
|
+
"STOP_CHALLENGE",
|
|
176
|
+
"STOP_RATE_LIMIT",
|
|
177
|
+
"STOP_AUTH_REQUIRED",
|
|
178
|
+
"STOP_HIDDEN",
|
|
179
|
+
"STOP_PAGE_UNFOCUSED",
|
|
180
|
+
"STOP_WRITE_UNCERTAIN",
|
|
181
|
+
"STOP_POST_CLICK_NO_CHANGE",
|
|
182
|
+
"STOP_FOCUS_NOT_ACQUIRED",
|
|
183
|
+
"STOP_UPLOAD_FAILED",
|
|
184
|
+
"STOP_UNEXPECTED_NAVIGATION",
|
|
185
|
+
];
|
|
186
|
+
/** 可重试类 code(B 组,stop=false/retryable=true/outcome=failed)。 */
|
|
187
|
+
export const OUTCOME_RETRYABLE_CODES = [
|
|
188
|
+
"TARGET_STALE",
|
|
189
|
+
"TARGET_NOT_FOUND",
|
|
190
|
+
"TARGET_OBSCURED",
|
|
191
|
+
"KEYBOARD_INPUT_FAILED",
|
|
192
|
+
"PAGE_NAVIGATING",
|
|
193
|
+
];
|
|
194
|
+
export const OUTCOME_CODES = [
|
|
195
|
+
"NONE",
|
|
196
|
+
...OUTCOME_STOP_CODES,
|
|
197
|
+
...OUTCOME_RETRYABLE_CODES,
|
|
198
|
+
];
|
|
199
|
+
export const OUTCOME_PHASES = [
|
|
200
|
+
"precondition",
|
|
201
|
+
"target",
|
|
202
|
+
"focus",
|
|
203
|
+
"input",
|
|
204
|
+
"submit",
|
|
205
|
+
"verify",
|
|
206
|
+
"upload",
|
|
207
|
+
];
|
|
208
|
+
export const OUTCOME_METHODS = [
|
|
209
|
+
"coordinate-input",
|
|
210
|
+
"dom-fallback",
|
|
211
|
+
"applescript-upload",
|
|
212
|
+
];
|
|
213
|
+
const STOP_CODE_SET = new Set(OUTCOME_STOP_CODES);
|
|
214
|
+
const RETRYABLE_CODE_SET = new Set(OUTCOME_RETRYABLE_CODES);
|
|
215
|
+
const OUTCOME_CODE_SET = new Set(OUTCOME_CODES);
|
|
216
|
+
const OUTCOME_PHASE_SET = new Set(OUTCOME_PHASES);
|
|
217
|
+
const OUTCOME_METHOD_SET = new Set(OUTCOME_METHODS);
|
|
218
|
+
/**
|
|
219
|
+
* interaction_action_outcome payload 交叉校验(需求A §5.1)。严格枚举 + 交叉关系
|
|
220
|
+
* 完整闭合(非法组合一律拒绝);未知 code 拒绝不静默降级;method=null(JSON null)
|
|
221
|
+
* 仅 precondition/target 未执行输入时允许。纯函数,fixture 可测。
|
|
222
|
+
*/
|
|
223
|
+
export function validateInteractionActionOutcomePayload(payload) {
|
|
224
|
+
const errors = [];
|
|
225
|
+
const outcome = payload["outcome"];
|
|
226
|
+
const ok = payload["ok"];
|
|
227
|
+
const stop = payload["stop"];
|
|
228
|
+
const retryable = payload["retryable"];
|
|
229
|
+
const code = payload["code"];
|
|
230
|
+
const phase = payload["phase"];
|
|
231
|
+
const method = payload["method"];
|
|
232
|
+
if (!OUTCOME_VALUES.includes(outcome)) {
|
|
233
|
+
errors.push(`outcome must be one of: ${OUTCOME_VALUES.join(", ")}`);
|
|
234
|
+
}
|
|
235
|
+
for (const [k, v] of [
|
|
236
|
+
["ok", ok],
|
|
237
|
+
["stop", stop],
|
|
238
|
+
["retryable", retryable],
|
|
239
|
+
]) {
|
|
240
|
+
if (typeof v !== "boolean")
|
|
241
|
+
errors.push(`${k} must be a boolean`);
|
|
242
|
+
}
|
|
243
|
+
if (typeof code !== "string" || !OUTCOME_CODE_SET.has(code)) {
|
|
244
|
+
errors.push(`code must be a known outcome code (got ${String(code)})`);
|
|
245
|
+
}
|
|
246
|
+
if (typeof phase !== "string" || !OUTCOME_PHASE_SET.has(phase)) {
|
|
247
|
+
errors.push(`phase must be one of: ${OUTCOME_PHASES.join(", ")}`);
|
|
248
|
+
}
|
|
249
|
+
// method:JSON null 或三种具体方法之一(禁止字符串 "null"/版本号/路径)。
|
|
250
|
+
if (method !== null && !OUTCOME_METHOD_SET.has(method)) {
|
|
251
|
+
errors.push(`method must be null or one of: ${OUTCOME_METHODS.join(", ")}`);
|
|
252
|
+
}
|
|
253
|
+
// 早退:枚举/类型不合法时不再做交叉校验(避免噪音)。
|
|
254
|
+
if (errors.length > 0)
|
|
255
|
+
return { ok: false, errors };
|
|
256
|
+
const c = code;
|
|
257
|
+
const isStopCode = STOP_CODE_SET.has(c) && c !== "STOP_WRITE_UNCERTAIN";
|
|
258
|
+
// 交叉关系闭合。
|
|
259
|
+
if (ok === true) {
|
|
260
|
+
if (outcome !== "succeeded" ||
|
|
261
|
+
c !== "NONE" ||
|
|
262
|
+
stop !== false ||
|
|
263
|
+
retryable !== false) {
|
|
264
|
+
errors.push("ok=true requires outcome=succeeded, code=NONE, stop=false, retryable=false");
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (c === "NONE" &&
|
|
268
|
+
(ok !== true || outcome !== "succeeded" || stop !== false)) {
|
|
269
|
+
errors.push("code=NONE requires ok=true, outcome=succeeded, stop=false");
|
|
270
|
+
}
|
|
271
|
+
if (isStopCode) {
|
|
272
|
+
if (stop !== true ||
|
|
273
|
+
retryable !== false ||
|
|
274
|
+
outcome !== "stopped" ||
|
|
275
|
+
ok !== false) {
|
|
276
|
+
errors.push(`${c} requires ok=false, stop=true, retryable=false, outcome=stopped`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if (c === "STOP_WRITE_UNCERTAIN") {
|
|
280
|
+
if (ok !== false ||
|
|
281
|
+
stop !== true ||
|
|
282
|
+
retryable !== false ||
|
|
283
|
+
outcome !== "uncertain") {
|
|
284
|
+
errors.push("STOP_WRITE_UNCERTAIN requires ok=false, stop=true, retryable=false, outcome=uncertain");
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
if (RETRYABLE_CODE_SET.has(c)) {
|
|
288
|
+
if (ok !== false ||
|
|
289
|
+
stop !== false ||
|
|
290
|
+
retryable !== true ||
|
|
291
|
+
outcome !== "failed") {
|
|
292
|
+
errors.push(`${c} requires ok=false, stop=false, retryable=true, outcome=failed`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// method=null 只允许尚未执行输入的阶段(precondition/target)。
|
|
296
|
+
if (method === null &&
|
|
297
|
+
(phase === "input" ||
|
|
298
|
+
phase === "submit" ||
|
|
299
|
+
phase === "verify" ||
|
|
300
|
+
phase === "upload")) {
|
|
301
|
+
errors.push(`method must not be null at phase=${phase} (input already executed)`);
|
|
302
|
+
}
|
|
303
|
+
// focusRequired 若提供须为布尔(behavioralHealth focusFailRate 分母,不从 phase 反推)。
|
|
304
|
+
if (payload["focusRequired"] !== undefined &&
|
|
305
|
+
typeof payload["focusRequired"] !== "boolean") {
|
|
306
|
+
errors.push("focusRequired must be a boolean when present");
|
|
307
|
+
}
|
|
308
|
+
return { ok: errors.length === 0, errors };
|
|
309
|
+
}
|
|
310
|
+
/** payload 已含 canonical 字段(occurredAt 在即视为 canonical 行,append-only 依据)。 */
|
|
311
|
+
export function hasCanonicalEventFields(payload) {
|
|
312
|
+
return Boolean(payload && payload["occurredAt"] !== undefined);
|
|
313
|
+
}
|
|
314
|
+
// ── civil time(统一 helper,业务代码禁止散落 formatToParts)──────────────
|
|
315
|
+
const civilFormatterCache = new Map();
|
|
316
|
+
function civilFormatter(timeZone) {
|
|
317
|
+
let f = civilFormatterCache.get(timeZone);
|
|
318
|
+
if (!f) {
|
|
319
|
+
f = new Intl.DateTimeFormat("en-CA", {
|
|
320
|
+
timeZone,
|
|
321
|
+
year: "numeric",
|
|
322
|
+
month: "2-digit",
|
|
323
|
+
day: "2-digit",
|
|
324
|
+
hour: "2-digit",
|
|
325
|
+
minute: "2-digit",
|
|
326
|
+
hourCycle: "h23",
|
|
327
|
+
});
|
|
328
|
+
civilFormatterCache.set(timeZone, f);
|
|
329
|
+
}
|
|
330
|
+
return f;
|
|
331
|
+
}
|
|
332
|
+
/** 绝对时刻 → 目标时区 civil 日期/时分(tz-db 规则,DST 由 Intl 处理)。 */
|
|
333
|
+
export function getCivilInZone(instant, timeZone) {
|
|
334
|
+
const parts = civilFormatter(timeZone).formatToParts(instant);
|
|
335
|
+
const get = (type) => parts.find((p) => p.type === type)?.value ?? "";
|
|
336
|
+
return {
|
|
337
|
+
date: `${get("year")}-${get("month")}-${get("day")}`,
|
|
338
|
+
hour: Number(get("hour")),
|
|
339
|
+
minute: Number(get("minute")),
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
/** 日历日字符串 ±N 天(纯日期运算,与时区无关)。 */
|
|
343
|
+
export function shiftCalendarDate(date, days) {
|
|
344
|
+
const [y, m, d] = date.split("-").map(Number);
|
|
345
|
+
const t = new Date(Date.UTC(y, m - 1, d + days));
|
|
346
|
+
return t.toISOString().slice(0, 10);
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* activityDate(§4.3③ 固定业务日 cutoff):本地 civil 时刻 00:00–02:00 归前一日。
|
|
350
|
+
* 注意:−2h 是 local civil cutoff,不是 UTC elapsed——按 civil hour 判断后做
|
|
351
|
+
* 日历日减一,不做时间戳减法(DST 日 UTC 减法会错)。
|
|
352
|
+
*/
|
|
353
|
+
export function activityDateOf(instant, timeZone) {
|
|
354
|
+
const civil = getCivilInZone(instant, timeZone);
|
|
355
|
+
return civil.hour < 2 ? shiftCalendarDate(civil.date, -1) : civil.date;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* 唯一时区来源:真配置的 risk.timezone → 真配置的 browser env(多 env 取
|
|
359
|
+
* lastHealthAt 最新,无健康记录则 createdAt 最新)→ "unknown"。
|
|
360
|
+
* 默认填充的 UTC(timezoneConfigured=false)不算已知(UTC 毒化修复,§2.5.2②)。
|
|
361
|
+
*/
|
|
362
|
+
export function computeEffectiveTimezone(input) {
|
|
363
|
+
if (input.risk?.timezoneConfigured &&
|
|
364
|
+
input.risk.timezone &&
|
|
365
|
+
isValidIanaTimezone(input.risk.timezone)) {
|
|
366
|
+
return { effectiveTimezone: input.risk.timezone, timezoneKnown: true };
|
|
367
|
+
}
|
|
368
|
+
const candidates = input.browserEnvs
|
|
369
|
+
.filter((e) => e.timezoneConfigured && e.timezone && isValidIanaTimezone(e.timezone))
|
|
370
|
+
.sort((a, b) => {
|
|
371
|
+
const ah = a.lastHealthAt?.getTime() ?? -1;
|
|
372
|
+
const bh = b.lastHealthAt?.getTime() ?? -1;
|
|
373
|
+
if (ah !== bh)
|
|
374
|
+
return bh - ah;
|
|
375
|
+
return (b.createdAt?.getTime() ?? 0) - (a.createdAt?.getTime() ?? 0);
|
|
376
|
+
});
|
|
377
|
+
const picked = candidates[0];
|
|
378
|
+
if (picked?.timezone) {
|
|
379
|
+
return { effectiveTimezone: picked.timezone, timezoneKnown: true };
|
|
380
|
+
}
|
|
381
|
+
return { effectiveTimezone: "unknown", timezoneKnown: false };
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* 不计入 recentActivitySummary 真实活动口径的事件类型(需求A 安全闸)。
|
|
385
|
+
* interaction_action_outcome 复用 browse/like/comment/reply 的 actionKind,
|
|
386
|
+
* 若不按 type 排除会污染 session/action/沉默天数统计。
|
|
387
|
+
*/
|
|
388
|
+
const NON_ACTIVITY_EVENT_TYPES = new Set([
|
|
389
|
+
INTERACTION_ACTION_OUTCOME_TYPE,
|
|
390
|
+
]);
|
|
391
|
+
const DEFAULT_WINDOW_DAYS = 28;
|
|
392
|
+
const SESSION_GAP_MS = 20 * 60 * 1000;
|
|
393
|
+
/**
|
|
394
|
+
* 聚合最近 windowDays 个 activityDate 的 session/action(§4.3④ 全口径)。
|
|
395
|
+
* 仅统计 canonical 事件(payload 带合法 actionKind∈browse/like/comment/reply
|
|
396
|
+
* 且 result 非 failed/skipped);legacy 无 actionKind 事件不参与(P1 起新数据)。
|
|
397
|
+
*/
|
|
398
|
+
export function computeRecentActivitySummary(events, opts) {
|
|
399
|
+
const windowDays = opts.windowDays ?? DEFAULT_WINDOW_DAYS;
|
|
400
|
+
const currentTz = opts.timezoneKnown ? opts.effectiveTimezone : null;
|
|
401
|
+
// 1) 归一化 + 过滤可计事件。
|
|
402
|
+
const seenRefs = new Set();
|
|
403
|
+
const seenTriples = new Set();
|
|
404
|
+
const normalized = [];
|
|
405
|
+
let historicalTzApprox = false;
|
|
406
|
+
let unattributedEvents = 0;
|
|
407
|
+
for (const ev of events) {
|
|
408
|
+
// 需求A 安全闸:按 type 排除非活动事件(outcome 事件永不计入活动口径),
|
|
409
|
+
// 早于 actionKind 判断——outcome 复用真实 actionKind,不排除会污染统计。
|
|
410
|
+
if (ev.type != null && NON_ACTIVITY_EVENT_TYPES.has(ev.type))
|
|
411
|
+
continue;
|
|
412
|
+
const p = ev.payload ?? {};
|
|
413
|
+
const actionKind = p["actionKind"];
|
|
414
|
+
if (!SESSION_ACTION_KINDS.has(actionKind))
|
|
415
|
+
continue;
|
|
416
|
+
if (ev.result === "failed" || ev.result === "skipped")
|
|
417
|
+
continue;
|
|
418
|
+
// 去重:externalRef 唯一(DB 已按 team 级保证,这里防同批重复);
|
|
419
|
+
// 无 externalRef 按 (sessionId||runId||jobId, actionKind, occurredAt)
|
|
420
|
+
// 三元组整条去重(裁决②:action 也只计 1 次)。
|
|
421
|
+
const occurredAtRaw = p["occurredAt"];
|
|
422
|
+
const occurredAt = typeof occurredAtRaw === "string" &&
|
|
423
|
+
!Number.isNaN(Date.parse(occurredAtRaw))
|
|
424
|
+
? new Date(occurredAtRaw)
|
|
425
|
+
: ev.createdAt;
|
|
426
|
+
const runId = typeof p["runId"] === "string" ? p["runId"] : null;
|
|
427
|
+
const sessionId = typeof p["sessionId"] === "string" ? p["sessionId"] : null;
|
|
428
|
+
const jobId = typeof p["jobId"] === "string" ? p["jobId"] : null;
|
|
429
|
+
if (ev.externalRef) {
|
|
430
|
+
if (seenRefs.has(ev.externalRef))
|
|
431
|
+
continue;
|
|
432
|
+
seenRefs.add(ev.externalRef);
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
const triple = `${sessionId ?? runId ?? jobId ?? ""}|${actionKind}|${occurredAt.toISOString()}`;
|
|
436
|
+
if (seenTriples.has(triple))
|
|
437
|
+
continue;
|
|
438
|
+
seenTriples.add(triple);
|
|
439
|
+
}
|
|
440
|
+
// 归日时区:自身 eventTimezone(§4.3⑤ 不可变快照)优先;缺失时用当前
|
|
441
|
+
// effectiveTimezone 并标 approx;当前也 unknown → 无法归日,只计数。
|
|
442
|
+
const evTz = p["eventTimezone"];
|
|
443
|
+
let timezone;
|
|
444
|
+
let tzApprox = false;
|
|
445
|
+
if (typeof evTz === "string" && isValidIanaTimezone(evTz)) {
|
|
446
|
+
timezone = evTz;
|
|
447
|
+
}
|
|
448
|
+
else if (currentTz) {
|
|
449
|
+
timezone = currentTz;
|
|
450
|
+
tzApprox = true;
|
|
451
|
+
historicalTzApprox = true;
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
timezone = null;
|
|
455
|
+
unattributedEvents += 1;
|
|
456
|
+
}
|
|
457
|
+
normalized.push({
|
|
458
|
+
occurredAt,
|
|
459
|
+
timezone,
|
|
460
|
+
tzApprox,
|
|
461
|
+
actionKind,
|
|
462
|
+
runId,
|
|
463
|
+
sessionId,
|
|
464
|
+
jobId,
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
const attributable = normalized.filter((e) => e.timezone !== null);
|
|
468
|
+
attributable.sort((a, b) => a.occurredAt.getTime() - b.occurredAt.getTime());
|
|
469
|
+
const byExplicitKey = new Map();
|
|
470
|
+
const fallbackChains = new Map();
|
|
471
|
+
const sessions = [];
|
|
472
|
+
for (const ev of attributable) {
|
|
473
|
+
const explicitKey = ev.sessionId
|
|
474
|
+
? `s:${ev.sessionId}`
|
|
475
|
+
: ev.runId
|
|
476
|
+
? `r:${ev.runId}`
|
|
477
|
+
: null;
|
|
478
|
+
if (explicitKey) {
|
|
479
|
+
const existing = byExplicitKey.get(explicitKey);
|
|
480
|
+
if (existing) {
|
|
481
|
+
existing.lastAt = ev.occurredAt.getTime();
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
const agg = { firstEvent: ev, lastAt: ev.occurredAt.getTime() };
|
|
485
|
+
byExplicitKey.set(explicitKey, agg);
|
|
486
|
+
sessions.push(agg);
|
|
487
|
+
}
|
|
488
|
+
continue;
|
|
489
|
+
}
|
|
490
|
+
const chainKey = `j:${ev.jobId ?? "<none>"}`;
|
|
491
|
+
const chain = fallbackChains.get(chainKey);
|
|
492
|
+
if (chain && ev.occurredAt.getTime() - chain.lastAt <= SESSION_GAP_MS) {
|
|
493
|
+
chain.lastAt = ev.occurredAt.getTime();
|
|
494
|
+
}
|
|
495
|
+
else {
|
|
496
|
+
const agg = { firstEvent: ev, lastAt: ev.occurredAt.getTime() };
|
|
497
|
+
fallbackChains.set(chainKey, agg);
|
|
498
|
+
sessions.push(agg);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
// 3) 逐日聚合(activityDate,§4.3③)。
|
|
502
|
+
const dayAgg = new Map();
|
|
503
|
+
const bump = (date, field) => {
|
|
504
|
+
let d = dayAgg.get(date);
|
|
505
|
+
if (!d) {
|
|
506
|
+
d = { sessions: 0, comments: 0, likes: 0, replies: 0 };
|
|
507
|
+
dayAgg.set(date, d);
|
|
508
|
+
}
|
|
509
|
+
d[field] += 1;
|
|
510
|
+
};
|
|
511
|
+
for (const ev of attributable) {
|
|
512
|
+
const date = activityDateOf(ev.occurredAt, ev.timezone);
|
|
513
|
+
if (ev.actionKind === "comment")
|
|
514
|
+
bump(date, "comments");
|
|
515
|
+
else if (ev.actionKind === "reply")
|
|
516
|
+
bump(date, "replies");
|
|
517
|
+
else if (ev.actionKind === "like")
|
|
518
|
+
bump(date, "likes");
|
|
519
|
+
}
|
|
520
|
+
for (const s of sessions) {
|
|
521
|
+
bump(activityDateOf(s.firstEvent.occurredAt, s.firstEvent.timezone), "sessions");
|
|
522
|
+
}
|
|
523
|
+
const lastSessionAt = sessions.length > 0
|
|
524
|
+
? new Date(Math.max(...sessions.map((s) => s.firstEvent.occurredAt.getTime()))).toISOString()
|
|
525
|
+
: null;
|
|
526
|
+
// 4) 时区未知:不做逐日归属(裁决④),保留绝对时间字段与计数。
|
|
527
|
+
if (!currentTz) {
|
|
528
|
+
return {
|
|
529
|
+
windowDays,
|
|
530
|
+
localDays: [],
|
|
531
|
+
lastSessionAt,
|
|
532
|
+
consecutiveSilentDays: null,
|
|
533
|
+
activeDaysLast7: null,
|
|
534
|
+
activeDaysLast28: null,
|
|
535
|
+
timezoneKnown: false,
|
|
536
|
+
historicalTzApprox,
|
|
537
|
+
unattributedEvents,
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
// localDays:以当前 activityDate 结尾补齐 windowDays 条(§4.2)。
|
|
541
|
+
const todayActivityDate = activityDateOf(opts.now, currentTz);
|
|
542
|
+
const localDays = [];
|
|
543
|
+
for (let i = windowDays - 1; i >= 0; i--) {
|
|
544
|
+
const date = shiftCalendarDate(todayActivityDate, -i);
|
|
545
|
+
const d = dayAgg.get(date);
|
|
546
|
+
localDays.push({
|
|
547
|
+
date,
|
|
548
|
+
sessions: d?.sessions ?? 0,
|
|
549
|
+
comments: d?.comments ?? 0,
|
|
550
|
+
likes: d?.likes ?? 0,
|
|
551
|
+
replies: d?.replies ?? 0,
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
// consecutiveSilentDays:从昨日(最近已完结 activityDate)往回数,不含未结束当日。
|
|
555
|
+
let consecutiveSilentDays = 0;
|
|
556
|
+
for (let i = localDays.length - 2; i >= 0; i--) {
|
|
557
|
+
if (localDays[i].sessions > 0)
|
|
558
|
+
break;
|
|
559
|
+
consecutiveSilentDays += 1;
|
|
560
|
+
}
|
|
561
|
+
const completedDays = localDays.slice(0, -1);
|
|
562
|
+
const activeIn = (days) => days.filter((d) => d.sessions > 0).length;
|
|
563
|
+
const activeDaysLast7 = activeIn(completedDays.slice(-7));
|
|
564
|
+
const activeDaysLast28 = activeIn(completedDays.slice(-28));
|
|
565
|
+
return {
|
|
566
|
+
windowDays,
|
|
567
|
+
localDays,
|
|
568
|
+
lastSessionAt,
|
|
569
|
+
consecutiveSilentDays,
|
|
570
|
+
activeDaysLast7,
|
|
571
|
+
activeDaysLast28,
|
|
572
|
+
timezoneKnown: true,
|
|
573
|
+
historicalTzApprox,
|
|
574
|
+
unattributedEvents,
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
//# sourceMappingURL=activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../src/activity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.test.d.ts","sourceRoot":"","sources":["../src/activity.test.ts"],"names":[],"mappings":""}
|