@principles/core 1.201.0 → 1.203.0

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 (31) hide show
  1. package/dist/runtime-v2/__tests__/architecture-regression.test.js +7 -4
  2. package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  3. package/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.d.ts +2 -0
  4. package/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.d.ts.map +1 -0
  5. package/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.js +246 -0
  6. package/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.js.map +1 -0
  7. package/dist/runtime-v2/feature-flags/index.d.ts +2 -0
  8. package/dist/runtime-v2/feature-flags/index.d.ts.map +1 -1
  9. package/dist/runtime-v2/feature-flags/index.js +2 -0
  10. package/dist/runtime-v2/feature-flags/index.js.map +1 -1
  11. package/dist/runtime-v2/feature-flags/surface-guard-policy.d.ts +41 -0
  12. package/dist/runtime-v2/feature-flags/surface-guard-policy.d.ts.map +1 -0
  13. package/dist/runtime-v2/feature-flags/surface-guard-policy.js +143 -0
  14. package/dist/runtime-v2/feature-flags/surface-guard-policy.js.map +1 -0
  15. package/dist/runtime-v2/index.d.ts +4 -0
  16. package/dist/runtime-v2/index.d.ts.map +1 -1
  17. package/dist/runtime-v2/index.js +3 -0
  18. package/dist/runtime-v2/index.js.map +1 -1
  19. package/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.d.ts +2 -0
  20. package/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.d.ts.map +1 -0
  21. package/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.js +95 -0
  22. package/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.js.map +1 -0
  23. package/dist/runtime-v2/risk/index.d.ts +7 -0
  24. package/dist/runtime-v2/risk/index.d.ts.map +1 -0
  25. package/dist/runtime-v2/risk/index.js +6 -0
  26. package/dist/runtime-v2/risk/index.js.map +1 -0
  27. package/dist/runtime-v2/risk/risk-calculator-policy.d.ts +18 -0
  28. package/dist/runtime-v2/risk/risk-calculator-policy.d.ts.map +1 -0
  29. package/dist/runtime-v2/risk/risk-calculator-policy.js +47 -0
  30. package/dist/runtime-v2/risk/risk-calculator-policy.js.map +1 -0
  31. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=surface-guard-policy.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-guard-policy.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,246 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { checkSurfaceGuard, isSurfaceEnabled, guardHook, guardService, getSurfaceIdForHook, getSurfaceIdForService, __resetSurfaceGuardSkipLogStateForTests, } from '../surface-guard-policy.js';
