@principles/core 1.240.14 → 1.240.16

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.
@@ -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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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Tests for OpenClawCliRuntimeAdapter healthCheck message-file lifecycle.
3
+ *
4
+ * Context: commit 89c91854 fixed a bug where healthCheck probe used the deleted
5
+ * MessageFileRef.arg field instead of MessageFileRef.filePath. These tests
6
+ * verify the REAL behavior the original PR claimed to cover but didn't:
7
+ *
8
+ * - The message file is actually created on disk and its path is passed to CLI
9
+ * - The file is cleaned up on BOTH success and failure paths (finally block)
10
+ * - Each probe gets a unique session ID
11
+ * - workspaceDir controls where the temp file lands
12
+ *
13
+ * ERR-088 lesson: the prior version of this file asserted only
14
+ * `expect(adapter).toBeDefined()` and `expect(...).not.toThrow()` while
15
+ * hardcoding `/test/workspace` (which fails on non-root CI and on Windows).
16
+ * A refactor deleting cleanupMessageFile would have left every test green.
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=openclaw-cli-runtime-adapter-message-file.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-cli-runtime-adapter-message-file.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/adapter/__tests__/openclaw-cli-runtime-adapter-message-file.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Tests for OpenClawCliRuntimeAdapter healthCheck message-file lifecycle.
3
+ *
4
+ * Context: commit 89c91854 fixed a bug where healthCheck probe used the deleted
5
+ * MessageFileRef.arg field instead of MessageFileRef.filePath. These tests
6
+ * verify the REAL behavior the original PR claimed to cover but didn't:
7
+ *
8
+ * - The message file is actually created on disk and its path is passed to CLI
9
+ * - The file is cleaned up on BOTH success and failure paths (finally block)
10
+ * - Each probe gets a unique session ID
11
+ * - workspaceDir controls where the temp file lands
12
+ *
13
+ * ERR-088 lesson: the prior version of this file asserted only
14
+ * `expect(adapter).toBeDefined()` and `expect(...).not.toThrow()` while
15
+ * hardcoding `/test/workspace` (which fails on non-root CI and on Windows).
16
+ * A refactor deleting cleanupMessageFile would have left every test green.
17
+ */
18
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
19
+ import * as fs from 'fs';
20
+ import * as path from 'path';
21
+ import * as os from 'os';
22
+ import { OpenClawCliRuntimeAdapter } from '../openclaw-cli-runtime-adapter.js';
23
+ // Mock runCliProcess so no real openclaw binary is needed; the filesystem
24
+ // (writeMessageFile / cleanupMessageFile) runs for real against a temp dir.
25
+ vi.mock('../../utils/cli-process-runner.js', () => ({
26
+ runCliProcess: vi.fn(),
27
+ }));
28
+ import { runCliProcess } from '../../utils/cli-process-runner.js';
29
+ const mockRunCliProcess = runCliProcess;
30
+ function makeCliOutput(overrides = {}) {
31
+ return {
32
+ stdout: '',
33
+ stderr: '',
34
+ exitCode: 0,
35
+ timedOut: false,
36
+ durationMs: 100,
37
+ ...overrides,
38
+ };
39
+ }
40
+ /** A successful probe-3 envelope: openclaw wraps the agent reply in stderr. */
41
+ function successEnvelope() {
42
+ return JSON.stringify({ payloads: [{ text: '{"ok":true}' }] });
43
+ }
44
+ describe('OpenClawCliRuntimeAdapter healthCheck message-file lifecycle', () => {
45
+ let tempWorkspace;
46
+ beforeEach(() => {
47
+ vi.clearAllMocks();
48
+ tempWorkspace = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-msgfile-test-'));
49
+ });
50
+ afterEach(() => {
51
+ fs.rmSync(tempWorkspace, { recursive: true, force: true });
52
+ });
53
+ // Helper: stub the first two probes (version + agents-list) to succeed so
54
+ // probe 3 (the message-file path) is reached.
55
+ function stubFirstTwoProbes(agentId = 'diag') {
56
+ mockRunCliProcess
57
+ .mockResolvedValueOnce(makeCliOutput({ exitCode: 0, stdout: 'openclaw version' }))
58
+ .mockResolvedValueOnce(makeCliOutput({ exitCode: 0, stdout: `[{"id":"${agentId}"}]` }));
59
+ }
60
+ describe('message file is created and passed to the CLI', () => {
61
+ it('creates the message file on disk under <workspace>/.pd/tmp and passes its real path', async () => {
62
+ const adapter = new OpenClawCliRuntimeAdapter({
63
+ runtimeMode: 'local',
64
+ agentId: 'diag',
65
+ workspaceDir: tempWorkspace,
66
+ });
67
+ stubFirstTwoProbes();
68
+ // Capture the file path + content WHILE the probe runs (before cleanup
69
+ // in the finally block removes it). The mock implementation reads the
70
+ // file off disk and stashes it for assertion after healthCheck returns.
71
+ let capturedPath = '';
72
+ let capturedContent = '';
73
+ mockRunCliProcess.mockImplementationOnce((opts) => {
74
+ const msgIdx = opts.args.indexOf('--message-file');
75
+ const filePath = opts.args[msgIdx + 1];
76
+ if (typeof filePath !== 'string')
77
+ throw new Error('--message-file path missing in probe args');
78
+ capturedPath = filePath;
79
+ capturedContent = fs.readFileSync(capturedPath, 'utf8');
80
+ return Promise.resolve(makeCliOutput({ exitCode: 0, stderr: successEnvelope() }));
81
+ });
82
+ await adapter.healthCheck();
83
+ // Must use --message-file (the bug fix), not the deleted --message.
84
+ expect(capturedPath).not.toBe('');
85
+ // The path must live under the real workspace .pd/tmp dir.
86
+ expect(capturedPath).toContain(path.join('.pd', 'tmp'));
87
+ expect(capturedPath.startsWith(tempWorkspace)).toBe(true);
88
+ // ERR-088: assert the file content is the probe payload, proving the
89
+ // created file actually carries the message (not just a path string).
90
+ expect(capturedContent).toContain('pd-runtime-v2');
91
+ expect(capturedContent).toContain('reply with');
92
+ // The args must still contain --message-file (belt-and-suspenders).
93
+ const probe3Call = mockRunCliProcess.mock.calls[2]?.[0];
94
+ expect(probe3Call.args).toContain('--message-file');
95
+ expect(probe3Call.args).not.toContain('--message');
96
+ });
97
+ it('falls back to os.tmpdir() when no workspaceDir is configured', async () => {
98
+ const adapter = new OpenClawCliRuntimeAdapter({ runtimeMode: 'local', agentId: 'diag' });
99
+ stubFirstTwoProbes();
100
+ mockRunCliProcess.mockResolvedValueOnce(makeCliOutput({ exitCode: 0, stderr: successEnvelope() }));
101
+ await adapter.healthCheck();
102
+ const probe3Call = mockRunCliProcess.mock.calls[2]?.[0];
103
+ if (!probe3Call)
104
+ throw new Error('expected probe3 call');
105
+ const filePath = probe3Call.args[probe3Call.args.indexOf('--message-file') + 1];
106
+ // Without workspaceDir, the temp file must NOT be under any .pd/tmp.
107
+ expect(filePath).not.toContain(path.join('.pd', 'tmp'));
108
+ // It should still match the msg-*.json naming convention.
109
+ expect(path.basename(filePath)).toMatch(/^msg-.*\.json$/);
110
+ });
111
+ });
112
+ describe('cleanup runs on BOTH success and failure (finally block)', () => {
113
+ it('deletes the message file after a SUCCESSFUL probe', async () => {
114
+ const adapter = new OpenClawCliRuntimeAdapter({
115
+ runtimeMode: 'local',
116
+ agentId: 'diag',
117
+ workspaceDir: tempWorkspace,
118
+ });
119
+ stubFirstTwoProbes();
120
+ mockRunCliProcess.mockResolvedValueOnce(makeCliOutput({ exitCode: 0, stderr: successEnvelope() }));
121
+ await adapter.healthCheck();
122
+ const probe3Call = mockRunCliProcess.mock.calls[2]?.[0];
123
+ const filePath = probe3Call.args[probe3Call.args.indexOf('--message-file') + 1];
124
+ // ERR-088: the prior test only asserted result.healthy — removing
125
+ // cleanupMessageFile left it green. Now assert the file is GONE.
126
+ expect(fs.existsSync(filePath)).toBe(false);
127
+ });
128
+ it('deletes the message file after a TIMED-OUT probe', async () => {
129
+ const adapter = new OpenClawCliRuntimeAdapter({
130
+ runtimeMode: 'local',
131
+ agentId: 'diag',
132
+ workspaceDir: tempWorkspace,
133
+ });
134
+ stubFirstTwoProbes();
135
+ // Capture the file path before the probe runs so we can check cleanup
136
+ // after the early-return on timeout.
137
+ let createdFilePath = '';
138
+ mockRunCliProcess.mockResolvedValueOnce(makeCliOutput({ timedOut: true, exitCode: null }));
139
+ // We need the path; intercept by reading it from the mock call args.
140
+ // healthCheck calls writeMessageFile (real) then runCliProcess (mocked).
141
+ // The path is in the 3rd runCliProcess call's args.
142
+ const result = await adapter.healthCheck();
143
+ expect(result.healthy).toBe(false);
144
+ const probe3Call = mockRunCliProcess.mock.calls[2]?.[0];
145
+ createdFilePath = probe3Call.args[probe3Call.args.indexOf('--message-file') + 1];
146
+ // Even on timeout, the finally block must clean up.
147
+ expect(fs.existsSync(createdFilePath)).toBe(false);
148
+ });
149
+ it('deletes the message file after a probe with non-zero exit code', async () => {
150
+ const adapter = new OpenClawCliRuntimeAdapter({
151
+ runtimeMode: 'local',
152
+ agentId: 'diag',
153
+ workspaceDir: tempWorkspace,
154
+ });
155
+ stubFirstTwoProbes();
156
+ mockRunCliProcess.mockResolvedValueOnce(makeCliOutput({ exitCode: 1, stderr: 'PluginLoadFailureError' }));
157
+ await adapter.healthCheck();
158
+ const probe3Call = mockRunCliProcess.mock.calls[2]?.[0];
159
+ const filePath = probe3Call.args[probe3Call.args.indexOf('--message-file') + 1];
160
+ expect(fs.existsSync(filePath)).toBe(false);
161
+ });
162
+ });
163
+ describe('each probe gets a unique session ID', () => {
164
+ it('generates a distinct --session-id across two consecutive healthChecks', async () => {
165
+ const adapter = new OpenClawCliRuntimeAdapter({
166
+ runtimeMode: 'local',
167
+ agentId: 'diag',
168
+ workspaceDir: tempWorkspace,
169
+ });
170
+ const sessionIds = [];
171
+ for (let i = 0; i < 2; i++) {
172
+ stubFirstTwoProbes();
173
+ mockRunCliProcess.mockResolvedValueOnce(makeCliOutput({ exitCode: 0, stderr: successEnvelope() }));
174
+ await adapter.healthCheck();
175
+ const probe3Call = mockRunCliProcess.mock.calls[mockRunCliProcess.mock.calls.length - 1]?.[0];
176
+ const sid = probe3Call.args[probe3Call.args.indexOf('--session-id') + 1];
177
+ sessionIds.push(sid);
178
+ }
179
+ // ERR-088: the prior test ran healthCheck ONCE and asserted the prefix,
180
+ // which a hardcoded `pd-runtime-probe-*` ID would also satisfy. Two runs
181
+ // must yield two distinct IDs.
182
+ expect(sessionIds).toHaveLength(2);
183
+ expect(sessionIds[0]).not.toBe(sessionIds[1]);
184
+ expect(sessionIds.every((s) => s.startsWith('pd-runtime-probe-'))).toBe(true);
185
+ });
186
+ });
187
+ });
188
+ //# sourceMappingURL=openclaw-cli-runtime-adapter-message-file.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-cli-runtime-adapter-message-file.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/adapter/__tests__/openclaw-cli-runtime-adapter-message-file.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@principles/core",
3
- "version": "1.240.14",
3
+ "version": "1.240.16",
4
4
  "description": "Universal Evolution SDK - framework-agnostic pain signal capture and principle injection",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",