@principles/core 1.240.13 → 1.240.15

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 (30) hide show
  1. package/dist/runtime-v2/__tests__/context-payload-validation.test.d.ts +11 -0
  2. package/dist/runtime-v2/__tests__/context-payload-validation.test.d.ts.map +1 -0
  3. package/dist/runtime-v2/__tests__/context-payload-validation.test.js +309 -0
  4. package/dist/runtime-v2/__tests__/context-payload-validation.test.js.map +1 -0
  5. package/dist/runtime-v2/__tests__/pain-signal-runtime-factory-edge-cases.test.d.ts +8 -0
  6. package/dist/runtime-v2/__tests__/pain-signal-runtime-factory-edge-cases.test.d.ts.map +1 -0
  7. package/dist/runtime-v2/__tests__/pain-signal-runtime-factory-edge-cases.test.js +168 -0
  8. package/dist/runtime-v2/__tests__/pain-signal-runtime-factory-edge-cases.test.js.map +1 -0
  9. package/dist/runtime-v2/adapter/__tests__/openclaw-cli-runtime-adapter.test.js +1 -1
  10. package/dist/runtime-v2/adapter/__tests__/openclaw-cli-runtime-adapter.test.js.map +1 -1
  11. package/dist/runtime-v2/adapter/__tests__/pi-ai-runtime-adapter.test.js +1 -1
  12. package/dist/runtime-v2/adapter/__tests__/pi-ai-runtime-adapter.test.js.map +1 -1
  13. package/dist/runtime-v2/adapter/__tests__/runtime-config-contract.test.js +1 -1
  14. package/dist/runtime-v2/adapter/__tests__/runtime-config-contract.test.js.map +1 -1
  15. package/dist/runtime-v2/adapter/test-double-runtime-adapter.js +1 -1
  16. package/dist/runtime-v2/adapter/test-double-runtime-adapter.js.map +1 -1
  17. package/dist/runtime-v2/diagnostician-output.d.ts.map +1 -1
  18. package/dist/runtime-v2/diagnostician-output.js +7 -1
  19. package/dist/runtime-v2/diagnostician-output.js.map +1 -1
  20. package/dist/runtime-v2/runner/__tests__/default-validator.test.js +23 -0
  21. package/dist/runtime-v2/runner/__tests__/default-validator.test.js.map +1 -1
  22. package/dist/runtime-v2/runner/default-validator.d.ts.map +1 -1
  23. package/dist/runtime-v2/runner/default-validator.js +16 -1
  24. package/dist/runtime-v2/runner/default-validator.js.map +1 -1
  25. package/dist/runtime-v2/store/commit/diagnostician-committer.d.ts.map +1 -1
  26. package/dist/runtime-v2/store/commit/diagnostician-committer.js +13 -0
  27. package/dist/runtime-v2/store/commit/diagnostician-committer.js.map +1 -1
  28. package/dist/runtime-v2/store/diagnostician-committer.test.js +36 -2
  29. package/dist/runtime-v2/store/diagnostician-committer.test.js.map +1 -1
  30. package/package.json +1 -1
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Context Payload Type Validation Tests
3
+ *
4
+ * Tests the TypeBox schema validation and edge cases for:
5
+ * - HistoryQueryEntry
6
+ * - TrajectoryLocateResult
7
+ * - DiagnosisTarget
8
+ * - PainEvidenceEntry
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=context-payload-validation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-payload-validation.test.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/context-payload-validation.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,309 @@
1
+ /**
2
+ * Context Payload Type Validation Tests
3
+ *
4
+ * Tests the TypeBox schema validation and edge cases for:
5
+ * - HistoryQueryEntry
6
+ * - TrajectoryLocateResult
7
+ * - DiagnosisTarget
8
+ * - PainEvidenceEntry
9
+ */
10
+ import { describe, it, expect } from 'vitest';
11
+ import { TypeCompiler } from '@sinclair/typebox/compiler';
12
+ import { HistoryQueryEntrySchema, TrajectoryLocateQuerySchema, TrajectoryCandidateSchema, TrajectoryLocateResultSchema, DiagnosisTargetSchema, PainEvidenceEntrySchema, } from '../context-payload.js';
13
+ // Compile schemas for validation
14
+ const checkHistoryQueryEntry = TypeCompiler.Compile(HistoryQueryEntrySchema);
15
+ const checkTrajectoryLocateQuery = TypeCompiler.Compile(TrajectoryLocateQuerySchema);
16
+ const checkTrajectoryCandidate = TypeCompiler.Compile(TrajectoryCandidateSchema);
17
+ const checkTrajectoryLocateResult = TypeCompiler.Compile(TrajectoryLocateResultSchema);
18
+ const checkDiagnosisTarget = TypeCompiler.Compile(DiagnosisTargetSchema);
19
+ const checkPainEvidenceEntry = TypeCompiler.Compile(PainEvidenceEntrySchema);
20
+ describe('HistoryQueryEntrySchema', () => {
21
+ it('accepts valid user role entry', () => {
22
+ const entry = {
23
+ ts: '2024-01-01T00:00:00Z',
24
+ role: 'user',
25
+ text: 'Hello world',
26
+ };
27
+ expect(checkHistoryQueryEntry.Check(entry)).toBe(true);
28
+ });
29
+ it('accepts valid assistant role entry', () => {
30
+ const entry = {
31
+ ts: '2024-01-01T00:00:01Z',
32
+ role: 'assistant',
33
+ text: 'Response',
34
+ eventType: 'response',
35
+ };
36
+ expect(checkHistoryQueryEntry.Check(entry)).toBe(true);
37
+ });
38
+ it('accepts valid tool role entry with toolName', () => {
39
+ const entry = {
40
+ ts: '2024-01-01T00:00:02Z',
41
+ role: 'tool',
42
+ toolName: 'execute_command',
43
+ toolResultSummary: 'Success',
44
+ };
45
+ expect(checkHistoryQueryEntry.Check(entry)).toBe(true);
46
+ });
47
+ it('accepts valid system role entry', () => {
48
+ const entry = {
49
+ ts: '2024-01-01T00:00:00Z',
50
+ role: 'system',
51
+ text: 'System message',
52
+ };
53
+ expect(checkHistoryQueryEntry.Check(entry)).toBe(true);
54
+ });
55
+ it('rejects entry with invalid role', () => {
56
+ const entry = {
57
+ ts: '2024-01-01T00:00:00Z',
58
+ role: 'invalid_role',
59
+ text: 'Test',
60
+ };
61
+ expect(checkHistoryQueryEntry.Check(entry)).toBe(false);
62
+ });
63
+ it('rejects entry missing required ts field', () => {
64
+ const entry = {
65
+ role: 'user',
66
+ text: 'Test',
67
+ };
68
+ expect(checkHistoryQueryEntry.Check(entry)).toBe(false);
69
+ });
70
+ it('rejects entry with empty ts string', () => {
71
+ const entry = {
72
+ ts: '',
73
+ role: 'user',
74
+ text: 'Test',
75
+ };
76
+ expect(checkHistoryQueryEntry.Check(entry)).toBe(false);
77
+ });
78
+ });
79
+ describe('TrajectoryLocateQuerySchema', () => {
80
+ it('accepts query with painId', () => {
81
+ const query = {
82
+ painId: 'pain-001',
83
+ };
84
+ expect(checkTrajectoryLocateQuery.Check(query)).toBe(true);
85
+ });
86
+ it('accepts query with taskId', () => {
87
+ const query = {
88
+ taskId: 'task-001',
89
+ };
90
+ expect(checkTrajectoryLocateQuery.Check(query)).toBe(true);
91
+ });
92
+ it('accepts query with multiple identifiers', () => {
93
+ const query = {
94
+ painId: 'pain-001',
95
+ taskId: 'task-001',
96
+ runId: 'run-001',
97
+ sessionId: 'session-001',
98
+ };
99
+ expect(checkTrajectoryLocateQuery.Check(query)).toBe(true);
100
+ });
101
+ it('accepts query with timeRange', () => {
102
+ const query = {
103
+ timeRange: {
104
+ start: '2024-01-01T00:00:00Z',
105
+ end: '2024-01-02T00:00:00Z',
106
+ },
107
+ };
108
+ expect(checkTrajectoryLocateQuery.Check(query)).toBe(true);
109
+ });
110
+ it('accepts empty query (all fields optional)', () => {
111
+ const query = {};
112
+ expect(checkTrajectoryLocateQuery.Check(query)).toBe(true);
113
+ });
114
+ it('rejects query with empty painId', () => {
115
+ const query = {
116
+ painId: '',
117
+ };
118
+ expect(checkTrajectoryLocateQuery.Check(query)).toBe(false);
119
+ });
120
+ });
121
+ describe('TrajectoryCandidateSchema', () => {
122
+ it('accepts valid candidate', () => {
123
+ const candidate = {
124
+ trajectoryRef: 'traj-001',
125
+ confidence: 0.85,
126
+ reasons: ['High confidence match'],
127
+ };
128
+ expect(checkTrajectoryCandidate.Check(candidate)).toBe(true);
129
+ });
130
+ it('accepts candidate with sourceTypes', () => {
131
+ const candidate = {
132
+ trajectoryRef: 'traj-002',
133
+ confidence: 0.9,
134
+ reasons: ['Exact match', 'Recent activity'],
135
+ sourceTypes: ['user_message', 'assistant_response'],
136
+ };
137
+ expect(checkTrajectoryCandidate.Check(candidate)).toBe(true);
138
+ });
139
+ it('rejects candidate with confidence below 0', () => {
140
+ const candidate = {
141
+ trajectoryRef: 'traj-003',
142
+ confidence: -0.1,
143
+ reasons: ['Test'],
144
+ };
145
+ expect(checkTrajectoryCandidate.Check(candidate)).toBe(false);
146
+ });
147
+ it('rejects candidate with confidence above 1', () => {
148
+ const candidate = {
149
+ trajectoryRef: 'traj-004',
150
+ confidence: 1.5,
151
+ reasons: ['Test'],
152
+ };
153
+ expect(checkTrajectoryCandidate.Check(candidate)).toBe(false);
154
+ });
155
+ it('accepts candidate with confidence at boundaries (0 and 1)', () => {
156
+ const candidate0 = {
157
+ trajectoryRef: 'traj-005',
158
+ confidence: 0,
159
+ reasons: ['Low confidence'],
160
+ };
161
+ const candidate1 = {
162
+ trajectoryRef: 'traj-006',
163
+ confidence: 1,
164
+ reasons: ['Perfect match'],
165
+ };
166
+ expect(checkTrajectoryCandidate.Check(candidate0)).toBe(true);
167
+ expect(checkTrajectoryCandidate.Check(candidate1)).toBe(true);
168
+ });
169
+ it('rejects candidate with empty reason string', () => {
170
+ const candidate = {
171
+ trajectoryRef: 'traj-008',
172
+ confidence: 0.5,
173
+ reasons: ['', 'valid reason'],
174
+ };
175
+ expect(checkTrajectoryCandidate.Check(candidate)).toBe(false);
176
+ });
177
+ });
178
+ describe('TrajectoryLocateResultSchema', () => {
179
+ it('accepts valid result with multiple candidates', () => {
180
+ const result = {
181
+ query: { painId: 'pain-001' },
182
+ candidates: [
183
+ {
184
+ trajectoryRef: 'traj-001',
185
+ confidence: 0.9,
186
+ reasons: ['Primary match'],
187
+ },
188
+ {
189
+ trajectoryRef: 'traj-002',
190
+ confidence: 0.7,
191
+ reasons: ['Secondary match'],
192
+ },
193
+ ],
194
+ };
195
+ expect(checkTrajectoryLocateResult.Check(result)).toBe(true);
196
+ });
197
+ it('accepts result with empty candidates array', () => {
198
+ const result = {
199
+ query: { painId: 'pain-002' },
200
+ candidates: [],
201
+ };
202
+ expect(checkTrajectoryLocateResult.Check(result)).toBe(true);
203
+ });
204
+ it('rejects result missing query field', () => {
205
+ const result = {
206
+ candidates: [],
207
+ };
208
+ expect(checkTrajectoryLocateResult.Check(result)).toBe(false);
209
+ });
210
+ });
211
+ describe('DiagnosisTargetSchema', () => {
212
+ it('accepts minimal diagnosis target', () => {
213
+ const target = {};
214
+ expect(checkDiagnosisTarget.Check(target)).toBe(true);
215
+ });
216
+ it('accepts diagnosis target with all fields', () => {
217
+ const target = {
218
+ reasonSummary: 'Test reason',
219
+ source: 'user_reported',
220
+ severity: 'high',
221
+ painId: 'pain-001',
222
+ sessionIdHint: 'session-001',
223
+ provenance: 'owner_reported_no_host_trace',
224
+ provenanceReason: 'Manual report from owner',
225
+ traceAvailability: 'available',
226
+ evidence: [
227
+ { sourceRef: 'ref-001', note: 'Evidence note' },
228
+ ],
229
+ };
230
+ expect(checkDiagnosisTarget.Check(target)).toBe(true);
231
+ });
232
+ it('accepts diagnosis target with unavailable trace', () => {
233
+ const target = {
234
+ painId: 'pain-002',
235
+ traceAvailability: 'unavailable_with_reason',
236
+ traceUnavailableDetail: {
237
+ reason: 'Session expired',
238
+ nextAction: 'Request owner to re-report',
239
+ },
240
+ };
241
+ expect(checkDiagnosisTarget.Check(target)).toBe(true);
242
+ });
243
+ it('accepts all provenance variants', () => {
244
+ const provenances = [
245
+ 'openclaw_context_bound',
246
+ 'owner_reported_no_host_trace',
247
+ 'automatic_hook',
248
+ ];
249
+ provenances.forEach((provenance) => {
250
+ const target = { provenance };
251
+ expect(checkDiagnosisTarget.Check(target)).toBe(true);
252
+ });
253
+ });
254
+ it('accepts all traceAvailability variants', () => {
255
+ const availabilities = [
256
+ 'available',
257
+ 'unavailable_with_reason',
258
+ 'ambiguous',
259
+ ];
260
+ availabilities.forEach((traceAvailability) => {
261
+ const target = { traceAvailability };
262
+ expect(checkDiagnosisTarget.Check(target)).toBe(true);
263
+ });
264
+ });
265
+ it('rejects invalid provenance value', () => {
266
+ const target = {
267
+ provenance: 'invalid_provenance',
268
+ };
269
+ expect(checkDiagnosisTarget.Check(target)).toBe(false);
270
+ });
271
+ });
272
+ describe('PainEvidenceEntrySchema', () => {
273
+ it('accepts valid evidence entry', () => {
274
+ const entry = {
275
+ sourceRef: 'ref-001',
276
+ note: 'User reported an error',
277
+ };
278
+ expect(checkPainEvidenceEntry.Check(entry)).toBe(true);
279
+ });
280
+ it('rejects evidence entry with empty sourceRef', () => {
281
+ const entry = {
282
+ sourceRef: '',
283
+ note: 'Test note',
284
+ };
285
+ expect(checkPainEvidenceEntry.Check(entry)).toBe(false);
286
+ });
287
+ it('rejects evidence entry with empty note', () => {
288
+ const entry = {
289
+ sourceRef: 'ref-002',
290
+ note: '',
291
+ };
292
+ expect(checkPainEvidenceEntry.Check(entry)).toBe(false);
293
+ });
294
+ it('rejects evidence entry with note exceeding maxLength', () => {
295
+ const entry = {
296
+ sourceRef: 'ref-003',
297
+ note: 'a'.repeat(201), // maxLength: 200
298
+ };
299
+ expect(checkPainEvidenceEntry.Check(entry)).toBe(false);
300
+ });
301
+ it('accepts evidence entry with note at maxLength boundary', () => {
302
+ const entry = {
303
+ sourceRef: 'ref-004',
304
+ note: 'a'.repeat(200), // maxLength: 200
305
+ };
306
+ expect(checkPainEvidenceEntry.Check(entry)).toBe(true);
307
+ });
308
+ });
309
+ //# sourceMappingURL=context-payload-validation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-payload-validation.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/context-payload-validation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Edge case tests for pain-signal-runtime-factory
3
+ *
4
+ * Focus on error paths, validation boundaries, and DisabledDiagnosticianRunner
5
+ * that are not fully covered by existing integration tests.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=pain-signal-runtime-factory-edge-cases.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pain-signal-runtime-factory-edge-cases.test.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/pain-signal-runtime-factory-edge-cases.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Edge case tests for pain-signal-runtime-factory
3
+ *
4
+ * Focus on error paths, validation boundaries, and DisabledDiagnosticianRunner
5
+ * that are not fully covered by existing integration tests.
6
+ */
7
+ import { describe, it, expect } from 'vitest';
8
+ import { DisabledDiagnosticianRunner, validateRuntimeConfig, isRuntimeConfigError, } from '../pain-signal-runtime-factory.js';
9
+ describe('DisabledDiagnosticianRunner', () => {
10
+ it('returns failed status with capability_missing error category', async () => {
11
+ const runner = new DisabledDiagnosticianRunner();
12
+ const result = await runner.run('task-001');
13
+ expect(result.status).toBe('failed');
14
+ expect(result.taskId).toBe('task-001');
15
+ expect(result.errorCategory).toBe('capability_missing');
16
+ expect(result.failureReason).toContain('Diagnostician pipeline is disabled');
17
+ expect(result.attemptCount).toBe(1);
18
+ });
19
+ it('returns the same error category for any taskId', async () => {
20
+ const runner = new DisabledDiagnosticianRunner();
21
+ const result1 = await runner.run('task-001');
22
+ const result2 = await runner.run('different-task-id');
23
+ const result3 = await runner.run('');
24
+ expect(result1.errorCategory).toBe('capability_missing');
25
+ expect(result2.errorCategory).toBe('capability_missing');
26
+ expect(result3.errorCategory).toBe('capability_missing');
27
+ });
28
+ });
29
+ describe('validateRuntimeConfig', () => {
30
+ it('accepts valid openclaw-cli config with local mode', () => {
31
+ const config = {
32
+ runtimeKind: 'openclaw-cli',
33
+ openclawMode: 'local',
34
+ timeoutMs: 300000,
35
+ agentId: 'main',
36
+ };
37
+ // Should not throw
38
+ expect(() => validateRuntimeConfig(config)).not.toThrow();
39
+ });
40
+ it('accepts valid openclaw-cli config with gateway mode', () => {
41
+ const config = {
42
+ runtimeKind: 'openclaw-cli',
43
+ openclawMode: 'gateway',
44
+ timeoutMs: 300000,
45
+ agentId: 'main',
46
+ };
47
+ expect(() => validateRuntimeConfig(config)).not.toThrow();
48
+ });
49
+ it('accepts openclaw-cli with undefined openclawMode (delegated mode)', () => {
50
+ const config = {
51
+ runtimeKind: 'openclaw-cli',
52
+ openclawMode: undefined,
53
+ timeoutMs: 300000,
54
+ agentId: 'main',
55
+ };
56
+ expect(() => validateRuntimeConfig(config)).not.toThrow();
57
+ });
58
+ it('rejects invalid openclawMode value', () => {
59
+ const config = {
60
+ runtimeKind: 'openclaw-cli',
61
+ openclawMode: 'invalid-mode',
62
+ timeoutMs: 300000,
63
+ agentId: 'main',
64
+ };
65
+ expect(() => validateRuntimeConfig(config)).toThrow(/Invalid openclawMode/);
66
+ expect(() => validateRuntimeConfig(config)).toThrow(/nextAction/);
67
+ });
68
+ it('accepts valid pi-ai config with all required fields', () => {
69
+ const config = {
70
+ runtimeKind: 'pi-ai',
71
+ provider: 'anthropic',
72
+ model: 'claude-3-5-sonnet',
73
+ apiKeyEnv: 'ANTHROPIC_API_KEY',
74
+ timeoutMs: 300000,
75
+ agentId: 'main',
76
+ };
77
+ expect(() => validateRuntimeConfig(config)).not.toThrow();
78
+ });
79
+ it('rejects pi-ai config missing provider', () => {
80
+ const config = {
81
+ runtimeKind: 'pi-ai',
82
+ model: 'claude-3-5-sonnet',
83
+ apiKeyEnv: 'ANTHROPIC_API_KEY',
84
+ timeoutMs: 300000,
85
+ agentId: 'main',
86
+ };
87
+ expect(() => validateRuntimeConfig(config)).toThrow(/Missing required fields/);
88
+ expect(() => validateRuntimeConfig(config)).toThrow(/provider/);
89
+ });
90
+ it('rejects pi-ai config missing model', () => {
91
+ const config = {
92
+ runtimeKind: 'pi-ai',
93
+ provider: 'anthropic',
94
+ apiKeyEnv: 'ANTHROPIC_API_KEY',
95
+ timeoutMs: 300000,
96
+ agentId: 'main',
97
+ };
98
+ expect(() => validateRuntimeConfig(config)).toThrow(/Missing required fields/);
99
+ expect(() => validateRuntimeConfig(config)).toThrow(/model/);
100
+ });
101
+ it('rejects pi-ai config missing apiKeyEnv', () => {
102
+ const config = {
103
+ runtimeKind: 'pi-ai',
104
+ provider: 'anthropic',
105
+ model: 'claude-3-5-sonnet',
106
+ timeoutMs: 300000,
107
+ agentId: 'main',
108
+ };
109
+ expect(() => validateRuntimeConfig(config)).toThrow(/Missing required fields/);
110
+ expect(() => validateRuntimeConfig(config)).toThrow(/apiKeyEnv/);
111
+ });
112
+ it('rejects non-built-in pi-ai provider without baseUrl', () => {
113
+ const config = {
114
+ runtimeKind: 'pi-ai',
115
+ provider: 'custom-provider',
116
+ model: 'custom-model',
117
+ apiKeyEnv: 'CUSTOM_API_KEY',
118
+ timeoutMs: 300000,
119
+ agentId: 'main',
120
+ };
121
+ expect(() => validateRuntimeConfig(config)).toThrow(/Missing required fields/);
122
+ expect(() => validateRuntimeConfig(config)).toThrow(/baseUrl/);
123
+ });
124
+ it('accepts non-built-in pi-ai provider with baseUrl', () => {
125
+ const config = {
126
+ runtimeKind: 'pi-ai',
127
+ provider: 'custom-provider',
128
+ model: 'custom-model',
129
+ apiKeyEnv: 'CUSTOM_API_KEY',
130
+ baseUrl: 'https://custom-endpoint.example.com/v1',
131
+ timeoutMs: 300000,
132
+ agentId: 'main',
133
+ };
134
+ expect(() => validateRuntimeConfig(config)).not.toThrow();
135
+ });
136
+ });
137
+ describe('isRuntimeConfigError', () => {
138
+ it('returns true for RuntimeConfigError', () => {
139
+ const error = {
140
+ ok: false,
141
+ reason: 'test_reason',
142
+ message: 'Test error message',
143
+ nextAction: 'Test next action',
144
+ };
145
+ expect(isRuntimeConfigError(error)).toBe(true);
146
+ });
147
+ it('returns false for valid RuntimeConfig', () => {
148
+ const config = {
149
+ runtimeKind: 'pi-ai',
150
+ provider: 'anthropic',
151
+ model: 'claude-3-5-sonnet',
152
+ apiKeyEnv: 'ANTHROPIC_API_KEY',
153
+ timeoutMs: 300000,
154
+ agentId: 'main',
155
+ };
156
+ expect(isRuntimeConfigError(config)).toBe(false);
157
+ });
158
+ it('returns false for openclaw-cli config', () => {
159
+ const config = {
160
+ runtimeKind: 'openclaw-cli',
161
+ openclawMode: 'local',
162
+ timeoutMs: 300000,
163
+ agentId: 'main',
164
+ };
165
+ expect(isRuntimeConfigError(config)).toBe(false);
166
+ });
167
+ });
168
+ //# sourceMappingURL=pain-signal-runtime-factory-edge-cases.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pain-signal-runtime-factory-edge-cases.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/pain-signal-runtime-factory-edge-cases.test.ts"],"names":[],"mappings":"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"}
@@ -23,7 +23,7 @@ const VALID_PAYLOAD = {
23
23
  rootCause: 'test root cause',
24
24
  violatedPrinciples: [],
25
25
  evidence: [],
26
- recommendations: [],
26
+ recommendations: [{ kind: 'defer', description: 'no actionable recommendation' }],
27
27
  confidence: 0.9,
28
28
  };
29
29
  function makeCliOutput(overrides = {}) {