3
+ import { PLUGIN_SURFACE_REGISTRY } from '../plugin-surface-registry.js';
4
+ describe('surface-guard', () => {
5
+ beforeEach(() => {
6
+ // Each test starts with a clean surface-guard skip log state so the
7
+ // first-fire assertions are deterministic (PRI-298).
8
+ __resetSurfaceGuardSkipLogStateForTests();
9
+ vi.clearAllMocks();
10
+ });
11
+ describe('getSurfaceIdForHook', () => {
12
+ it('generates correct surface id without label', () => {
13
+ expect(getSurfaceIdForHook('before_tool_call')).toBe('hook:before_tool_call');
14
+ });
15
+ it('generates correct surface id with label', () => {
16
+ expect(getSurfaceIdForHook('after_tool_call', 'trajectory')).toBe('hook:after_tool_call.trajectory');
17
+ });
18
+ });
19
+ describe('getSurfaceIdForService', () => {
20
+ it('generates correct surface id for service', () => {
21
+ expect(getSurfaceIdForService('evolution-worker')).toBe('service:evolution-worker');
22
+ });
23
+ });
24
+ describe('checkSurfaceGuard', () => {
25
+ it('returns passed=true when registry is valid', () => {
26
+ const result = checkSurfaceGuard();
27
+ expect(result.passed).toBe(true);
28
+ expect(result.violations).toEqual([]);
29
+ });
30
+ it('includes enabled core surfaces', () => {
31
+ const result = checkSurfaceGuard();
32
+ expect(result.enabledCoreSurfaces.length).toBeGreaterThan(0);
33
+ for (const surfaceId of result.enabledCoreSurfaces) {
34
+ const entry = PLUGIN_SURFACE_REGISTRY.find(s => s.id === surfaceId);
35
+ expect(entry).toBeDefined();
36
+ expect(entry?.category).toBe('core');
37
+ }
38
+ });
39
+ it('includes disabled non-core surfaces', () => {
40
+ const result = checkSurfaceGuard();
41
+ expect(result.disabledNonCoreSurfaces.length).toBeGreaterThan(0);
42
+ for (const surfaceId of result.disabledNonCoreSurfaces) {
43
+ const entry = PLUGIN_SURFACE_REGISTRY.find(s => s.id === surfaceId);
44
+ expect(entry).toBeDefined();
45
+ expect(entry?.category).not.toBe('core');
46
+ expect(entry?.enabledByDefault).toBe(false);
47
+ }
48
+ });
49
+ it('returns violations when non-core surface is enabledByDefault', () => {
50
+ const result = checkSurfaceGuard();
51
+ const nonCoreEnabled = PLUGIN_SURFACE_REGISTRY.filter(s => s.category !== 'core' && s.enabledByDefault);
52
+ if (nonCoreEnabled.length > 0) {
53
+ expect(result.violations.length).toBeGreaterThan(0);
54
+ }
55
+ });
56
+ });
57
+ describe('isSurfaceEnabled', () => {
58
+ it('returns enabled=true for core surface without override', () => {
59
+ const result = isSurfaceEnabled('hook:before_prompt_build');
60
+ expect(result.enabled).toBe(true);
61
+ expect(result.reason).toBeUndefined();
62
+ });
63
+ it('returns enabled=false for quiet surface without override', () => {
64
+ const result = isSurfaceEnabled('hook:after_tool_call.trajectory');
65
+ expect(result.enabled).toBe(false);
66
+ expect(result.reason).toBeDefined();
67
+ });
68
+ it('returns reason when surface not found', () => {
69
+ const result = isSurfaceEnabled('hook:nonexistent_hook');
70
+ expect(result.enabled).toBe(false);
71
+ expect(result.reason).toContain('not found in registry');
72
+ });
73
+ it('allows override for quiet surface', () => {
74
+ const result = isSurfaceEnabled('hook:before_reset', {
75
+ 'hook:before_reset': true,
76
+ });
77
+ expect(result.enabled).toBe(true);
78
+ });
79
+ it('ignores non-boolean override', () => {
80
+ const result = isSurfaceEnabled('hook:before_prompt_build', {
81
+ 'hook:before_prompt_build': 'yes',
82
+ });
83
+ expect(result.enabled).toBe(true);
84
+ });
85
+ it('cannot disable core surface', () => {
86
+ const result = isSurfaceEnabled('hook:before_prompt_build', {
87
+ 'hook:before_prompt_build': false,
88
+ });
89
+ expect(result.enabled).toBe(true);
90
+ expect(result.reason).toContain('core');
91
+ });
92
+ it('returns disabledReason for disabled surface', () => {
93
+ const result = isSurfaceEnabled('service:evolution-worker');
94
+ expect(result.enabled).toBe(false);
95
+ expect(result.reason).toContain('evolution_worker');
96
+ });
97
+ });
98
+ describe('guardHook', () => {
99
+ beforeEach(() => {
100
+ vi.clearAllMocks();
101
+ });
102
+ it('returns original handler for enabled surface', () => {
103
+ const mockHandler = vi.fn().mockReturnValue('result');
104
+ const guarded = guardHook('hook:before_prompt_build', undefined, mockHandler);
105
+ const result = guarded({}, {});
106
+ expect(mockHandler).toHaveBeenCalled();
107
+ expect(result).toBe('result');
108
+ });
109
+ it('returns no-op for disabled surface without logger', () => {
110
+ const mockHandler = vi.fn();
111
+ const guarded = guardHook('hook:after_tool_call.trajectory', undefined, mockHandler);
112
+ const result = guarded({}, {});
113
+ expect(mockHandler).not.toHaveBeenCalled();
114
+ expect(result).toBeUndefined();
115
+ });
116
+ it('logs when surface is disabled with logger', () => {
117
+ const mockLogger = { info: vi.fn(), debug: vi.fn() };
118
+ const mockHandler = vi.fn();
119
+ const guarded = guardHook('hook:after_tool_call.trajectory', mockLogger, mockHandler);
120
+ guarded({}, {});
121
+ expect(mockLogger.info).toHaveBeenCalled();
122
+ expect(mockHandler).not.toHaveBeenCalled();
123
+ });
124
+ it('does not log at guardHook construction time (PRI-298 / chatgpt P2)', () => {
125
+ const mockLogger = { info: vi.fn(), debug: vi.fn() };
126
+ guardHook('hook:after_tool_call.trajectory', mockLogger, vi.fn());
127
+ expect(mockLogger.info).not.toHaveBeenCalled();
128
+ });
129
+ it('logger undefined on first fire does not consume the one-shot slot (PRI-298 / coderabbit Major)', () => {
130
+ const handler1 = guardHook('hook:after_tool_call.trajectory', undefined, vi.fn());
131
+ handler1({}, {});
132
+ const mockLogger = { info: vi.fn(), debug: vi.fn() };
133
+ const handler2 = guardHook('hook:after_tool_call.trajectory', mockLogger, vi.fn());
134
+ handler2({}, {});
135
+ expect(mockLogger.info).toHaveBeenCalledTimes(1);
136
+ expect(mockLogger.info).toHaveBeenCalledWith(expect.stringContaining('[PD:surface-guard] SKIP hook:after_tool_call.trajectory'));
137
+ const handler3 = guardHook('hook:after_tool_call.trajectory', mockLogger, vi.fn());
138
+ handler3({}, {});
139
+ expect(mockLogger.info).toHaveBeenCalledTimes(1);
140
+ });
141
+ it('does not log for enabled surface', () => {
142
+ const mockLogger = { info: vi.fn(), debug: vi.fn() };
143
+ const mockHandler = vi.fn();
144
+ const guarded = guardHook('hook:before_prompt_build', mockLogger, mockHandler);
145
+ guarded({}, {});
146
+ expect(mockLogger.info).not.toHaveBeenCalled();
147
+ });
148
+ it('guards unknown surface with not-found reason', () => {
149
+ const mockLogger = { info: vi.fn(), debug: vi.fn() };
150
+ const guarded = guardHook('hook:unknown_hook', mockLogger, vi.fn());
151
+ guarded({}, {});
152
+ expect(mockLogger.info).toHaveBeenCalledWith(expect.stringContaining('not found in registry'));
153
+ });
154
+ it('logs once on first fire and stays silent on subsequent fires (PRI-298 rate-limit)', () => {
155
+ const mockLogger = { info: vi.fn(), debug: vi.fn() };
156
+ const mockHandler = vi.fn();
157
+ const guarded = guardHook('hook:after_tool_call.trajectory', mockLogger, mockHandler);
158
+ guarded({}, {});
159
+ expect(mockLogger.info).toHaveBeenCalledTimes(1);
160
+ expect(mockLogger.info).toHaveBeenCalledWith(expect.stringContaining('[PD:surface-guard] SKIP hook:after_tool_call.trajectory'));
161
+ for (let i = 0; i < 5; i += 1) {
162
+ guarded({}, {});
163
+ }
164
+ expect(mockLogger.info).toHaveBeenCalledTimes(1);
165
+ expect(mockHandler).not.toHaveBeenCalled();
166
+ });
167
+ it('logs first fire per surfaceId independently (one log per quiet surface)', () => {
168
+ const mockLogger = { info: vi.fn(), debug: vi.fn() };
169
+ const handler1 = guardHook('hook:after_tool_call.trajectory', mockLogger, vi.fn());
170
+ const handler2 = guardHook('hook:llm_output.trajectory', mockLogger, vi.fn());
171
+ const handler3 = guardHook('hook:subagent_spawning', mockLogger, vi.fn());
172
+ handler1({}, {});
173
+ handler2({}, {});
174
+ handler3({}, {});
175
+ expect(mockLogger.info).toHaveBeenCalledTimes(3);
176
+ const calls = mockLogger.info.mock.calls.map(c => String(c[0]));
177
+ expect(calls.some(c => c.includes('hook:after_tool_call.trajectory'))).toBe(true);
178
+ expect(calls.some(c => c.includes('hook:llm_output.trajectory'))).toBe(true);
179
+ expect(calls.some(c => c.includes('hook:subagent_spawning'))).toBe(true);
180
+ });
181
+ });
182
+ describe('guardService', () => {
183
+ beforeEach(() => {
184
+ vi.clearAllMocks();
185
+ });
186
+ it('returns original service for enabled surface', () => {
187
+ const mockService = { id: 'test-service' };
188
+ const result = guardService('hook:before_prompt_build', mockService);
189
+ expect(result).toBe(mockService);
190
+ });
191
+ it('returns null for disabled surface without logger', () => {
192
+ const mockService = { id: 'test-service' };
193
+ const result = guardService('hook:after_tool_call.trajectory', mockService);
194
+ expect(result).toBeNull();
195
+ });
196
+ it('logs when surface is disabled with logger', () => {
197
+ const mockLogger = { info: vi.fn(), debug: vi.fn() };
198
+ const mockService = { id: 'test-service' };
199
+ const result = guardService('hook:after_tool_call.trajectory', mockService, mockLogger);
200
+ expect(result).toBeNull();
201
+ expect(mockLogger.info).toHaveBeenCalledWith(expect.stringContaining('SKIP service'));
202
+ });
203
+ it('returns null for unknown surface', () => {
204
+ const mockService = { id: 'test-service' };
205
+ const result = guardService('service:nonexistent', mockService);
206
+ expect(result).toBeNull();
207
+ });
208
+ it('logs once per service surface on first registration (PRI-298 rate-limit)', () => {
209
+ const mockLogger = { info: vi.fn(), debug: vi.fn() };
210
+ const service = { id: 'test-service' };
211
+ const first = guardService('service:evolution-worker', service, mockLogger);
212
+ expect(first).toBeNull();
213
+ expect(mockLogger.info).toHaveBeenCalledTimes(1);
214
+ expect(mockLogger.info).toHaveBeenCalledWith(expect.stringContaining('SKIP service service:evolution-worker'));
215
+ guardService('service:evolution-worker', service, mockLogger);
216
+ guardService('service:evolution-worker', service, mockLogger);
217
+ expect(mockLogger.info).toHaveBeenCalledTimes(1);
218
+ });
219
+ });
220
+ describe('PRI-298 disabledReason copy', () => {
221
+ it('no quiet surface disabledReason references "Story A" or "Story A\'"', () => {
222
+ const quietOrNonCore = PLUGIN_SURFACE_REGISTRY.filter(s => s.category === 'quiet' || s.category === 'gone' || s.category === 'legacy_retire');
223
+ expect(quietOrNonCore.length).toBeGreaterThan(0);
224
+ for (const surface of quietOrNonCore) {
225
+ expect(surface.disabledReason).toBeDefined();
226
+ expect(surface.disabledReason).not.toMatch(/Story A/);
227
+ expect(surface.disabledReason).not.toMatch(/MVP\s*验收/);
228
+ expect(surface.disabledReason).not.toMatch(/测试任务/);
229
+ }
230
+ });
231
+ it('subagent/shadow hooks removed from registry (PRI-448)', () => {
232
+ const subagent = PLUGIN_SURFACE_REGISTRY.find(s => s.id === 'hook:subagent_spawning');
233
+ expect(subagent).toBeUndefined();
234
+ });
235
+ it('no quiet surface disabledReason promises a feature flag override (PRI-298 / chatgpt P2)', () => {
236
+ const quiet = PLUGIN_SURFACE_REGISTRY.filter(s => s.category === 'quiet');
237
+ expect(quiet.length).toBeGreaterThan(0);
238
+ for (const surface of quiet) {
239
+ const reason = (surface.disabledReason ?? '').toLowerCase();
240
+ expect(reason).not.toContain('enable via feature flag');
241
+ expect(reason).not.toMatch(/enable via .* override/);
242
+ }
243
+ });
244
+ });
245
+ });
246
+ //# sourceMappingURL=surface-guard-policy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-guard-policy.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,6 @@ export { VALID_CATEGORIES, validateFeatureFlagRaw, computeEffectiveFlags, DEFAUL
2
2
  export type { FeatureFlagCategory, FeatureFlagDefinition, EffectiveFeatureFlags, ValidationResult, ValidationResultOk, ValidationResultErr, } from './feature-flag-contract.js';
