@geoly-ai/social-hub-core 0.0.6 → 0.0.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.
- package/dist/activity.d.ts +18 -2
- package/dist/activity.d.ts.map +1 -1
- package/dist/activity.js +47 -13
- package/dist/activity.js.map +1 -1
- package/dist/activity.test.js +109 -0
- package/dist/activity.test.js.map +1 -1
- package/dist/content-review-scoring.d.ts +82 -2
- package/dist/content-review-scoring.d.ts.map +1 -1
- package/dist/content-review-scoring.js +99 -3
- package/dist/content-review-scoring.js.map +1 -1
- package/dist/errors.d.ts +53 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +63 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/notification-sources/field-paths.d.ts +25 -5
- package/dist/notification-sources/field-paths.d.ts.map +1 -1
- package/dist/notification-sources/field-paths.js +11 -0
- package/dist/notification-sources/field-paths.js.map +1 -1
- package/dist/notification-sources/field-set.d.ts +9 -7
- package/dist/notification-sources/field-set.d.ts.map +1 -1
- package/dist/notification-sources/field-set.js +9 -3
- package/dist/notification-sources/field-set.js.map +1 -1
- package/dist/notification-sources/index.d.ts +1 -0
- package/dist/notification-sources/index.d.ts.map +1 -1
- package/dist/notification-sources/index.js +1 -0
- package/dist/notification-sources/index.js.map +1 -1
- package/dist/notification-sources/notification-sources.test.js +43 -3
- package/dist/notification-sources/notification-sources.test.js.map +1 -1
- package/dist/notification-sources/post-performance-node.d.ts.map +1 -1
- package/dist/notification-sources/post-performance-node.js +1 -0
- package/dist/notification-sources/post-performance-node.js.map +1 -1
- package/dist/notification-sources/publishing-calendar-directive.d.ts +61 -0
- package/dist/notification-sources/publishing-calendar-directive.d.ts.map +1 -0
- package/dist/notification-sources/publishing-calendar-directive.js +230 -0
- package/dist/notification-sources/publishing-calendar-directive.js.map +1 -0
- package/dist/notification-sources/registry.d.ts +6 -6
- package/dist/notification-sources/registry.d.ts.map +1 -1
- package/dist/notification-sources/registry.js +50 -19
- package/dist/notification-sources/registry.js.map +1 -1
- package/dist/notification-sources/source-definition.d.ts +69 -12
- package/dist/notification-sources/source-definition.d.ts.map +1 -1
- package/dist/notification-sources/source-definition.js +20 -4
- package/dist/notification-sources/source-definition.js.map +1 -1
- package/dist/openclaw-config.d.ts +84 -0
- package/dist/openclaw-config.d.ts.map +1 -1
- package/dist/openclaw-config.js +129 -0
- package/dist/openclaw-config.js.map +1 -1
- package/dist/openclaw-config.test.js +190 -1
- package/dist/openclaw-config.test.js.map +1 -1
- package/dist/reddit-risk-events.d.ts +168 -0
- package/dist/reddit-risk-events.d.ts.map +1 -0
- package/dist/reddit-risk-events.js +260 -0
- package/dist/reddit-risk-events.js.map +1 -0
- package/dist/reddit-risk-events.test.d.ts +2 -0
- package/dist/reddit-risk-events.test.d.ts.map +1 -0
- package/dist/reddit-risk-events.test.js +277 -0
- package/dist/reddit-risk-events.test.js.map +1 -0
- package/dist/reddit-topic-taxonomy.d.ts.map +1 -1
- package/dist/reddit-topic-taxonomy.js +10 -2
- package/dist/reddit-topic-taxonomy.js.map +1 -1
- package/dist/side-effect-gate.d.ts +157 -0
- package/dist/side-effect-gate.d.ts.map +1 -0
- package/dist/side-effect-gate.js +231 -0
- package/dist/side-effect-gate.js.map +1 -0
- package/dist/side-effect-gate.test.d.ts +2 -0
- package/dist/side-effect-gate.test.d.ts.map +1 -0
- package/dist/side-effect-gate.test.js +193 -0
- package/dist/side-effect-gate.test.js.map +1 -0
- package/dist/subreddit-monitor-matching.d.ts +154 -0
- package/dist/subreddit-monitor-matching.d.ts.map +1 -0
- package/dist/subreddit-monitor-matching.js +336 -0
- package/dist/subreddit-monitor-matching.js.map +1 -0
- package/dist/subreddit-monitor-matching.test.d.ts +2 -0
- package/dist/subreddit-monitor-matching.test.d.ts.map +1 -0
- package/dist/subreddit-monitor-matching.test.js +315 -0
- package/dist/subreddit-monitor-matching.test.js.map +1 -0
- package/package.json +5 -1
|
@@ -8,9 +8,11 @@
|
|
|
8
8
|
* 模块加载时即 deep-freeze + 自检(fail-fast):`readonly` 只是编译期约束,
|
|
9
9
|
* 导出的数组/对象仍可被 `as` 掉之后 push;registry 是安全边界,必须运行时冻住。
|
|
10
10
|
*/
|
|
11
|
-
import { NOTIFICATION_FIELD_SENSITIVITIES, NOTIFICATION_FIELD_VALUE_KINDS,
|
|
11
|
+
import { NOTIFICATION_FIELD_SENSITIVITIES, NOTIFICATION_FIELD_VALUE_KINDS, isNotificationFieldPath, } from "./field-paths.js";
|
|
12
12
|
import { NotificationFieldSetError, indexSourceFields } from "./field-set.js";
|
|
13
13
|
import { postPerformanceNodeSourceDefinition } from "./post-performance-node.js";
|
|
14
|
+
import { publishingCalendarDirectiveSourceDefinition } from "./publishing-calendar-directive.js";
|
|
15
|
+
import { notificationSourceVariantKeys, } from "./source-definition.js";
|
|
14
16
|
const PERMISSION_ACTIONS = new Set(["list", "read"]);
|
|
15
17
|
function deepFreeze(value) {
|
|
16
18
|
if (value !== null && typeof value === "object") {
|
|
@@ -21,7 +23,10 @@ function deepFreeze(value) {
|
|
|
21
23
|
}
|
|
22
24
|
return value;
|
|
23
25
|
}
|
|
24
|
-
export const NOTIFICATION_SOURCE_DEFINITIONS = deepFreeze([
|
|
26
|
+
export const NOTIFICATION_SOURCE_DEFINITIONS = deepFreeze([
|
|
27
|
+
postPerformanceNodeSourceDefinition,
|
|
28
|
+
publishingCalendarDirectiveSourceDefinition,
|
|
29
|
+
]);
|
|
25
30
|
const BY_ID = new Map(NOTIFICATION_SOURCE_DEFINITIONS.map((d) => [d.sourceId, d]));
|
|
26
31
|
export function getNotificationSourceDefinition(sourceId) {
|
|
27
32
|
return BY_ID.get(sourceId);
|
|
@@ -33,7 +38,7 @@ export function requireNotificationSourceDefinition(sourceId) {
|
|
|
33
38
|
}
|
|
34
39
|
return definition;
|
|
35
40
|
}
|
|
36
|
-
function assertFieldShape(field) {
|
|
41
|
+
function assertFieldShape(field, variantKeys) {
|
|
37
42
|
if (!isNotificationFieldPath(field.path)) {
|
|
38
43
|
throw new Error(`invalid field path: ${field.path}`);
|
|
39
44
|
}
|
|
@@ -66,7 +71,8 @@ function assertFieldShape(field) {
|
|
|
66
71
|
}
|
|
67
72
|
const seen = new Set();
|
|
68
73
|
for (const variant of field.variants) {
|
|
69
|
-
|
|
74
|
+
// 值域是**这个 source 自己的**变体集合,不是某个全局枚举。
|
|
75
|
+
if (!variantKeys.includes(variant)) {
|
|
70
76
|
throw new Error(`field ${field.path} declares unknown variant: ${variant}`);
|
|
71
77
|
}
|
|
72
78
|
if (seen.has(variant)) {
|
|
@@ -81,7 +87,7 @@ function assertFieldShape(field) {
|
|
|
81
87
|
}
|
|
82
88
|
/**
|
|
83
89
|
* 注册表自检(模块加载时执行,测试也直接调):
|
|
84
|
-
* 1. sourceId / canonicalTopic 全局唯一,基础形状非空;
|
|
90
|
+
* 1. sourceId / canonicalTopic 全局唯一,基础形状非空;labelKey 非空且 ≤128(**不要求唯一**);
|
|
85
91
|
* 2. 字段路径语法合法、required 与 optional 无重叠、字段元数据值域合法;
|
|
86
92
|
* 3. required 字段不得带 `variants` 限定(共同必填按定义对所有 variant 有效);
|
|
87
93
|
* 4. `requires` 指向已声明字段、无自依赖、**无环**,且**依赖在依赖方可见的每个 variant 下都可用**
|
|
@@ -97,6 +103,19 @@ export function assertNotificationRegistryIntegrity(definitions = NOTIFICATION_S
|
|
|
97
103
|
if (!definition.sourceId.trim() || !definition.canonicalTopic.trim()) {
|
|
98
104
|
throw new Error("sourceId / canonicalTopic must be non-empty");
|
|
99
105
|
}
|
|
106
|
+
// labelKey 是**键**不是文案:空串会让消费端静默回落到裸 sourceId
|
|
107
|
+
// (正是这条自检要挡的那个 bug)。
|
|
108
|
+
// 长度上界与 wire DTO(`notificationSourceTemplateOverviewItemSchema`,`.strict()` +
|
|
109
|
+
// `max(128)`)对齐:只在这里挡,超长 key 会变成系统级总览路由的 500 而不是启动期报错。
|
|
110
|
+
// ⚠️ **刻意不要求全局唯一**:`foo.v1` 与将来的 `foo.v2` 共用同一个类型展示名是合理的,
|
|
111
|
+
// 且唯一性也保证不了 UI 可区分(不同 key 可译成同一句文案)。真正的 golden 在
|
|
112
|
+
// `notification-sources.test.ts` 的映射表上。
|
|
113
|
+
if (!definition.labelKey.trim()) {
|
|
114
|
+
throw new Error(`${definition.sourceId}: empty labelKey`);
|
|
115
|
+
}
|
|
116
|
+
if (definition.labelKey.length > 128) {
|
|
117
|
+
throw new Error(`${definition.sourceId}: labelKey exceeds 128 chars`);
|
|
118
|
+
}
|
|
100
119
|
if (!definition.payloadSchemaVersion.trim()) {
|
|
101
120
|
throw new Error(`${definition.sourceId}: empty payloadSchemaVersion`);
|
|
102
121
|
}
|
|
@@ -114,12 +133,16 @@ export function assertNotificationRegistryIntegrity(definitions = NOTIFICATION_S
|
|
|
114
133
|
topics.add(definition.canonicalTopic);
|
|
115
134
|
// (2) 索引会对重复/非法路径直接抛。
|
|
116
135
|
const index = indexSourceFields(definition);
|
|
136
|
+
const variantKeys = notificationSourceVariantKeys(definition);
|
|
137
|
+
if (variantKeys.length === 0) {
|
|
138
|
+
throw new Error(`${definition.sourceId}: declares no variants`);
|
|
139
|
+
}
|
|
117
140
|
const allFields = [
|
|
118
141
|
...definition.requiredFields,
|
|
119
142
|
...definition.optionalFields,
|
|
120
143
|
];
|
|
121
144
|
for (const field of allFields)
|
|
122
|
-
assertFieldShape(field);
|
|
145
|
+
assertFieldShape(field, variantKeys);
|
|
123
146
|
for (const field of definition.requiredFields) {
|
|
124
147
|
if (field.variants) {
|
|
125
148
|
throw new Error(`required field must not be variant-scoped: ${field.path}`);
|
|
@@ -137,13 +160,13 @@ export function assertNotificationRegistryIntegrity(definitions = NOTIFICATION_S
|
|
|
137
160
|
visiting.add(path);
|
|
138
161
|
const field = index.get(path);
|
|
139
162
|
// 依赖方可见的 variant 集合(未限定 = 全部)。
|
|
140
|
-
const scope = field.variants ??
|
|
163
|
+
const scope = field.variants ?? variantKeys;
|
|
141
164
|
for (const dep of field.requires ?? []) {
|
|
142
165
|
if (!isNotificationFieldPath(dep) || !index.has(dep)) {
|
|
143
166
|
throw new Error(`field ${field.path} depends on undeclared field: ${dep}`);
|
|
144
167
|
}
|
|
145
168
|
const target = index.get(dep);
|
|
146
|
-
const targetScope = target.variants ??
|
|
169
|
+
const targetScope = target.variants ?? variantKeys;
|
|
147
170
|
for (const variant of scope) {
|
|
148
171
|
if (!targetScope.includes(variant)) {
|
|
149
172
|
throw new Error(`field ${field.path} depends on ${dep} which is unavailable in variant ${variant}`);
|
|
@@ -156,7 +179,7 @@ export function assertNotificationRegistryIntegrity(definitions = NOTIFICATION_S
|
|
|
156
179
|
};
|
|
157
180
|
for (const field of allFields)
|
|
158
181
|
walk(field.path);
|
|
159
|
-
for (const mode of
|
|
182
|
+
for (const mode of variantKeys) {
|
|
160
183
|
const spec = definition.variants[mode];
|
|
161
184
|
if (!spec)
|
|
162
185
|
throw new Error(`missing variant spec: ${mode}`);
|
|
@@ -178,7 +201,12 @@ export function assertNotificationRegistryIntegrity(definitions = NOTIFICATION_S
|
|
|
178
201
|
throw new Error(`missing dedupeKey template for variant: ${mode}`);
|
|
179
202
|
}
|
|
180
203
|
}
|
|
181
|
-
// (6)
|
|
204
|
+
// (6) 默认档位 —— **只对 node 型有意义**。state_change 没有档位可言:
|
|
205
|
+
// 它由状态变化触发,config 的 nodes 恒为空(见 source-definition.ts)。
|
|
206
|
+
if (definition.triggerKind === "state_change") {
|
|
207
|
+
assertForbiddenPayloadKeys(definition.forbiddenPayloadKeys);
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
182
210
|
if (definition.defaultNodes.length === 0) {
|
|
183
211
|
throw new Error(`${definition.sourceId}: defaultNodes must not be empty`);
|
|
184
212
|
}
|
|
@@ -205,16 +233,19 @@ export function assertNotificationRegistryIntegrity(definitions = NOTIFICATION_S
|
|
|
205
233
|
offsets.add(node.offsetSeconds);
|
|
206
234
|
}
|
|
207
235
|
// (7) 禁字段列表。
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
236
|
+
assertForbiddenPayloadKeys(definition.forbiddenPayloadKeys);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function assertForbiddenPayloadKeys(keys) {
|
|
240
|
+
if (keys.length === 0) {
|
|
241
|
+
throw new Error("forbiddenPayloadKeys is empty");
|
|
242
|
+
}
|
|
243
|
+
const forbidden = new Set();
|
|
244
|
+
for (const key of keys) {
|
|
245
|
+
if (forbidden.has(key)) {
|
|
246
|
+
throw new Error(`duplicate forbidden payload key: ${key}`);
|
|
217
247
|
}
|
|
248
|
+
forbidden.add(key);
|
|
218
249
|
}
|
|
219
250
|
}
|
|
220
251
|
// fail-fast:注册表非法就别让进程起来(比等到发事件时才炸好得多)。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/notification-sources/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,gCAAgC,EAChC,8BAA8B,EAC9B,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/notification-sources/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,12 +11,21 @@
|
|
|
11
11
|
* 铁律:后台配置**不能扩大数据暴露面、不能绕过 authz、不能改 canonical topic**。
|
|
12
12
|
* 因此后台能碰的一切都在 config DTO 里,而白名单/敏感度/权限只存在于本文件的声明中。
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
14
|
+
* triggerKind 有两种:`node`(锚点 + 档位到点发,不可撤销)与 `state_change`
|
|
15
|
+
* (期望状态变化即发,可被后续 revision 覆盖或 cancel 撤销)。二者的 runtime
|
|
16
|
+
* 分开实现,互不套用(设计文档 §13)。
|
|
16
17
|
*/
|
|
17
|
-
import type { NotificationFieldDefinition, NotificationTriggerMode } from "./field-paths.js";
|
|
18
|
-
/**
|
|
19
|
-
|
|
18
|
+
import type { NotificationDirectiveMode, NotificationFieldDefinition, NotificationTriggerMode, NotificationVariantKey } from "./field-paths.js";
|
|
19
|
+
/**
|
|
20
|
+
* trigger kind 的值域。
|
|
21
|
+
* - `node`:锚点时间 + 固定偏移档位 → 到点发事件(不可撤销,一次性)。
|
|
22
|
+
* - `state_change`:主体的期望状态发生变化 → 发一条**可被后续版本覆盖或撤销**的指令。
|
|
23
|
+
*
|
|
24
|
+
* 两者的 runtime 完全分开(设计文档 §13 的原则:不提交未工作的分支)——
|
|
25
|
+
* state_change 不套用 anchor / schedule 物化 / catchup 折叠 / maxLateness,
|
|
26
|
+
* node 的既有行为也不因它改变。
|
|
27
|
+
*/
|
|
28
|
+
export declare const NOTIFICATION_TRIGGER_KINDS: readonly ["node", "state_change"];
|
|
20
29
|
export type NotificationTriggerKind = (typeof NOTIFICATION_TRIGGER_KINDS)[number];
|
|
21
30
|
/** schedule 行的生命周期(DB 层 Block 1 落表时照抄)。 */
|
|
22
31
|
export declare const NOTIFICATION_SCHEDULE_STATUSES: readonly ["scheduled", "emitted", "missed", "cancelled", "superseded"];
|
|
@@ -38,39 +47,86 @@ export interface NotificationSourceVariantSpec {
|
|
|
38
47
|
readonly requiredFields: readonly string[];
|
|
39
48
|
}
|
|
40
49
|
/**
|
|
41
|
-
*
|
|
50
|
+
* 两种 trigger kind 的共同部分(纯元数据,零 I/O,可被前后端同时引用)。
|
|
42
51
|
*
|
|
43
52
|
* 版本 bump 规则(设计文档 §5):
|
|
44
53
|
* - 字段集/敏感度/权限/依赖/禁字段/resolver 语义变化 → bump `sourceDefinitionVersion`。
|
|
45
54
|
* - payload 字段**形状或语义**变化(类型、嵌套、含义)→ 还必须 bump `payloadSchemaVersion`。
|
|
55
|
+
*
|
|
56
|
+
* 变体集合与 dedupeKey 模板**故意不在这里** —— 它们的键值域随 triggerKind 变化,
|
|
57
|
+
* 放进基类就只能退化成 `Record<string, …>`,等于把「node 有 upsert 变体」这类
|
|
58
|
+
* 无意义组合放行。
|
|
46
59
|
*/
|
|
47
|
-
|
|
60
|
+
interface EventSourceDefinitionBase {
|
|
48
61
|
/** 全局唯一、稳定;订阅以 sourceId 为主(不用可变 alias/topic)。 */
|
|
49
62
|
readonly sourceId: string;
|
|
63
|
+
/**
|
|
64
|
+
* 展示名的 **i18n key**(是键,不是文案)。registry 既然是「有哪些 source」的唯一真源,
|
|
65
|
+
* 就也该是「用哪个键去称呼它」的真源;zh/en 文案由消费端字典提供(后台在
|
|
66
|
+
* `apps/web-brand/src/lib/i18n.ts`),因此加一门语言不用发 core 的版。
|
|
67
|
+
*
|
|
68
|
+
* ⚠️ 与 config / template 的 `displayName` **不是一回事,也不互相回落**:
|
|
69
|
+
* 那个是**每条配置**的运营命名(可改、可为不同 team 不同、未配置时压根不存在),
|
|
70
|
+
* 这个是 **source 类型**的固定名 —— 「一条配置都还没有」时下拉框要显示的正是它。
|
|
71
|
+
*
|
|
72
|
+
* 改它**不需要** bump `sourceDefinitionVersion` / `payloadSchemaVersion`:
|
|
73
|
+
* 纯展示,不进 payload、不进 fieldSetVersion、不影响 authz(见本文件的 bump 规则)。
|
|
74
|
+
*/
|
|
75
|
+
readonly labelKey: string;
|
|
50
76
|
/**
|
|
51
77
|
* canonical topic:**永远 canonical**,后台不可改,别名只做展示、
|
|
52
78
|
* 不参与路由/过滤(设计文档 §3 铁律 3)。
|
|
53
79
|
*/
|
|
54
80
|
readonly canonicalTopic: string;
|
|
55
|
-
readonly triggerKind: "node";
|
|
56
81
|
readonly sourceDefinitionVersion: number;
|
|
57
82
|
readonly payloadSchemaVersion: string;
|
|
58
|
-
/** 首次创建 config 时的默认档位;后台可改,改后只影响新物化。 */
|
|
59
|
-
readonly defaultNodes: readonly NotificationNodeSpec[];
|
|
60
83
|
/** 所有 variant 共同必填 —— 后台**不可取消**。 */
|
|
61
84
|
readonly requiredFields: readonly NotificationFieldDefinition[];
|
|
62
85
|
/** 白名单可选字段 —— 后台只能从中**勾选**,不能新增。 */
|
|
63
86
|
readonly optionalFields: readonly NotificationFieldDefinition[];
|
|
64
|
-
/** 每个 variant 的附加必填(路径必须已在 required/optional 中声明)。 */
|
|
65
|
-
readonly variants: Readonly<Record<NotificationTriggerMode, NotificationSourceVariantSpec>>;
|
|
66
87
|
/**
|
|
67
88
|
* 绝对禁止出现在 payload 里的键名(顶层或任意层)。
|
|
68
89
|
* Block 0 的 hard deny list:凭据、cookie/token、执行身份、出口 IP/telemetry、浏览器密钥。
|
|
69
90
|
*/
|
|
70
91
|
readonly forbiddenPayloadKeys: readonly string[];
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* node 型 source 的**静态声明**(纯元数据,零 I/O,可被前后端同时引用)。
|
|
95
|
+
*
|
|
96
|
+
* 版本 bump 规则(设计文档 §5):
|
|
97
|
+
* - 字段集/敏感度/权限/依赖/禁字段/resolver 语义变化 → bump `sourceDefinitionVersion`。
|
|
98
|
+
* - payload 字段**形状或语义**变化(类型、嵌套、含义)→ 还必须 bump `payloadSchemaVersion`。
|
|
99
|
+
*/
|
|
100
|
+
export interface NodeEventSourceDefinition extends EventSourceDefinitionBase {
|
|
101
|
+
readonly triggerKind: "node";
|
|
102
|
+
/** 首次创建 config 时的默认档位;后台可改,改后只影响新物化。 */
|
|
103
|
+
readonly defaultNodes: readonly NotificationNodeSpec[];
|
|
104
|
+
/** 每个 variant 的附加必填(路径必须已在 required/optional 中声明)。 */
|
|
105
|
+
readonly variants: Readonly<Record<NotificationTriggerMode, NotificationSourceVariantSpec>>;
|
|
71
106
|
/** dedupeKey 模板(人读用;实际构造在 contracts 的 builder,单一真源)。 */
|
|
72
107
|
readonly dedupeKeyTemplates: Readonly<Record<NotificationTriggerMode, string>>;
|
|
73
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* state_change 型 source 的静态声明。
|
|
111
|
+
*
|
|
112
|
+
* 与 node 型的三点硬差异(都是刻意的,不是省略):
|
|
113
|
+
* 1. **没有 defaultNodes** —— 它不按时间档位发,而是状态一变就发;config 的 `nodes` 恒为空。
|
|
114
|
+
* 2. **变体是指令语义**(`upsert`/`cancel`),不是「为什么此刻发出」。
|
|
115
|
+
* 3. **可撤销** —— 同一主体的后续事件按 `revision` 覆盖前一条,`cancel` 撤销整条。
|
|
116
|
+
* node 型没有这个概念(到期通知一次就完了)。
|
|
117
|
+
*/
|
|
118
|
+
export interface StateChangeEventSourceDefinition extends EventSourceDefinitionBase {
|
|
119
|
+
readonly triggerKind: "state_change";
|
|
120
|
+
readonly variants: Readonly<Record<NotificationDirectiveMode, NotificationSourceVariantSpec>>;
|
|
121
|
+
readonly dedupeKeyTemplates: Readonly<Record<NotificationDirectiveMode, string>>;
|
|
122
|
+
}
|
|
123
|
+
/** registry 收录的任一 source。按 `triggerKind` 判别。 */
|
|
124
|
+
export type NotificationEventSourceDefinition = NodeEventSourceDefinition | StateChangeEventSourceDefinition;
|
|
125
|
+
/**
|
|
126
|
+
* 该 source 自己的变体键集合。**不要**直接引用全局枚举去遍历 variants——
|
|
127
|
+
* 那正是「日历指令被当成有 catchup 模式」的来源。
|
|
128
|
+
*/
|
|
129
|
+
export declare function notificationSourceVariantKeys(definition: NotificationEventSourceDefinition): readonly NotificationVariantKey[];
|
|
74
130
|
/**
|
|
75
131
|
* 解析器/构造器接口 —— **Block 0 只冻结签名**,实现落在后续块(DB/worker)。
|
|
76
132
|
* 泛型参数让每个 source 自带 anchor/subject/payload 类型,避免 `unknown` 到处漂。
|
|
@@ -94,4 +150,5 @@ export interface NodeEventSourceRuntime<TAnchorContext, TAnchor, TSubject, TPayl
|
|
|
94
150
|
readonly includedFields: readonly string[];
|
|
95
151
|
}): Promise<TPayload>;
|
|
96
152
|
}
|
|
153
|
+
export {};
|
|
97
154
|
//# sourceMappingURL=source-definition.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-definition.d.ts","sourceRoot":"","sources":["../../src/notification-sources/source-definition.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"source-definition.d.ts","sourceRoot":"","sources":["../../src/notification-sources/source-definition.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,11 +11,20 @@
|
|
|
11
11
|
* 铁律:后台配置**不能扩大数据暴露面、不能绕过 authz、不能改 canonical topic**。
|
|
12
12
|
* 因此后台能碰的一切都在 config DTO 里,而白名单/敏感度/权限只存在于本文件的声明中。
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
14
|
+
* triggerKind 有两种:`node`(锚点 + 档位到点发,不可撤销)与 `state_change`
|
|
15
|
+
* (期望状态变化即发,可被后续 revision 覆盖或 cancel 撤销)。二者的 runtime
|
|
16
|
+
* 分开实现,互不套用(设计文档 §13)。
|
|
16
17
|
*/
|
|
17
|
-
/**
|
|
18
|
-
|
|
18
|
+
/**
|
|
19
|
+
* trigger kind 的值域。
|
|
20
|
+
* - `node`:锚点时间 + 固定偏移档位 → 到点发事件(不可撤销,一次性)。
|
|
21
|
+
* - `state_change`:主体的期望状态发生变化 → 发一条**可被后续版本覆盖或撤销**的指令。
|
|
22
|
+
*
|
|
23
|
+
* 两者的 runtime 完全分开(设计文档 §13 的原则:不提交未工作的分支)——
|
|
24
|
+
* state_change 不套用 anchor / schedule 物化 / catchup 折叠 / maxLateness,
|
|
25
|
+
* node 的既有行为也不因它改变。
|
|
26
|
+
*/
|
|
27
|
+
export const NOTIFICATION_TRIGGER_KINDS = ["node", "state_change"];
|
|
19
28
|
/** schedule 行的生命周期(DB 层 Block 1 落表时照抄)。 */
|
|
20
29
|
export const NOTIFICATION_SCHEDULE_STATUSES = [
|
|
21
30
|
"scheduled",
|
|
@@ -27,4 +36,11 @@ export const NOTIFICATION_SCHEDULE_STATUSES = [
|
|
|
27
36
|
/** 被同组 catchup 折叠掉的从属节点。 */
|
|
28
37
|
"superseded",
|
|
29
38
|
];
|
|
39
|
+
/**
|
|
40
|
+
* 该 source 自己的变体键集合。**不要**直接引用全局枚举去遍历 variants——
|
|
41
|
+
* 那正是「日历指令被当成有 catchup 模式」的来源。
|
|
42
|
+
*/
|
|
43
|
+
export function notificationSourceVariantKeys(definition) {
|
|
44
|
+
return Object.keys(definition.variants);
|
|
45
|
+
}
|
|
30
46
|
//# sourceMappingURL=source-definition.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-definition.js","sourceRoot":"","sources":["../../src/notification-sources/source-definition.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"source-definition.js","sourceRoot":"","sources":["../../src/notification-sources/source-definition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AASH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,MAAM,EAAE,cAAc,CAAU,CAAC;AAI5E,2CAA2C;AAC3C,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,WAAW;IACX,SAAS;IACT,8CAA8C;IAC9C,QAAQ;IACR,wBAAwB;IACxB,WAAW;IACX,4BAA4B;IAC5B,YAAY;CACJ,CAAC;AAgHX;;;GAGG;AACH,MAAM,UAAU,6BAA6B,CAC3C,UAA6C;IAE7C,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -15,4 +15,88 @@ export declare function isExecutionFencingEnforced(): boolean;
|
|
|
15
15
|
export declare const OPENCLAW_INGEST_CONTRACT_VERSION = "1.0.0";
|
|
16
16
|
export declare function requireOpenClawSharedTargetRoot(): string;
|
|
17
17
|
export declare function resolveOpenClawSharedExportTargetRoot(explicit?: string): string | null;
|
|
18
|
+
export declare const PUBLISH_GUARDRAIL_SCHEDULING_MODES: readonly ["off", "shadow", "enforce"];
|
|
19
|
+
export type PublishGuardrailSchedulingMode = (typeof PUBLISH_GUARDRAIL_SCHEDULING_MODES)[number];
|
|
20
|
+
export declare const PUBLISH_GUARDRAIL_SCHEDULING_MODE_ENV = "PUBLISH_GUARDRAIL_SCHEDULING_MODE";
|
|
21
|
+
export declare const PUBLISH_GUARDRAIL_CRON_RECURRENCE_MODE_ENV = "PUBLISH_GUARDRAIL_CRON_RECURRENCE_MODE";
|
|
22
|
+
export declare const PUBLISH_GUARDRAIL_CRON_PROBE_HORIZON_HOURS_ENV = "PUBLISH_GUARDRAIL_CRON_PROBE_HORIZON_HOURS";
|
|
23
|
+
/** §2.2 的 cron 下一跳探测跨度缺省值(小时)。 */
|
|
24
|
+
export declare const DEFAULT_PUBLISH_GUARDRAIL_CRON_PROBE_HORIZON_HOURS = 48;
|
|
25
|
+
/**
|
|
26
|
+
* 档位的**诊断形态** —— 后续块应消费它,而不是裸 `mode`。
|
|
27
|
+
*
|
|
28
|
+
* 🔴 为什么不是单纯返回 `mode`:env 敲错(`enfroce` / `OFF`)会静默回落到 `off`,而
|
|
29
|
+
* 「静默撤掉一道护栏」正是本方案最想避免的结果。但块 1 没有任何调用点,做不到
|
|
30
|
+
* 「启动即抛」,把配置错误做成可用性事故也不对。折中是**回落 off + 把配错这件事带
|
|
31
|
+
* 出来**,由后续块在启动日志/告警里报出来。
|
|
32
|
+
*/
|
|
33
|
+
export type PublishGuardrailSchedulingModeConfig = {
|
|
34
|
+
mode: PublishGuardrailSchedulingMode;
|
|
35
|
+
/** 原样 env 值(**不 trim**,便于认出「值两边有空格」);未设 = null。 */
|
|
36
|
+
raw: string | null;
|
|
37
|
+
/** env 有值但不是合法档位 → 已回落。**未设不算 invalid。** */
|
|
38
|
+
invalid: boolean;
|
|
39
|
+
/** default = env 未设或配错回落;env = 本 flag 自己的 env 生效。 */
|
|
40
|
+
source: "default" | "env";
|
|
41
|
+
};
|
|
42
|
+
/** 主档位(路径 A/B/D,以及 cron 未单独配置时的 C)。缺省/配错 = `off`。 */
|
|
43
|
+
export declare function resolvePublishGuardrailSchedulingModeConfig(): PublishGuardrailSchedulingModeConfig;
|
|
44
|
+
export declare function resolvePublishGuardrailSchedulingMode(): PublishGuardrailSchedulingMode;
|
|
45
|
+
/**
|
|
46
|
+
* cron 档位的诊断形态。
|
|
47
|
+
*
|
|
48
|
+
* 🔴 **刻意不复用 `PublishGuardrailSchedulingModeConfig`**:cron 的取值有**两个来源**
|
|
49
|
+
* (自己的 override + 被继承的主档位),单个 `{raw, invalid}` 描述不了 —— 会出现
|
|
50
|
+
* 「主档位配错、cron 未设,于是 cron 报 `invalid: false`」这种把错误吞掉的形态。
|
|
51
|
+
* 所以把两个来源各自摊开,再给一个「本次解析真正参考过的来源里有没有配错」的
|
|
52
|
+
* `invalid` 供后续块单点消费。
|
|
53
|
+
*/
|
|
54
|
+
export type PublishGuardrailCronRecurrenceModeConfig = {
|
|
55
|
+
mode: PublishGuardrailSchedulingMode;
|
|
56
|
+
/** cron override 自身的 env 状态(未设 = raw:null / invalid:false)。 */
|
|
57
|
+
override: {
|
|
58
|
+
raw: string | null;
|
|
59
|
+
invalid: boolean;
|
|
60
|
+
};
|
|
61
|
+
/** 主档位的完整诊断,始终带上 —— 即便本次没用它定 mode。 */
|
|
62
|
+
base: PublishGuardrailSchedulingModeConfig;
|
|
63
|
+
/**
|
|
64
|
+
* - `env`:override 合法且生效(此时不参考主档位);
|
|
65
|
+
* - `inherited`:override 未设,取主档位;
|
|
66
|
+
* - `invalid_override_fallback`:override 有值但非法 → 回落 `off`(**不继承**,见下)。
|
|
67
|
+
*/
|
|
68
|
+
source: "env" | "inherited" | "invalid_override_fallback";
|
|
69
|
+
/**
|
|
70
|
+
* **本次真正决定 `mode` 的那个来源**有没有配错。
|
|
71
|
+
*
|
|
72
|
+
* ⚠️ 它不是「任意来源配错」—— 合法 override + 主档位配错时,这里是 `false` 而
|
|
73
|
+
* `base.invalid` 是 `true`。两个字段的分工是刻意的:
|
|
74
|
+
* - 只关心「cron 这条路径的行为对不对」→ 读顶层 `invalid`;
|
|
75
|
+
* - 还要做**配置健康告警** → **必须同时报 `base.invalid`**,否则主档位的配错会
|
|
76
|
+
* 被一个合法的 cron override 遮蔽掉。
|
|
77
|
+
*/
|
|
78
|
+
invalid: boolean;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* cron 复发(路径 C)单独留一个档位:它是四条里唯一「被拒会造成**持续性**后果(链停)」
|
|
82
|
+
* 的,必须允许 A/B/D 已切 `enforce` 时把 C 单独钉在 `shadow`。
|
|
83
|
+
*
|
|
84
|
+
* - **未设 → 继承主档位**(未设的语义本来就是继承),并把主档位自己的 `invalid` 一并
|
|
85
|
+
* 带出来;
|
|
86
|
+
* - **有值但非法 → 回落 `off`,不继承**。理由:这个 override 存在的唯一目的就是「主档
|
|
87
|
+
* 已 enforce 时把最危险、被拒会断链的 cron 留在 shadow」。把一个**意图是 shadow 的
|
|
88
|
+
* 拼写错误**提升成 enforce,风险比「少做一次保护」大得多;而且 `invalid` 目前还没有
|
|
89
|
+
* 生产告警消费者,不能指望有人及时看见。与主档位配错回落 `off` 也保持同向。
|
|
90
|
+
*/
|
|
91
|
+
export declare function resolvePublishGuardrailCronRecurrenceModeConfig(): PublishGuardrailCronRecurrenceModeConfig;
|
|
92
|
+
export declare function resolvePublishGuardrailCronRecurrenceMode(): PublishGuardrailSchedulingMode;
|
|
93
|
+
export type PublishGuardrailCronProbeHorizonConfig = {
|
|
94
|
+
hours: number;
|
|
95
|
+
raw: string | null;
|
|
96
|
+
invalid: boolean;
|
|
97
|
+
source: "default" | "env";
|
|
98
|
+
};
|
|
99
|
+
/** 只接受十进制正整数;`"1.5"` / `"0"` / `"-1"` / `"48h"` / 超上界一律视为配错并回落。 */
|
|
100
|
+
export declare function resolvePublishGuardrailCronProbeHorizonHoursConfig(): PublishGuardrailCronProbeHorizonConfig;
|
|
101
|
+
export declare function resolvePublishGuardrailCronProbeHorizonHours(): number;
|
|
18
102
|
//# sourceMappingURL=openclaw-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openclaw-config.d.ts","sourceRoot":"","sources":["../src/openclaw-config.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,wBAAgB,gCAAgC,IAAI,OAAO,CAE1D;AAKD,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAED,wBAAgB,gCAAgC,IAAI,OAAO,CAE1D;AAED,wBAAgB,8BAA8B,IAAI,OAAO,CAExD;AAMD,wBAAgB,iCAAiC,IAAI,OAAO,CAE3D;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAED,eAAO,MAAM,gCAAgC,UAAU,CAAC;AAExD,wBAAgB,+BAA+B,IAAI,MAAM,CAQxD;AAED,wBAAgB,qCAAqC,CACnD,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAGf"}
|
|
1
|
+
{"version":3,"file":"openclaw-config.d.ts","sourceRoot":"","sources":["../src/openclaw-config.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,wBAAgB,gCAAgC,IAAI,OAAO,CAE1D;AAKD,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAED,wBAAgB,gCAAgC,IAAI,OAAO,CAE1D;AAED,wBAAgB,8BAA8B,IAAI,OAAO,CAExD;AAMD,wBAAgB,iCAAiC,IAAI,OAAO,CAE3D;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAED,eAAO,MAAM,gCAAgC,UAAU,CAAC;AAExD,wBAAgB,+BAA+B,IAAI,MAAM,CAQxD;AAED,wBAAgB,qCAAqC,CACnD,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAGf;AAsBD,eAAO,MAAM,kCAAkC,uCAIrC,CAAC;AAEX,MAAM,MAAM,8BAA8B,GACxC,CAAC,OAAO,kCAAkC,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtD,eAAO,MAAM,qCAAqC,sCACb,CAAC;AACtC,eAAO,MAAM,0CAA0C,2CACb,CAAC;AAC3C,eAAO,MAAM,8CAA8C,+CACb,CAAC;AAE/C,kCAAkC;AAClC,eAAO,MAAM,kDAAkD,KAAK,CAAC;AAQrE;;;;;;;GAOG;AACH,MAAM,MAAM,oCAAoC,GAAG;IACjD,IAAI,EAAE,8BAA8B,CAAC;IACrC,mDAAmD;IACnD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,MAAM,EAAE,SAAS,GAAG,KAAK,CAAC;CAC3B,CAAC;AAsBF,qDAAqD;AACrD,wBAAgB,2CAA2C,IAAI,oCAAoC,CASlG;AAED,wBAAgB,qCAAqC,IAAI,8BAA8B,CAEtF;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,wCAAwC,GAAG;IACrD,IAAI,EAAE,8BAA8B,CAAC;IACrC,+DAA+D;IAC/D,QAAQ,EAAE;QAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACnD,sCAAsC;IACtC,IAAI,EAAE,oCAAoC,CAAC;IAC3C;;;;OAIG;IACH,MAAM,EAAE,KAAK,GAAG,WAAW,GAAG,2BAA2B,CAAC;IAC1D;;;;;;;;OAQG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,+CAA+C,IAAI,wCAAwC,CA8B1G;AAED,wBAAgB,yCAAyC,IAAI,8BAA8B,CAE1F;AAED,MAAM,MAAM,sCAAsC,GAAG;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,KAAK,CAAC;CAC3B,CAAC;AAEF,mEAAmE;AACnE,wBAAgB,kDAAkD,IAAI,sCAAsC,CAe3G;AAED,wBAAgB,4CAA4C,IAAI,MAAM,CAErE"}
|
package/dist/openclaw-config.js
CHANGED
|
@@ -43,4 +43,133 @@ export function resolveOpenClawSharedExportTargetRoot(explicit) {
|
|
|
43
43
|
const root = (explicit ?? process.env["OPENCLAW_SHARED_TARGET_ROOT"])?.trim();
|
|
44
44
|
return root || null;
|
|
45
45
|
}
|
|
46
|
+
/* ────────────────────────────────────────────────────────────────────────────
|
|
47
|
+
* 发布护栏 · 排期路径覆盖(docs/publish-guardrail-scheduling-coverage-plan.md 块 1)
|
|
48
|
+
*
|
|
49
|
+
* 四条今天完全不过 `evaluatePublishGuardrails` 的路径(改期 / 接管 / cron 复发 /
|
|
50
|
+
* retry)要接护栏 = **新增拒绝行为**,因此按 §3.3 走三档灰度 off → shadow → enforce。
|
|
51
|
+
*
|
|
52
|
+
* 🔴 **默认必须是 `off`,不是 `shadow`**(§3.3):判据沿用
|
|
53
|
+
* `REDDIT_REFRESH_CROSS_TEAM_BATCHES` —— 默认值必须精确等于旧程序的行为,而旧行为是
|
|
54
|
+
* 「完全不判」。shadow 也不是零成本:evaluator 是 4 条并行 SQL,行为健康 flag 开着时
|
|
55
|
+
* 还会追加一次聚合读;cron 那条又跑在业务事务内部。
|
|
56
|
+
*
|
|
57
|
+
* **四条路径的决策点全部在 API 进程**(cron requeue 的 `completeScheduledJobOps` /
|
|
58
|
+
* `failOrSkipScheduledJobOps` 唯一调用方是 `apps/api/src/routes/teams/ops-runtime.ts`),
|
|
59
|
+
* worker 只承担告警与 defer 重入队。但 flag 仍须两边配同一值,否则 worker 侧告警会
|
|
60
|
+
* 与 API 侧实际行为对不上。
|
|
61
|
+
*
|
|
62
|
+
* 块 1 只建骨架:**这些函数目前没有任何生产调用点**,所以「off 档行为与基线一致」是
|
|
63
|
+
* 结构性成立的,不依赖 flag 判定本身正确。
|
|
64
|
+
* ────────────────────────────────────────────────────────────────────────── */
|
|
65
|
+
export const PUBLISH_GUARDRAIL_SCHEDULING_MODES = [
|
|
66
|
+
"off",
|
|
67
|
+
"shadow",
|
|
68
|
+
"enforce",
|
|
69
|
+
];
|
|
70
|
+
export const PUBLISH_GUARDRAIL_SCHEDULING_MODE_ENV = "PUBLISH_GUARDRAIL_SCHEDULING_MODE";
|
|
71
|
+
export const PUBLISH_GUARDRAIL_CRON_RECURRENCE_MODE_ENV = "PUBLISH_GUARDRAIL_CRON_RECURRENCE_MODE";
|
|
72
|
+
export const PUBLISH_GUARDRAIL_CRON_PROBE_HORIZON_HOURS_ENV = "PUBLISH_GUARDRAIL_CRON_PROBE_HORIZON_HOURS";
|
|
73
|
+
/** §2.2 的 cron 下一跳探测跨度缺省值(小时)。 */
|
|
74
|
+
export const DEFAULT_PUBLISH_GUARDRAIL_CRON_PROBE_HORIZON_HOURS = 48;
|
|
75
|
+
/**
|
|
76
|
+
* 探测跨度的合法上界(一年);超出视为配错并回落缺省。防 `999999999` 把块 4 的候选
|
|
77
|
+
* 展开变成一次实质无界的循环。
|
|
78
|
+
*/
|
|
79
|
+
const MAX_PUBLISH_GUARDRAIL_CRON_PROBE_HORIZON_HOURS = 8760;
|
|
80
|
+
/**
|
|
81
|
+
* 🔴 **只接受精确小写 allowlist,不做大小写折叠**。`OFF` 是「配错了,结果落在 off」而
|
|
82
|
+
* 不是「合法的 off」—— 折叠会把错误配置转成有效行为,部署可预测性反而更差(与仓内
|
|
83
|
+
* `=== "true"` 的严格口径同向)。
|
|
84
|
+
*
|
|
85
|
+
* 两端空白**不算配错**(`" shadow "` 合法):那几乎总是复制粘贴/YAML 缩进带进来的,不是
|
|
86
|
+
* 语义错误。但 `raw` 保留未 trim 的原值,好让「值两边有空格」这件事仍然看得见。
|
|
87
|
+
*/
|
|
88
|
+
function parsePublishGuardrailSchedulingMode(raw) {
|
|
89
|
+
if (raw === undefined)
|
|
90
|
+
return null;
|
|
91
|
+
const trimmed = raw.trim();
|
|
92
|
+
return PUBLISH_GUARDRAIL_SCHEDULING_MODES.includes(trimmed)
|
|
93
|
+
? trimmed
|
|
94
|
+
: null;
|
|
95
|
+
}
|
|
96
|
+
/** 主档位(路径 A/B/D,以及 cron 未单独配置时的 C)。缺省/配错 = `off`。 */
|
|
97
|
+
export function resolvePublishGuardrailSchedulingModeConfig() {
|
|
98
|
+
const raw = process.env[PUBLISH_GUARDRAIL_SCHEDULING_MODE_ENV];
|
|
99
|
+
if (raw === undefined) {
|
|
100
|
+
return { mode: "off", raw: null, invalid: false, source: "default" };
|
|
101
|
+
}
|
|
102
|
+
const parsed = parsePublishGuardrailSchedulingMode(raw);
|
|
103
|
+
return parsed
|
|
104
|
+
? { mode: parsed, raw, invalid: false, source: "env" }
|
|
105
|
+
: { mode: "off", raw, invalid: true, source: "default" };
|
|
106
|
+
}
|
|
107
|
+
export function resolvePublishGuardrailSchedulingMode() {
|
|
108
|
+
return resolvePublishGuardrailSchedulingModeConfig().mode;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* cron 复发(路径 C)单独留一个档位:它是四条里唯一「被拒会造成**持续性**后果(链停)」
|
|
112
|
+
* 的,必须允许 A/B/D 已切 `enforce` 时把 C 单独钉在 `shadow`。
|
|
113
|
+
*
|
|
114
|
+
* - **未设 → 继承主档位**(未设的语义本来就是继承),并把主档位自己的 `invalid` 一并
|
|
115
|
+
* 带出来;
|
|
116
|
+
* - **有值但非法 → 回落 `off`,不继承**。理由:这个 override 存在的唯一目的就是「主档
|
|
117
|
+
* 已 enforce 时把最危险、被拒会断链的 cron 留在 shadow」。把一个**意图是 shadow 的
|
|
118
|
+
* 拼写错误**提升成 enforce,风险比「少做一次保护」大得多;而且 `invalid` 目前还没有
|
|
119
|
+
* 生产告警消费者,不能指望有人及时看见。与主档位配错回落 `off` 也保持同向。
|
|
120
|
+
*/
|
|
121
|
+
export function resolvePublishGuardrailCronRecurrenceModeConfig() {
|
|
122
|
+
const raw = process.env[PUBLISH_GUARDRAIL_CRON_RECURRENCE_MODE_ENV];
|
|
123
|
+
const base = resolvePublishGuardrailSchedulingModeConfig();
|
|
124
|
+
if (raw === undefined) {
|
|
125
|
+
return {
|
|
126
|
+
mode: base.mode,
|
|
127
|
+
override: { raw: null, invalid: false },
|
|
128
|
+
base,
|
|
129
|
+
source: "inherited",
|
|
130
|
+
invalid: base.invalid,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
const parsed = parsePublishGuardrailSchedulingMode(raw);
|
|
134
|
+
if (parsed) {
|
|
135
|
+
return {
|
|
136
|
+
mode: parsed,
|
|
137
|
+
override: { raw, invalid: false },
|
|
138
|
+
base,
|
|
139
|
+
source: "env",
|
|
140
|
+
// override 合法生效时不参考主档位,主档位的配错由主 resolver 自己报。
|
|
141
|
+
invalid: false,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
mode: "off",
|
|
146
|
+
override: { raw, invalid: true },
|
|
147
|
+
base,
|
|
148
|
+
source: "invalid_override_fallback",
|
|
149
|
+
invalid: true,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
export function resolvePublishGuardrailCronRecurrenceMode() {
|
|
153
|
+
return resolvePublishGuardrailCronRecurrenceModeConfig().mode;
|
|
154
|
+
}
|
|
155
|
+
/** 只接受十进制正整数;`"1.5"` / `"0"` / `"-1"` / `"48h"` / 超上界一律视为配错并回落。 */
|
|
156
|
+
export function resolvePublishGuardrailCronProbeHorizonHoursConfig() {
|
|
157
|
+
const raw = process.env[PUBLISH_GUARDRAIL_CRON_PROBE_HORIZON_HOURS_ENV];
|
|
158
|
+
const fallback = DEFAULT_PUBLISH_GUARDRAIL_CRON_PROBE_HORIZON_HOURS;
|
|
159
|
+
if (raw === undefined) {
|
|
160
|
+
return { hours: fallback, raw: null, invalid: false, source: "default" };
|
|
161
|
+
}
|
|
162
|
+
const trimmed = raw.trim();
|
|
163
|
+
if (!/^\d+$/.test(trimmed)) {
|
|
164
|
+
return { hours: fallback, raw, invalid: true, source: "default" };
|
|
165
|
+
}
|
|
166
|
+
const parsed = Number.parseInt(trimmed, 10);
|
|
167
|
+
if (parsed <= 0 || parsed > MAX_PUBLISH_GUARDRAIL_CRON_PROBE_HORIZON_HOURS) {
|
|
168
|
+
return { hours: fallback, raw, invalid: true, source: "default" };
|
|
169
|
+
}
|
|
170
|
+
return { hours: parsed, raw, invalid: false, source: "env" };
|
|
171
|
+
}
|
|
172
|
+
export function resolvePublishGuardrailCronProbeHorizonHours() {
|
|
173
|
+
return resolvePublishGuardrailCronProbeHorizonHoursConfig().hours;
|
|
174
|
+
}
|
|
46
175
|
//# sourceMappingURL=openclaw-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openclaw-config.js","sourceRoot":"","sources":["../src/openclaw-config.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,MAAM,UAAU,gCAAgC;IAC9C,OAAO,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,KAAK,MAAM,CAAC;AACtE,CAAC;AAED,sEAAsE;AACtE,4EAA4E;AAC5E,sEAAsE;AACtE,MAAM,UAAU,yBAAyB;IACvC,OAAO,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,KAAK,OAAO,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,gCAAgC;IAC9C,OAAO,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,KAAK,OAAO,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,8BAA8B;IAC5C,OAAO,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,KAAK,OAAO,CAAC;AACpE,CAAC;AAED,oEAAoE;AACpE,kEAAkE;AAClE,oEAAoE;AACpE,6DAA6D;AAC7D,MAAM,UAAU,iCAAiC;IAC/C,OAAO,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,KAAK,MAAM,CAAC;AACtE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,KAAK,MAAM,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,MAAM,gCAAgC,GAAG,OAAO,CAAC;AAExD,MAAM,UAAU,+BAA+B;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAE,IAAI,EAAE,CAAC;IAChE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,qCAAqC,CACnD,QAAiB;IAEjB,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAC9E,OAAO,IAAI,IAAI,IAAI,CAAC;AACtB,CAAC"}
|
|
1
|
+
{"version":3,"file":"openclaw-config.js","sourceRoot":"","sources":["../src/openclaw-config.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,MAAM,UAAU,gCAAgC;IAC9C,OAAO,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,KAAK,MAAM,CAAC;AACtE,CAAC;AAED,sEAAsE;AACtE,4EAA4E;AAC5E,sEAAsE;AACtE,MAAM,UAAU,yBAAyB;IACvC,OAAO,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,KAAK,OAAO,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,gCAAgC;IAC9C,OAAO,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,KAAK,OAAO,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,8BAA8B;IAC5C,OAAO,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,KAAK,OAAO,CAAC;AACpE,CAAC;AAED,oEAAoE;AACpE,kEAAkE;AAClE,oEAAoE;AACpE,6DAA6D;AAC7D,MAAM,UAAU,iCAAiC;IAC/C,OAAO,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,KAAK,MAAM,CAAC;AACtE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,KAAK,MAAM,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,MAAM,gCAAgC,GAAG,OAAO,CAAC;AAExD,MAAM,UAAU,+BAA+B;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAE,IAAI,EAAE,CAAC;IAChE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,qCAAqC,CACnD,QAAiB;IAEjB,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAC9E,OAAO,IAAI,IAAI,IAAI,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;;;;;;;;gFAkBgF;AAEhF,MAAM,CAAC,MAAM,kCAAkC,GAAG;IAChD,KAAK;IACL,QAAQ;IACR,SAAS;CACD,CAAC;AAKX,MAAM,CAAC,MAAM,qCAAqC,GAChD,mCAAmC,CAAC;AACtC,MAAM,CAAC,MAAM,0CAA0C,GACrD,wCAAwC,CAAC;AAC3C,MAAM,CAAC,MAAM,8CAA8C,GACzD,4CAA4C,CAAC;AAE/C,kCAAkC;AAClC,MAAM,CAAC,MAAM,kDAAkD,GAAG,EAAE,CAAC;AAErE;;;GAGG;AACH,MAAM,8CAA8C,GAAG,IAAI,CAAC;AAoB5D;;;;;;;GAOG;AACH,SAAS,mCAAmC,CAC1C,GAAuB;IAEvB,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,OAAQ,kCAAwD,CAAC,QAAQ,CACvE,OAAO,CACR;QACC,CAAC,CAAE,OAA0C;QAC7C,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,2CAA2C;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAC/D,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACvE,CAAC;IACD,MAAM,MAAM,GAAG,mCAAmC,CAAC,GAAG,CAAC,CAAC;IACxD,OAAO,MAAM;QACX,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;QACtD,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,qCAAqC;IACnD,OAAO,2CAA2C,EAAE,CAAC,IAAI,CAAC;AAC5D,CAAC;AAmCD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,+CAA+C;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,2CAA2C,EAAE,CAAC;IAC3D,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE;YACvC,IAAI;YACJ,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,mCAAmC,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;YACjC,IAAI;YACJ,MAAM,EAAE,KAAK;YACb,8CAA8C;YAC9C,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE;QAChC,IAAI;QACJ,MAAM,EAAE,2BAA2B;QACnC,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yCAAyC;IACvD,OAAO,+CAA+C,EAAE,CAAC,IAAI,CAAC;AAChE,CAAC;AASD,mEAAmE;AACnE,MAAM,UAAU,kDAAkD;IAChE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,kDAAkD,CAAC;IACpE,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC3E,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACpE,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,GAAG,8CAA8C,EAAE,CAAC;QAC3E,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,4CAA4C;IAC1D,OAAO,kDAAkD,EAAE,CAAC,KAAK,CAAC;AACpE,CAAC"}
|