@principles/pd-cli 1.109.1 → 1.109.3

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.
@@ -39,7 +39,7 @@ function detectLegacyFiles(workspaceDir) {
39
39
  /** PRI-404: Generate nextAction suggestions for removing legacy files. */
40
40
  function buildLegacyFileNextActions(legacyFiles) {
41
41
  return legacyFiles.map(f => {
42
- return `Run 'Remove-Item ${f} -Force' to remove legacy config`;
42
+ return `Run 'rm ${f}' to remove legacy config`;
43
43
  });
44
44
  }
45
45
  // ── Load PD Config ───────────────────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"pd-config-loader.js","sourceRoot":"","sources":["../../src/services/pd-config-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pd-config-loader.js","sourceRoot":"","sources":["../../src/services/pd-config-loader.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-runtime-from-pd-config.d.ts","sourceRoot":"","sources":["../../src/services/resolve-runtime-from-pd-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EAEd,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,MAAM,WAAW,2BAA2B;IAC1C,8CAA8C;IAC9C,MAAM,EAAE,mBAAmB,CAAC;IAC5B,+EAA+E;IAC/E,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,0EAA0E;IAC1E,gBAAgB,EAAE,kBAAkB,CAAC;IACrC,6DAA6D;IAC7D,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;;;OAIG;IACH,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAkBD;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EACpB,SAAS,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAuC,GAC5E,2BAA2B,CA0D7B;AAGD;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE;IACT,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,EACD,SAAS,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAuC,GAC5E,2BAA2B,GAAG;IAAE,YAAY,EAAE,aAAa,GAAG,IAAI,CAAA;CAAE,CAoBtE"}
1
+ {"version":3,"file":"resolve-runtime-from-pd-config.d.ts","sourceRoot":"","sources":["../../src/services/resolve-runtime-from-pd-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EAEd,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,MAAM,WAAW,2BAA2B;IAC1C,8CAA8C;IAC9C,MAAM,EAAE,mBAAmB,CAAC;IAC5B,+EAA+E;IAC/E,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,0EAA0E;IAC1E,gBAAgB,EAAE,kBAAkB,CAAC;IACrC,6DAA6D;IAC7D,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;;;OAIG;IACH,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAkBD;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EACpB,SAAS,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAuC,GAC5E,2BAA2B,CA0D7B;AAGD;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE;IACT,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,EACD,SAAS,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAuC,GAC5E,2BAA2B,GAAG;IAAE,YAAY,EAAE,aAAa,GAAG,IAAI,CAAA;CAAE,CA6BtE"}
@@ -112,15 +112,27 @@ export function resolveRuntimeWithOverrides(workspaceDir, overrides, getEnvVar =
112
112
  }
113
113
  const config = base.result;
114
114
  // CLI flags override config values
115
+ // Use ?? (not ||) so empty-string overrides are preserved until the guard below
115
116
  const merged = {
116
117
  ...config,
117
- provider: overrides.provider || config.provider,
118
- model: overrides.model || config.model,
119
- apiKeyEnv: overrides.apiKeyEnv || config.apiKeyEnv,
120
- baseUrl: overrides.baseUrl || config.baseUrl,
118
+ provider: overrides.provider ?? config.provider,
119
+ model: overrides.model ?? config.model,
120
+ apiKeyEnv: overrides.apiKeyEnv ?? config.apiKeyEnv,
121
+ baseUrl: overrides.baseUrl ?? config.baseUrl,
121
122
  maxRetries: overrides.maxRetries ?? config.maxRetries,
122
123
  timeoutMs: overrides.timeoutMs ?? config.timeoutMs,
123
124
  };
125
+ // Guard: empty-string provider/model/apiKeyEnv/baseUrl after merge means the user
126
+ // explicitly passed '' or the config has a blank value. Normalise to
127
+ // undefined so downstream validation (handlePiAiProbe) can catch it.
128
+ if (!merged.provider)
129
+ merged.provider = undefined;
130
+ if (!merged.model)
131
+ merged.model = undefined;
132
+ if (!merged.apiKeyEnv)
133
+ merged.apiKeyEnv = undefined;
134
+ if (!merged.baseUrl)
135
+ merged.baseUrl = undefined;
124
136
  return { ...base, mergedConfig: merged };
125
137
  }
126
138
  //# sourceMappingURL=resolve-runtime-from-pd-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-runtime-from-pd-config.js","sourceRoot":"","sources":["../../src/services/resolve-runtime-from-pd-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolve-runtime-from-pd-config.js","sourceRoot":"","sources":["../../src/services/resolve-runtime-from-pd-config.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@principles/pd-cli",
3
- "version": "1.109.1",
3
+ "version": "1.109.3",
4
4
  "description": "PD CLI — Pain recording, sample management, and evolution tasks",
5
5
  "type": "module",
6
6
  "bin": {
@@ -91,7 +91,7 @@ function detectLegacyFiles(workspaceDir: string): string[] {
91
91
  /** PRI-404: Generate nextAction suggestions for removing legacy files. */
92
92
  function buildLegacyFileNextActions(legacyFiles: string[]): string[] {
93
93
  return legacyFiles.map(f => {
94
- return `Run 'Remove-Item ${f} -Force' to remove legacy config`;
94
+ return `Run 'rm ${f}' to remove legacy config`;
95
95
  });
96
96
  }
97
97
 
@@ -169,15 +169,24 @@ export function resolveRuntimeWithOverrides(
169
169
 
170
170
  const config = base.result;
171
171
  // CLI flags override config values
172
+ // Use ?? (not ||) so empty-string overrides are preserved until the guard below
172
173
  const merged: RuntimeConfig = {
173
174
  ...config,
174
- provider: overrides.provider || config.provider,
175
- model: overrides.model || config.model,
176
- apiKeyEnv: overrides.apiKeyEnv || config.apiKeyEnv,
177
- baseUrl: overrides.baseUrl || config.baseUrl,
175
+ provider: overrides.provider ?? config.provider,
176
+ model: overrides.model ?? config.model,
177
+ apiKeyEnv: overrides.apiKeyEnv ?? config.apiKeyEnv,
178
+ baseUrl: overrides.baseUrl ?? config.baseUrl,
178
179
  maxRetries: overrides.maxRetries ?? config.maxRetries,
179
180
  timeoutMs: overrides.timeoutMs ?? config.timeoutMs,
180
181
  };
181
182
 
183
+ // Guard: empty-string provider/model/apiKeyEnv/baseUrl after merge means the user
184
+ // explicitly passed '' or the config has a blank value. Normalise to
185
+ // undefined so downstream validation (handlePiAiProbe) can catch it.
186
+ if (!merged.provider) merged.provider = undefined;
187
+ if (!merged.model) merged.model = undefined;
188
+ if (!merged.apiKeyEnv) merged.apiKeyEnv = undefined;
189
+ if (!merged.baseUrl) merged.baseUrl = undefined;
190
+
182
191
  return { ...base, mergedConfig: merged };
183
192
  }
@@ -240,7 +240,7 @@ describe('Legacy file detection', () => {
240
240
  } finally { rmTmpDir(tmp); }
241
241
  });
242
242
 
243
- it('PRI-404: legacyFileNextActions contains Remove-Item commands and does not pollute nextActions', async () => {
243
+ it('PRI-404: legacyFileNextActions contains rm commands and does not pollute nextActions', async () => {
244
244
  const tmp = mkTmpDir();
245
245
  const stateDir = path.join(tmp, '.state');
246
246
  fs.mkdirSync(stateDir, { recursive: true });
@@ -248,10 +248,10 @@ describe('Legacy file detection', () => {
248
248
  try {
249
249
  const output = await buildDoctorOutput({ workspaceDir: tmp });
250
250
  expect(output.legacyFileNextActions.length).toBeGreaterThan(0);
251
- expect(output.legacyFileNextActions[0]).toContain('Remove-Item');
251
+ expect(output.legacyFileNextActions[0]).toContain('rm ');
252
252
  expect(output.legacyFileNextActions[0]).toContain('workflows.yaml');
253
253
  // Regression: legacyFileNextActions must NOT appear in general nextActions
254
- expect(output.nextActions.some(na => na.includes('Remove-Item') && na.includes('workflows.yaml'))).toBe(false);
254
+ expect(output.nextActions.some(na => na.includes('rm ') && na.includes('workflows.yaml'))).toBe(false);
255
255
  } finally { rmTmpDir(tmp); }
256
256
  });
257
257
  });
@@ -446,7 +446,7 @@ describe('Legacy file detection', () => {
446
446
  } finally { rmTmpDir(tmp); }
447
447
  });
448
448
 
449
- it('PRI-404: includes legacyFileNextActions with Remove-Item command when legacy files detected', () => {
449
+ it('PRI-404: includes legacyFileNextActions with rm command when legacy files detected', () => {
450
450
  const tmp = mkTmpDir();
451
451
  const stateDir = path.join(tmp, '.state');
452
452
  fs.mkdirSync(stateDir, { recursive: true });
@@ -454,7 +454,7 @@ describe('Legacy file detection', () => {
454
454
  try {
455
455
  const result = loadPdConfig(tmp);
456
456
  expect(result.legacyFileNextActions.length).toBeGreaterThan(0);
457
- expect(result.legacyFileNextActions[0]).toContain('Remove-Item');
457
+ expect(result.legacyFileNextActions[0]).toContain('rm ');
458
458
  expect(result.legacyFileNextActions[0]).toContain('workflows.yaml');
459
459
  } finally { rmTmpDir(tmp); }
460
460
  });
@@ -0,0 +1,424 @@
1
+ /**
2
+ * Tests for resolve-runtime-from-pd-config.ts — PRI-393, PRI-402
3
+ *
4
+ * Covers:
5
+ * - buildProfileLabel: pi-ai and openclaw profile label formatting
6
+ * - resolveRuntimeFromPdConfig: successful config loading, malformed config, legacy warnings
7
+ * - resolveRuntimeWithOverrides: CLI flag overrides on top of config values
8
+ */
9
+
10
+ import { describe, it, expect } from 'vitest';
11
+ import * as fs from 'node:fs';
12
+ import * as path from 'node:path';
13
+ import * as os from 'node:os';
14
+ import * as yaml from 'js-yaml';
15
+ import { isRuntimeConfigError } from '@principles/core/runtime-v2';
16
+ import {
17
+ resolveRuntimeFromPdConfig,
18
+ resolveRuntimeWithOverrides,
19
+ } from '../../src/services/resolve-runtime-from-pd-config.js';
20
+
21
+ function mkTmpDir(): string {
22
+ return fs.mkdtempSync(path.join(os.tmpdir(), 'pd-resolve-runtime-test-'));
23
+ }
24
+
25
+ function rmTmpDir(dir: string): void {
26
+ try { fs.rmSync(dir, { recursive: true, force: true }); } catch { /* ignore */ }
27
+ }
28
+
29
+ function writeConfig(workspaceDir: string, content: string): void {
30
+ const configDir = path.join(workspaceDir, '.pd');
31
+ fs.mkdirSync(configDir, { recursive: true });
32
+ fs.writeFileSync(path.join(configDir, 'config.yaml'), content, 'utf8');
33
+ }
34
+
35
+ const mockEnvWithKeys = (name: string): string | undefined => {
36
+ if (name === 'ANTHROPIC_API_KEY') return 'sk-ant-test-key';
37
+ if (name === 'OPENROUTER_API_KEY') return 'sk-or-test-key';
38
+ if (name === 'TEST_API_KEY') return 'sk-test-key';
39
+ return undefined;
40
+ };
41
+
42
+ function makeValidOpenClawConfigYaml(workspaceDir: string): string {
43
+ return yaml.dump({
44
+ version: 1,
45
+ features: {
46
+ prompt: { category: 'core', enabled: true },
47
+ code_tool_hook: { category: 'core', enabled: true },
48
+ defer_archive: { category: 'core', enabled: true },
49
+ },
50
+ workspace: {
51
+ default: workspaceDir,
52
+ },
53
+ runtimeProfiles: {
54
+ 'openclaw.default': { type: 'openclaw', source: 'default' },
55
+ 'openclaw.model.lmstudio.qwen3': { type: 'openclaw', provider: 'lmstudio', model: 'qwen3.6-27b-mtp' },
56
+ },
57
+ internalAgents: {
58
+ defaultRuntime: 'openclaw.default',
59
+ agents: {
60
+ diagnostician: { enabled: true, runtimeProfile: 'openclaw.model.lmstudio.qwen3' },
61
+ dreamer: { enabled: true },
62
+ scribe: { enabled: true },
63
+ artificer: { enabled: true },
64
+ },
65
+ },
66
+ });
67
+ }
68
+
69
+ function makeValidPiAiConfigYaml(workspaceDir: string): string {
70
+ return yaml.dump({
71
+ version: 1,
72
+ features: {
73
+ prompt: { category: 'core', enabled: true },
74
+ code_tool_hook: { category: 'core', enabled: true },
75
+ defer_archive: { category: 'core', enabled: true },
76
+ },
77
+ workspace: {
78
+ default: workspaceDir,
79
+ },
80
+ runtimeProfiles: {
81
+ 'pd.anthropic-sonnet': { type: 'pi-ai', provider: 'anthropic', model: 'claude-3-5-sonnet', apiKeyEnv: 'ANTHROPIC_API_KEY', timeoutMs: 300000, maxRetries: 3 },
82
+ },
83
+ internalAgents: {
84
+ defaultRuntime: 'pd.anthropic-sonnet',
85
+ agents: {
86
+ diagnostician: { enabled: true, runtimeProfile: 'pd.anthropic-sonnet' },
87
+ dreamer: { enabled: true },
88
+ scribe: { enabled: true },
89
+ artificer: { enabled: true },
90
+ },
91
+ },
92
+ });
93
+ }
94
+
95
+ describe('buildProfileLabel', () => {
96
+ it('formats pi-ai profile with provider and model', () => {
97
+ const tmp = mkTmpDir();
98
+ writeConfig(tmp, yaml.dump({
99
+ version: 1,
100
+ features: {
101
+ prompt: { category: 'core', enabled: true },
102
+ code_tool_hook: { category: 'core', enabled: true },
103
+ defer_archive: { category: 'core', enabled: true },
104
+ },
105
+ workspace: { default: tmp },
106
+ runtimeProfiles: {
107
+ 'pi-ai.test': { type: 'pi-ai', provider: 'openrouter', model: 'anthropic/claude-sonnet-4', apiKeyEnv: 'OPENROUTER_API_KEY' },
108
+ },
109
+ internalAgents: {
110
+ defaultRuntime: 'pi-ai.test',
111
+ agents: {
112
+ diagnostician: { enabled: true, runtimeProfile: 'pi-ai.test' },
113
+ },
114
+ },
115
+ }));
116
+ try {
117
+ const result = resolveRuntimeFromPdConfig(tmp, mockEnvWithKeys);
118
+ expect(result.runtimeProfileId).toBe('pi-ai.test');
119
+ expect(result.runtimeProfileLabel).toBe('pi-ai: openrouter/anthropic/claude-sonnet-4');
120
+ } finally { rmTmpDir(tmp); }
121
+ });
122
+
123
+ it('returns null profile info when pi-ai profile is missing required provider/model', () => {
124
+ const tmp = mkTmpDir();
125
+ writeConfig(tmp, yaml.dump({
126
+ version: 1,
127
+ features: {
128
+ prompt: { category: 'core', enabled: true },
129
+ code_tool_hook: { category: 'core', enabled: true },
130
+ defer_archive: { category: 'core', enabled: true },
131
+ },
132
+ workspace: { default: tmp },
133
+ runtimeProfiles: {
134
+ 'pi-ai.missing': { type: 'pi-ai', apiKeyEnv: 'TEST_API_KEY' },
135
+ },
136
+ internalAgents: {
137
+ defaultRuntime: 'pi-ai.missing',
138
+ agents: {
139
+ diagnostician: { enabled: true, runtimeProfile: 'pi-ai.missing' },
140
+ },
141
+ },
142
+ }));
143
+ try {
144
+ const result = resolveRuntimeFromPdConfig(tmp, mockEnvWithKeys);
145
+ expect(result.runtimeProfileId).toBe(null);
146
+ expect(result.runtimeProfileLabel).toBe(null);
147
+ } finally { rmTmpDir(tmp); }
148
+ });
149
+
150
+ it('formats openclaw profile with provider and model', () => {
151
+ const tmp = mkTmpDir();
152
+ writeConfig(tmp, yaml.dump({
153
+ version: 1,
154
+ features: {
155
+ prompt: { category: 'core', enabled: true },
156
+ code_tool_hook: { category: 'core', enabled: true },
157
+ defer_archive: { category: 'core', enabled: true },
158
+ },
159
+ workspace: { default: tmp },
160
+ runtimeProfiles: {
161
+ 'openclaw.model.lmstudio.qwen3': { type: 'openclaw', provider: 'lmstudio', model: 'qwen3.6-27b-mtp' },
162
+ },
163
+ internalAgents: {
164
+ defaultRuntime: 'openclaw.model.lmstudio.qwen3',
165
+ agents: {
166
+ diagnostician: { enabled: true, runtimeProfile: 'openclaw.model.lmstudio.qwen3' },
167
+ },
168
+ },
169
+ }));
170
+ try {
171
+ const result = resolveRuntimeFromPdConfig(tmp);
172
+ expect(result.runtimeProfileId).toBe('openclaw.model.lmstudio.qwen3');
173
+ expect(result.runtimeProfileLabel).toBe('openclaw: lmstudio: qwen3.6-27b-mtp');
174
+ } finally { rmTmpDir(tmp); }
175
+ });
176
+
177
+ it('formats openclaw profile with source when no provider/model', () => {
178
+ const tmp = mkTmpDir();
179
+ writeConfig(tmp, yaml.dump({
180
+ version: 1,
181
+ features: {
182
+ prompt: { category: 'core', enabled: true },
183
+ code_tool_hook: { category: 'core', enabled: true },
184
+ defer_archive: { category: 'core', enabled: true },
185
+ },
186
+ workspace: { default: tmp },
187
+ runtimeProfiles: {
188
+ 'openclaw.default': { type: 'openclaw', source: 'default' },
189
+ },
190
+ internalAgents: {
191
+ defaultRuntime: 'openclaw.default',
192
+ agents: {
193
+ diagnostician: { enabled: true, runtimeProfile: 'openclaw.default' },
194
+ },
195
+ },
196
+ }));
197
+ try {
198
+ const result = resolveRuntimeFromPdConfig(tmp);
199
+ expect(result.runtimeProfileId).toBe('openclaw.default');
200
+ expect(result.runtimeProfileLabel).toBe('openclaw: default');
201
+ } finally { rmTmpDir(tmp); }
202
+ });
203
+ });
204
+
205
+ describe('resolveRuntimeFromPdConfig', () => {
206
+ it('returns resolved runtime config from valid openclaw config.yaml', () => {
207
+ const tmp = mkTmpDir();
208
+ writeConfig(tmp, makeValidOpenClawConfigYaml(tmp));
209
+ try {
210
+ const result = resolveRuntimeFromPdConfig(tmp);
211
+ expect(isRuntimeConfigError(result.result)).toBe(false);
212
+ expect(result.configSource).toBe('.pd/config.yaml');
213
+ expect(result.legacyWarnings).toEqual([]);
214
+ } finally { rmTmpDir(tmp); }
215
+ });
216
+
217
+ it('returns resolved runtime config from valid pi-ai config.yaml with env vars', () => {
218
+ const tmp = mkTmpDir();
219
+ writeConfig(tmp, makeValidPiAiConfigYaml(tmp));
220
+ try {
221
+ const result = resolveRuntimeFromPdConfig(tmp, mockEnvWithKeys);
222
+ expect(isRuntimeConfigError(result.result)).toBe(false);
223
+ expect(result.configSource).toBe('.pd/config.yaml');
224
+ } finally { rmTmpDir(tmp); }
225
+ });
226
+
227
+ it('returns legacy warnings when legacy files detected', () => {
228
+ const tmp = mkTmpDir();
229
+ writeConfig(tmp, makeValidOpenClawConfigYaml(tmp));
230
+ const stateDir = path.join(tmp, '.state');
231
+ fs.mkdirSync(stateDir, { recursive: true });
232
+ fs.writeFileSync(path.join(stateDir, 'workflows.yaml'), 'version: 1\n', 'utf8');
233
+ try {
234
+ const result = resolveRuntimeFromPdConfig(tmp);
235
+ expect(result.legacyWarnings.length).toBeGreaterThan(0);
236
+ expect(result.legacyWarnings[0]).toContain('Legacy config files detected');
237
+ expect(result.legacyWarnings[0]).toContain('workflows.yaml');
238
+ } finally { rmTmpDir(tmp); }
239
+ });
240
+
241
+ it('returns error result when config.yaml is malformed', () => {
242
+ const tmp = mkTmpDir();
243
+ writeConfig(tmp, 'version: [unterminated');
244
+ try {
245
+ const result = resolveRuntimeFromPdConfig(tmp);
246
+ expect(isRuntimeConfigError(result.result)).toBe(true);
247
+ if (!isRuntimeConfigError(result.result)) throw new Error('Expected RuntimeConfigError');
248
+ expect(result.result.reason).toContain('config_malformed');
249
+ expect(result.runtimeProfileId).toBe(null);
250
+ expect(result.runtimeProfileLabel).toBe(null);
251
+ } finally { rmTmpDir(tmp); }
252
+ });
253
+
254
+ it('returns error result when config.yaml validation fails', () => {
255
+ const tmp = mkTmpDir();
256
+ writeConfig(tmp, yaml.dump({ version: 99, features: {}, runtimeProfiles: {}, internalAgents: { defaultRuntime: 'x', agents: {} } }));
257
+ try {
258
+ const result = resolveRuntimeFromPdConfig(tmp);
259
+ expect(isRuntimeConfigError(result.result)).toBe(true);
260
+ if (!isRuntimeConfigError(result.result)) throw new Error('Expected RuntimeConfigError');
261
+ expect(result.result.reason).toContain('config_malformed');
262
+ } finally { rmTmpDir(tmp); }
263
+ });
264
+
265
+ it('returns defaults and profile info when config.yaml is missing', () => {
266
+ const tmp = mkTmpDir();
267
+ try {
268
+ const result = resolveRuntimeFromPdConfig(tmp);
269
+ expect(isRuntimeConfigError(result.result)).toBe(false);
270
+ expect(result.configSource).toBe('.pd/config.yaml');
271
+ expect(result.runtimeProfileId).toBe('openclaw.default');
272
+ expect(typeof result.runtimeProfileLabel).toBe('string');
273
+ } finally { rmTmpDir(tmp); }
274
+ });
275
+
276
+ it('includes legacy warnings even when config is malformed', () => {
277
+ const tmp = mkTmpDir();
278
+ writeConfig(tmp, 'version: [unterminated');
279
+ const stateDir = path.join(tmp, '.state');
280
+ fs.mkdirSync(stateDir, { recursive: true });
281
+ fs.writeFileSync(path.join(stateDir, 'workflows.yaml'), 'version: 1\n', 'utf8');
282
+ try {
283
+ const result = resolveRuntimeFromPdConfig(tmp);
284
+ expect(isRuntimeConfigError(result.result)).toBe(true);
285
+ expect(result.legacyWarnings.length).toBeGreaterThan(0);
286
+ } finally { rmTmpDir(tmp); }
287
+ });
288
+
289
+ it('returns not_ready error when pi-ai config is valid but apiKeyEnv not set', () => {
290
+ const tmp = mkTmpDir();
291
+ writeConfig(tmp, makeValidPiAiConfigYaml(tmp));
292
+ try {
293
+ const result = resolveRuntimeFromPdConfig(tmp, () => undefined);
294
+ expect(isRuntimeConfigError(result.result)).toBe(true);
295
+ if (!isRuntimeConfigError(result.result)) throw new Error('Expected RuntimeConfigError');
296
+ expect(result.result.reason).toBe('not_ready');
297
+ } finally { rmTmpDir(tmp); }
298
+ });
299
+ });
300
+
301
+ describe('resolveRuntimeWithOverrides', () => {
302
+ it('returns merged config with CLI overrides applied', () => {
303
+ const tmp = mkTmpDir();
304
+ writeConfig(tmp, makeValidPiAiConfigYaml(tmp));
305
+ try {
306
+ const result = resolveRuntimeWithOverrides(tmp, {
307
+ provider: 'openrouter',
308
+ model: 'anthropic/claude-sonnet-4',
309
+ apiKeyEnv: 'OPENROUTER_API_KEY',
310
+ }, mockEnvWithKeys);
311
+ expect(result.mergedConfig).not.toBeNull();
312
+ if (!result.mergedConfig) throw new Error('Expected mergedConfig');
313
+ expect(result.mergedConfig.provider).toBe('openrouter');
314
+ expect(result.mergedConfig.model).toBe('anthropic/claude-sonnet-4');
315
+ expect(result.mergedConfig.apiKeyEnv).toBe('OPENROUTER_API_KEY');
316
+ } finally { rmTmpDir(tmp); }
317
+ });
318
+
319
+ it('partial CLI overrides merge with config values', () => {
320
+ const tmp = mkTmpDir();
321
+ writeConfig(tmp, yaml.dump({
322
+ version: 1,
323
+ features: {
324
+ prompt: { category: 'core', enabled: true },
325
+ code_tool_hook: { category: 'core', enabled: true },
326
+ defer_archive: { category: 'core', enabled: true },
327
+ },
328
+ workspace: { default: tmp },
329
+ runtimeProfiles: {
330
+ 'pi-ai.test': { type: 'pi-ai', provider: 'anthropic', model: 'claude-3-5-sonnet', apiKeyEnv: 'ANTHROPIC_API_KEY', timeoutMs: 300000, maxRetries: 3 },
331
+ },
332
+ internalAgents: {
333
+ defaultRuntime: 'pi-ai.test',
334
+ agents: {
335
+ diagnostician: { enabled: true, runtimeProfile: 'pi-ai.test' },
336
+ },
337
+ },
338
+ }));
339
+ try {
340
+ const result = resolveRuntimeWithOverrides(tmp, {
341
+ model: 'claude-3-opus',
342
+ }, mockEnvWithKeys);
343
+ expect(result.mergedConfig).not.toBeNull();
344
+ if (!result.mergedConfig) throw new Error('Expected mergedConfig');
345
+ expect(result.mergedConfig.provider).toBe('anthropic');
346
+ expect(result.mergedConfig.model).toBe('claude-3-opus');
347
+ expect(result.mergedConfig.apiKeyEnv).toBe('ANTHROPIC_API_KEY');
348
+ expect(result.mergedConfig.timeoutMs).toBe(300000);
349
+ expect(result.mergedConfig.maxRetries).toBe(3);
350
+ } finally { rmTmpDir(tmp); }
351
+ });
352
+
353
+ it('returns mergedConfig as null when config resolution fails', () => {
354
+ const tmp = mkTmpDir();
355
+ writeConfig(tmp, 'version: [unterminated');
356
+ try {
357
+ const result = resolveRuntimeWithOverrides(tmp, { provider: 'openrouter' });
358
+ expect(isRuntimeConfigError(result.result)).toBe(true);
359
+ expect(result.mergedConfig).toBe(null);
360
+ } finally { rmTmpDir(tmp); }
361
+ });
362
+
363
+ it('merges maxRetries and timeoutMs with nullish coalescing', () => {
364
+ const tmp = mkTmpDir();
365
+ writeConfig(tmp, yaml.dump({
366
+ version: 1,
367
+ features: {
368
+ prompt: { category: 'core', enabled: true },
369
+ code_tool_hook: { category: 'core', enabled: true },
370
+ defer_archive: { category: 'core', enabled: true },
371
+ },
372
+ workspace: { default: tmp },
373
+ runtimeProfiles: {
374
+ 'pi-ai.test': { type: 'pi-ai', provider: 'anthropic', model: 'claude-3-5-sonnet', apiKeyEnv: 'ANTHROPIC_API_KEY', timeoutMs: 300000, maxRetries: 3 },
375
+ },
376
+ internalAgents: {
377
+ defaultRuntime: 'pi-ai.test',
378
+ agents: {
379
+ diagnostician: { enabled: true, runtimeProfile: 'pi-ai.test' },
380
+ },
381
+ },
382
+ }));
383
+ try {
384
+ const result = resolveRuntimeWithOverrides(tmp, {
385
+ maxRetries: 0,
386
+ timeoutMs: 0,
387
+ }, mockEnvWithKeys);
388
+ expect(result.mergedConfig).not.toBeNull();
389
+ if (!result.mergedConfig) throw new Error('Expected mergedConfig');
390
+ expect(result.mergedConfig.maxRetries).toBe(0);
391
+ expect(result.mergedConfig.timeoutMs).toBe(0);
392
+ } finally { rmTmpDir(tmp); }
393
+ });
394
+
395
+ it('returns profile info from config even when CLI overrides are provided', () => {
396
+ const tmp = mkTmpDir();
397
+ writeConfig(tmp, yaml.dump({
398
+ version: 1,
399
+ features: {
400
+ prompt: { category: 'core', enabled: true },
401
+ code_tool_hook: { category: 'core', enabled: true },
402
+ defer_archive: { category: 'core', enabled: true },
403
+ },
404
+ workspace: { default: tmp },
405
+ runtimeProfiles: {
406
+ 'pi-ai.test': { type: 'pi-ai', provider: 'anthropic', model: 'claude-3-5-sonnet', apiKeyEnv: 'ANTHROPIC_API_KEY' },
407
+ },
408
+ internalAgents: {
409
+ defaultRuntime: 'pi-ai.test',
410
+ agents: {
411
+ diagnostician: { enabled: true, runtimeProfile: 'pi-ai.test' },
412
+ },
413
+ },
414
+ }));
415
+ try {
416
+ const result = resolveRuntimeWithOverrides(tmp, {
417
+ provider: 'openrouter',
418
+ model: 'anthropic/claude-sonnet-4',
419
+ }, mockEnvWithKeys);
420
+ expect(result.runtimeProfileId).toBe('pi-ai.test');
421
+ expect(result.runtimeProfileLabel).toBe('pi-ai: anthropic/claude-3-5-sonnet');
422
+ } finally { rmTmpDir(tmp); }
423
+ });
424
+ });