3
3
  export { VALID_SURFACE_KINDS, VALID_MVP_CATEGORIES, PLUGIN_SURFACE_REGISTRY, validateSurfaceRegistry, getEnabledSurfaces, getSurfacesByCategory, getSurfacesByKind, findUnclassifiedSurfaces, } from './plugin-surface-registry.js';
4
4
  export type { SurfaceKind, MvpCategory, PluginSurfaceEntry, SurfaceRegistryValidationResult, } from './plugin-surface-registry.js';
5
+ export { checkSurfaceGuard, getSurfaceIdForHook, getSurfaceIdForService, isSurfaceEnabled, guardHook, guardService, __resetSurfaceGuardSkipLogStateForTests, } from './surface-guard-policy.js';
6
+ export type { SurfaceGuardResult, HookHandler, } from './surface-guard-policy.js';
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/feature-flags/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AAEpC,YAAY,EACV,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EACV,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,+BAA+B,GAChC,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/feature-flags/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AAEpC,YAAY,EACV,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EACV,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,+BAA+B,GAChC,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,uCAAuC,GACxC,MAAM,2BAA2B,CAAC;AAEnC,YAAY,EACV,kBAAkB,EAClB,WAAW,GACZ,MAAM,2BAA2B,CAAC"}
@@ -1,3 +1,5 @@
1
1
  export { VALID_CATEGORIES, validateFeatureFlagRaw, computeEffectiveFlags, DEFAULT_FEATURE_FLAGS, } from './feature-flag-contract.js';
2
2
  export { VALID_SURFACE_KINDS, VALID_MVP_CATEGORIES, PLUGIN_SURFACE_REGISTRY, validateSurfaceRegistry, getEnabledSurfaces, getSurfacesByCategory, getSurfacesByKind, findUnclassifiedSurfaces, } from './plugin-surface-registry.js';
3
+ // Surface guard — pure logic migrated from plugin (Stage 3)
4
+ export { checkSurfaceGuard, getSurfaceIdForHook, getSurfaceIdForService, isSurfaceEnabled, guardHook, guardService, __resetSurfaceGuardSkipLogStateForTests, } from './surface-guard-policy.js';
3
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime-v2/feature-flags/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AAWpC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime-v2/feature-flags/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AAWpC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,8BAA8B,CAAC;AAStC,4DAA4D;AAC5D,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,uCAAuC,GACxC,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Surface Guard Policy — pure logic migrated from openclaw-plugin.
3
+ *
4
+ * No I/O, no fs, no network. Operates on PLUGIN_SURFACE_REGISTRY (same
5
+ * directory) and in-memory module-level Set for once-only log state.
6
+ *
7
+ * The guardService<T> generic constraint was relaxed from
8
+ * <T extends OpenClawPluginService> (a plugin type) to <T> because the
9
+ * function body only passes the service through — it never accesses
10
+ * OpenClawPluginService properties. Callers pass concrete service types,
11
+ * so TypeScript infers T correctly without the constraint.
12
+ */
13
+ export interface SurfaceGuardResult {
14
+ passed: boolean;
15
+ enabledCoreSurfaces: string[];
16
+ disabledNonCoreSurfaces: string[];
17
+ violations: string[];
18
+ warnings: string[];
19
+ }
20
+ type LoggerLike = {
21
+ info?: (msg: string) => void;
22
+ debug?: (msg: string) => void;
23
+ };
24
+ /**
25
+ * Reset the per-process surface-guard skip log bookkeeping. Intended for tests
26
+ * that need to assert on the first-fire log without cross-test pollution.
27
+ * Not part of the production API surface; do not call from runtime code.
28
+ */
29
+ export declare function __resetSurfaceGuardSkipLogStateForTests(): void;
30
+ export declare function checkSurfaceGuard(): SurfaceGuardResult;
31
+ export declare function getSurfaceIdForHook(hookEvent: string, label?: string): string;
32
+ export declare function getSurfaceIdForService(serviceName: string): string;
33
+ export declare function isSurfaceEnabled(surfaceId: string, overrides?: Record<string, boolean>): {
34
+ enabled: boolean;
35
+ reason?: string;
36
+ };
37
+ export type HookHandler<E, C, R> = (event: E, ctx: C) => R | Promise<R>;
38
+ export declare function guardHook<E, C, R>(surfaceId: string, logger: LoggerLike | undefined, handler: HookHandler<E, C, R>): HookHandler<E, C, R>;
39
+ export declare function guardService<T>(surfaceId: string, service: T, logger?: LoggerLike): T | null;
40
+ export {};
41
+ //# sourceMappingURL=surface-guard-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-guard-policy.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/feature-flags/surface-guard-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAClC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAeD,KAAK,UAAU,GAAG;IAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,CAAC;AAyBlF;;;;GAIG;AACH,wBAAgB,uCAAuC,IAAI,IAAI,CAE9D;AAED,wBAAgB,iBAAiB,IAAI,kBAAkB,CAgCtD;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAK7E;AAED,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACtC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CA6BvC;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAExE,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAC5B,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAiBtB;AAED,wBAAgB,YAAY,CAAC,CAAC,EAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,EACV,MAAM,CAAC,EAAE,UAAU,GAClB,CAAC,GAAG,IAAI,CAYV"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Surface Guard Policy — pure logic migrated from openclaw-plugin.
3
+ *
4
+ * No I/O, no fs, no network. Operates on PLUGIN_SURFACE_REGISTRY (same
5
+ * directory) and in-memory module-level Set for once-only log state.
6
+ *
7
+ * The guardService<T> generic constraint was relaxed from
8
+ * <T extends OpenClawPluginService> (a plugin type) to <T> because the
9
+ * function body only passes the service through — it never accesses
10
+ * OpenClawPluginService properties. Callers pass concrete service types,
11
+ * so TypeScript infers T correctly without the constraint.
12
+ */
13
+ import { PLUGIN_SURFACE_REGISTRY, validateSurfaceRegistry, getSurfacesByCategory, } from './plugin-surface-registry.js';
14
+ // Surface-level once-only log state (PRI-298).
15
+ // The first time a quiet/non-core surface guard actually fires in this
16
+ // process, the disabled reason is emitted once. Subsequent fires for the
17
+ // same surfaceId are still observable (the no-op handler preserves
18
+ // behaviour) but no longer flood the log. Fresh processes start with an
19
+ // empty set, so each plugin load gets one observable skip per surface.
20
+ //
21
+ // The Set is only updated when the log was actually emitted, so passing
22
+ // `undefined` for the logger on a quiet first fire does NOT consume the
23
+ // one-shot slot — a later registration that supplies a logger still gets
24
+ // the first-fire reason (PRI-298 / ERR-002).
25
+ const loggedSkipSurfaces = new Set();
26
+ /**
27
+ * Emit the disabled-reason log line for `surfaceId` at most once per
28
+ * process. Returns true if the log was emitted, false if it was suppressed
29
+ * (already logged, or no logger available). Only marks the surface as
30
+ * logged when the log was actually written, so a missing logger on first
31
+ * call does not consume the one-shot slot.
32
+ */
33
+ function logSkipOnce(surfaceId, logger, message) {
34
+ if (loggedSkipSurfaces.has(surfaceId)) {
35
+ return false;
36
+ }
37
+ if (!logger?.info) {
38
+ return false;
39
+ }
40
+ loggedSkipSurfaces.add(surfaceId);
41
+ logger.info(message);
42
+ return true;
43
+ }
44
+ /**
45
+ * Reset the per-process surface-guard skip log bookkeeping. Intended for tests
46
+ * that need to assert on the first-fire log without cross-test pollution.
47
+ * Not part of the production API surface; do not call from runtime code.
48
+ */
49
+ export function __resetSurfaceGuardSkipLogStateForTests() {
50
+ loggedSkipSurfaces.clear();
51
+ }
52
+ export function checkSurfaceGuard() {
53
+ const validation = validateSurfaceRegistry(PLUGIN_SURFACE_REGISTRY);
54
+ const violations = [];
55
+ const warnings = [...validation.warnings];
56
+ const coreSurfaces = getSurfacesByCategory(PLUGIN_SURFACE_REGISTRY, 'core');
57
+ const enabledCore = coreSurfaces.filter(s => s.enabledByDefault);
58
+ const nonCoreEnabled = PLUGIN_SURFACE_REGISTRY.filter(s => s.category !== 'core' && s.enabledByDefault);
59
+ if (nonCoreEnabled.length > 0) {
60
+ for (const surface of nonCoreEnabled) {
61
+ violations.push(`non-core surface '${surface.id}' (${surface.category}) is enabledByDefault=true — must be false per ADR-0014`);
62
+ }
63
+ }
64
+ if (!validation.valid) {
65
+ violations.push(...validation.errors);
66
+ }
67
+ return {
68
+ passed: violations.length === 0,
69
+ enabledCoreSurfaces: enabledCore.map(s => s.id),
70
+ disabledNonCoreSurfaces: PLUGIN_SURFACE_REGISTRY
71
+ .filter(s => s.category !== 'core' && !s.enabledByDefault)
72
+ .map(s => s.id),
73
+ violations,
74
+ warnings,
75
+ };
76
+ }
77
+ export function getSurfaceIdForHook(hookEvent, label) {
78
+ if (label) {
79
+ return `hook:${hookEvent}.${label}`;
80
+ }
81
+ return `hook:${hookEvent}`;
82
+ }
83
+ export function getSurfaceIdForService(serviceName) {
84
+ return `service:${serviceName}`;
85
+ }
86
+ export function isSurfaceEnabled(surfaceId, overrides = {}) {
87
+ const entry = PLUGIN_SURFACE_REGISTRY.find(s => s.id === surfaceId);
88
+ if (!entry) {
89
+ return {
90
+ enabled: false,
91
+ reason: `surface '${surfaceId}' not found in registry — classify before enabling (PRI-289)`,
92
+ };
93
+ }
94
+ if (Object.hasOwn(overrides, surfaceId)) {
95
+ const override = overrides[surfaceId];
96
+ if (typeof override !== 'boolean') {
97
+ return { enabled: entry.enabledByDefault, reason: `override for '${surfaceId}' is not boolean, using default` };
98
+ }
99
+ if (entry.category === 'gone') {
100
+ return { enabled: false, reason: `surface '${surfaceId}' is gone and cannot be re-enabled` };
101
+ }
102
+ if (entry.category === 'core' && !override) {
103
+ return { enabled: true, reason: `surface '${surfaceId}' is core and cannot be disabled` };
104
+ }
105
+ return { enabled: override };
106
+ }
107
+ if (!entry.enabledByDefault && entry.disabledReason) {
108
+ return { enabled: false, reason: entry.disabledReason };
109
+ }
110
+ return { enabled: entry.enabledByDefault };
111
+ }
112
+ export function guardHook(surfaceId, logger, handler) {
113
+ const check = isSurfaceEnabled(surfaceId);
114
+ if (check.enabled) {
115
+ return handler;
116
+ }
117
+ const reason = check.reason ?? 'surface not enabled';
118
+ // Log on the first ACTUAL no-op invocation, not at construction time
119
+ // (PRI-298). Construction-time logging would emit a `SKIP` line at
120
+ // plugin startup for every registered quiet hook, regardless of
121
+ // whether the hook ever fires — which is exactly the startup log
122
+ // noise this change is meant to prevent. The one-shot is consumed only
123
+ // when the log was actually written, so `undefined` logger on first
124
+ // call does not eat the slot.
125
+ return (_event, _ctx) => {
126
+ logSkipOnce(surfaceId, logger, `[PD:surface-guard] SKIP ${surfaceId}: ${reason}`);
127
+ return undefined;
128
+ };
129
+ }
130
+ export function guardService(surfaceId, service, logger) {
131
+ const check = isSurfaceEnabled(surfaceId);
132
+ if (check.enabled) {
133
+ return service;
134
+ }
135
+ const reason = check.reason ?? 'surface not enabled';
136
+ // guardService is called once per service during plugin registration,
137
+ // so the once-only check fires on the registration call itself. The
138
+ // shared helper makes the consumption rule identical to guardHook:
139
+ // a missing logger on first call does not consume the one-shot.
140
+ logSkipOnce(surfaceId, logger, `[PD:surface-guard] SKIP service ${surfaceId}: ${reason}`);
141
+ return null;
142
+ }
143
+ //# sourceMappingURL=surface-guard-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-guard-policy.js","sourceRoot":"","sources":["../../../src/runtime-v2/feature-flags/surface-guard-policy.ts"],"names":[],"mappings":"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"}
@@ -154,6 +154,8 @@ export { CORE_PRINCIPLES, CORE_PRINCIPLE_IDS, isCorePrincipleId, getCorePrincipl
154
154
  export type { CorePrinciple } from './core-principles/index.js';
155
155
  export { VALID_SURFACE_KINDS, VALID_MVP_CATEGORIES, PLUGIN_SURFACE_REGISTRY, validateSurfaceRegistry, getEnabledSurfaces, getSurfacesByCategory, getSurfacesByKind, findUnclassifiedSurfaces, } from './feature-flags/index.js';
156
156
  export type { SurfaceKind, MvpCategory, PluginSurfaceEntry, SurfaceRegistryValidationResult, } from './feature-flags/index.js';
157
+ export { checkSurfaceGuard, getSurfaceIdForHook, getSurfaceIdForService, isSurfaceEnabled, guardHook, guardService, __resetSurfaceGuardSkipLogStateForTests, } from './feature-flags/index.js';
158
+ export type { SurfaceGuardResult, HookHandler, } from './feature-flags/index.js';
157
159
  export { runPromptFixture, runRuleHostFixture, runDeferArchiveFixture, computeProvenChannelStatus, generateContinuityMatrix, recommendProvenChannelNextIssue, isMvpChannel, parseChannels, makePrincipleArtifact, makeRuleArtifact, makeSandboxAlwaysPass, classifyLegacyDependency, MVP_CHANNELS, } from './proven-channel-baseline.js';
158
160
  export type { MvpChannel, ChannelFixtureResult, ProvenChannelBaselineSummary, ContinuityMatrixEntry, InputValidationFailure } from './proven-channel-baseline.js';
159
161
  export { STORY_A_CHANNELS, makeRunId, makePrincipleArtifactRecord, makeRuleArtifactRecord, computeDemoStatus, buildFollowUpObservation, buildDemoNarrative, validateDemoChannels, createDemoSandboxEvaluate, evaluateDemoGoldenTrace, type DemoNarrativeInput, } from './story-a-demo.js';
@@ -333,4 +335,6 @@ export { SimpleLRU, DetectionFunnelCore } from './detection/index.js';
333
335
  export { INTENT_MAX_BYTES, INTENT_DOC_TEMPLATE, INTENT_INJECT_MAX_CHARS, INTENT_TRUNCATION_MARKER, parseIntentDocSections, computeIntentContentHash, validateIntentDocSections, buildIntentFrictionBlock, NullIntentDocReader, generateIntentPatchProposal, } from './intent/index.js';
334
336
  export type { IntentDocSections, IntentDocWarning, IntentDocWarningCode, IntentFrictionBlockInput, IntentDocReader, IntentDocReadResult, IntentDocReference, IntentDocReadReason, IntentDecisionRecord, IntentDecisionInput, IntentDecisionRecordResult, IntentDecisionSummary, IntentDecisionStore, FollowUpPatch, IntentPatchProposal, } from './intent/index.js';
335
337
  export { SqliteIntentDecisionStore } from './store/intent/index.js';
338
+ export type { FileModification } from './risk/index.js';
339
+ export { estimateLineChanges } from './risk/index.js';
336
340
  //# sourceMappingURL=index.d.ts.map