@principles/pd-cli 1.73.2 → 1.75.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.
- package/dist/commands/config-doctor.d.ts +20 -0
- package/dist/commands/config-doctor.d.ts.map +1 -0
- package/dist/commands/config-doctor.js +144 -0
- package/dist/commands/config-doctor.js.map +1 -0
- package/dist/commands/console.d.ts +18 -0
- package/dist/commands/console.d.ts.map +1 -1
- package/dist/commands/console.js +439 -0
- package/dist/commands/console.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +83 -31
- package/dist/index.js.map +1 -1
- package/dist/services/config-doctor.d.ts +142 -0
- package/dist/services/config-doctor.d.ts.map +1 -0
- package/dist/services/config-doctor.js +603 -0
- package/dist/services/config-doctor.js.map +1 -0
- package/dist/services/console-launcher.d.ts +110 -0
- package/dist/services/console-launcher.d.ts.map +1 -0
- package/dist/services/console-launcher.js +282 -0
- package/dist/services/console-launcher.js.map +1 -0
- package/package.json +4 -2
- package/src/commands/config-doctor.ts +158 -0
- package/src/commands/console.ts +445 -1
- package/src/index.ts +89 -32
- package/src/services/config-doctor.ts +763 -0
- package/src/services/console-launcher.ts +373 -0
- package/tests/commands/cli-command-tree.test.ts +1 -1
- package/tests/commands/config-doctor.test.ts +624 -0
- package/tests/commands/console-open.test.ts +773 -0
- package/tests/pd-cli-smoke.test.ts +12 -0
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PD Config Doctor — discovers and explains PD / OpenClaw configuration state.
|
|
3
|
+
*
|
|
4
|
+
* PRI-299 MVP UX: provides a single, read-only view of:
|
|
5
|
+
* - PD workspace config paths (with existence checks)
|
|
6
|
+
* - OpenClaw config paths (with existence checks)
|
|
7
|
+
* - Effective feature flags
|
|
8
|
+
* - Provider/model/auth status (classified)
|
|
9
|
+
*
|
|
10
|
+
* Constraints:
|
|
11
|
+
* - NEVER reads or returns API key values, env var values, or raw config bytes.
|
|
12
|
+
* - All file reads are bounded; YAML/JSON is treated as `unknown` and validated.
|
|
13
|
+
* - Missing/malformed config produces a structured warning, never a crash.
|
|
14
|
+
* - Failures include `reason` and `nextAction` for operator guidance.
|
|
15
|
+
*/
|
|
16
|
+
import * as fs from 'fs';
|
|
17
|
+
import * as path from 'path';
|
|
18
|
+
import yaml from 'js-yaml';
|
|
19
|
+
import Database from 'better-sqlite3';
|
|
20
|
+
import { loadEffectiveFeatureFlags } from './feature-flag-loader.js';
|
|
21
|
+
import { FEATURE_FLAGS_CONFIG_FILENAME, FEATURE_FLAGS_CONFIG_DIR } from './feature-flag-loader.js';
|
|
22
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
23
|
+
function isRecord(value) {
|
|
24
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolve the OpenClaw home directory used to look up `openclaw.json` and
|
|
28
|
+
* extension state. PD does not own this path — it only reports its existence.
|
|
29
|
+
*/
|
|
30
|
+
export function getOpenClawHome() {
|
|
31
|
+
const home = process.env.HOME
|
|
32
|
+
|| process.env.USERPROFILE
|
|
33
|
+
|| (process.env.HOMEDRIVE && process.env.HOMEPATH ? process.env.HOMEDRIVE + process.env.HOMEPATH : '');
|
|
34
|
+
if (!home)
|
|
35
|
+
return path.join(process.cwd(), '.openclaw');
|
|
36
|
+
return path.join(home, '.openclaw');
|
|
37
|
+
}
|
|
38
|
+
export function getOpenClawConfigPath() {
|
|
39
|
+
return path.join(getOpenClawHome(), 'openclaw.json');
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Build a `ConfigPathEntry` with existence check.
|
|
43
|
+
*/
|
|
44
|
+
function pathEntry(p) {
|
|
45
|
+
return { path: p, exists: fs.existsSync(p) };
|
|
46
|
+
}
|
|
47
|
+
const RATE_LIMIT_KEYWORDS = ['rate_limit', 'rate-limit', '429', 'too many requests', 'rpm exhausted'];
|
|
48
|
+
const AUTH_MISSING_KEYWORDS = ['auth_missing', 'unauthorized', '401', 'api key', 'no api key', 'api_key missing'];
|
|
49
|
+
const UNAVAILABLE_KEYWORDS = ['unavailable', 'model fallback', 'candidate_failed', 'embedded agent failed'];
|
|
50
|
+
function classifyText(text) {
|
|
51
|
+
const lowered = text.toLowerCase();
|
|
52
|
+
for (const kw of RATE_LIMIT_KEYWORDS) {
|
|
53
|
+
if (lowered.includes(kw))
|
|
54
|
+
return 'rate_limit';
|
|
55
|
+
}
|
|
56
|
+
for (const kw of AUTH_MISSING_KEYWORDS) {
|
|
57
|
+
if (lowered.includes(kw))
|
|
58
|
+
return 'auth_missing';
|
|
59
|
+
}
|
|
60
|
+
for (const kw of UNAVAILABLE_KEYWORDS) {
|
|
61
|
+
if (lowered.includes(kw))
|
|
62
|
+
return 'unavailable';
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const DEFAULT_MAX_ROWS = 50;
|
|
67
|
+
const DEFAULT_MAX_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
68
|
+
/**
|
|
69
|
+
* Read the state.db recent provider error signal (best-effort, structural only).
|
|
70
|
+
*
|
|
71
|
+
* We inspect recent task/run rows in `<workspaceDir>/.pd/state.db` to detect
|
|
72
|
+
* `rate_limit` / `auth_missing` / `unavailable` signals from the live pipeline.
|
|
73
|
+
* This is a bounded best-effort probe — if the DB is missing or unreadable we
|
|
74
|
+
* return `null` and let the doctor fall back to config-only classification.
|
|
75
|
+
*/
|
|
76
|
+
export async function inspectStateDbForProviderSignal(stateDbPath, nowMs = Date.now(), opts = {}) {
|
|
77
|
+
const maxRows = opts.maxRows ?? DEFAULT_MAX_ROWS;
|
|
78
|
+
const maxAgeMs = opts.maxAgeMs ?? DEFAULT_MAX_AGE_MS;
|
|
79
|
+
if (!fs.existsSync(stateDbPath)) {
|
|
80
|
+
return { signal: null, dbReachable: false };
|
|
81
|
+
}
|
|
82
|
+
let db;
|
|
83
|
+
try {
|
|
84
|
+
db = new Database(stateDbPath, { readonly: true, fileMustExist: true });
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
return {
|
|
88
|
+
signal: null,
|
|
89
|
+
dbReachable: false,
|
|
90
|
+
warning: `state.db present but readonly open failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
// Check for tasks table — drift-safe (ERR-026): assert via pragma, not assumption.
|
|
95
|
+
const tableInfo = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='tasks'").get();
|
|
96
|
+
if (!tableInfo) {
|
|
97
|
+
return { signal: null, dbReachable: true, warning: 'state.db has no tasks table — pipeline not initialized yet' };
|
|
98
|
+
}
|
|
99
|
+
// Find columns defensively.
|
|
100
|
+
const taskCols = db.prepare("PRAGMA table_info(tasks)").all();
|
|
101
|
+
const taskColNames = new Set(taskCols.map((c) => c.name));
|
|
102
|
+
const hasErrorMessage = taskColNames.has('error_message');
|
|
103
|
+
const hasLastErrorMessage = taskColNames.has('last_error_message');
|
|
104
|
+
const hasFailureCategory = taskColNames.has('failure_category');
|
|
105
|
+
const hasErrorCategory = taskColNames.has('error_category');
|
|
106
|
+
const hasUpdatedAt = taskColNames.has('updated_at');
|
|
107
|
+
const hasLastErrorAt = taskColNames.has('last_error_at');
|
|
108
|
+
const hasCreatedAt = taskColNames.has('created_at');
|
|
109
|
+
if (!hasErrorMessage && !hasLastErrorMessage) {
|
|
110
|
+
return { signal: null, dbReachable: true, warning: 'state.db tasks table has no error_message column — provider signal unavailable' };
|
|
111
|
+
}
|
|
112
|
+
// Build a bounded scan: read up to maxRows recent failed tasks.
|
|
113
|
+
const errorCol = hasErrorMessage ? 'error_message' : 'last_error_message';
|
|
114
|
+
const tsCol = hasUpdatedAt ? 'updated_at' : hasLastErrorAt ? 'last_error_at' : hasCreatedAt ? 'created_at' : null;
|
|
115
|
+
const tsExpr = tsCol ? `, ${tsCol} AS ts` : '';
|
|
116
|
+
const whereExpr = tsCol ? `WHERE ${tsCol} >= ?` : '';
|
|
117
|
+
const params = tsCol ? [nowMs - maxAgeMs] : [];
|
|
118
|
+
const rows = db.prepare(`SELECT ${errorCol} AS error${tsExpr} FROM tasks ${whereExpr} ORDER BY rowid DESC LIMIT ?`).all(...params, maxRows);
|
|
119
|
+
let mostRecentObservedAt = null;
|
|
120
|
+
let aggregate = '';
|
|
121
|
+
for (const row of rows) {
|
|
122
|
+
if (typeof row.error !== 'string')
|
|
123
|
+
continue;
|
|
124
|
+
aggregate += ` ${row.error}`;
|
|
125
|
+
if (typeof row.ts === 'number' && (mostRecentObservedAt === null || row.ts > mostRecentObservedAt)) {
|
|
126
|
+
mostRecentObservedAt = row.ts;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Also check for explicit error_category/failure_category columns if present.
|
|
130
|
+
if (hasErrorCategory || hasFailureCategory) {
|
|
131
|
+
const catCol = hasErrorCategory ? 'error_category' : 'failure_category';
|
|
132
|
+
const catRows = db.prepare(`SELECT ${catCol} AS cat${tsCol ? `, ${tsCol} AS ts` : ''} FROM tasks WHERE ${catCol} IS NOT NULL ${tsCol ? `AND ${tsCol} >= ?` : ''} ORDER BY rowid DESC LIMIT ?`).all(...(tsCol ? [nowMs - maxAgeMs] : []), maxRows);
|
|
133
|
+
for (const row of catRows) {
|
|
134
|
+
if (typeof row.cat === 'string') {
|
|
135
|
+
aggregate += ` ${row.cat}`;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const classification = classifyText(aggregate);
|
|
140
|
+
if (classification === null) {
|
|
141
|
+
return { signal: null, dbReachable: true };
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
signal: {
|
|
145
|
+
classification,
|
|
146
|
+
reason: `Recent task error matches '${classification}' signature (state.db scan)`,
|
|
147
|
+
observedAt: mostRecentObservedAt ? new Date(mostRecentObservedAt).toISOString() : null,
|
|
148
|
+
},
|
|
149
|
+
dbReachable: true,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
return {
|
|
154
|
+
signal: null,
|
|
155
|
+
dbReachable: false,
|
|
156
|
+
warning: `state.db scan failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
try {
|
|
161
|
+
db.close();
|
|
162
|
+
}
|
|
163
|
+
catch { /* best effort */ }
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const DIAGNOSTIC_FUNNEL_ID = 'pd-runtime-v2-diagnosis';
|
|
167
|
+
export async function resolveProviderConfigFromWorkflows(stateDir, opts = {}) {
|
|
168
|
+
const workflowsPath = path.join(stateDir, 'workflows.yaml');
|
|
169
|
+
if (!fs.existsSync(workflowsPath)) {
|
|
170
|
+
// Fall back to CLI flag values if provided.
|
|
171
|
+
if (opts.cliProvider || opts.cliModel || opts.cliApiKeyEnv) {
|
|
172
|
+
return {
|
|
173
|
+
provider: opts.cliProvider ?? null,
|
|
174
|
+
model: opts.cliModel ?? null,
|
|
175
|
+
apiKeyEnv: opts.cliApiKeyEnv ?? null,
|
|
176
|
+
baseUrl: opts.cliBaseUrl ?? null,
|
|
177
|
+
source: 'cli_flag',
|
|
178
|
+
workflowsFound: false,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
provider: null,
|
|
183
|
+
model: null,
|
|
184
|
+
apiKeyEnv: null,
|
|
185
|
+
baseUrl: null,
|
|
186
|
+
source: 'missing',
|
|
187
|
+
workflowsFound: false,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
let raw;
|
|
191
|
+
try {
|
|
192
|
+
raw = fs.readFileSync(workflowsPath, 'utf8');
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
return {
|
|
196
|
+
provider: null,
|
|
197
|
+
model: null,
|
|
198
|
+
apiKeyEnv: null,
|
|
199
|
+
baseUrl: null,
|
|
200
|
+
source: 'workflows.yaml',
|
|
201
|
+
workflowsFound: true,
|
|
202
|
+
parseWarning: `workflows.yaml read failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
let parsed;
|
|
206
|
+
try {
|
|
207
|
+
parsed = yaml.load(raw);
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
return {
|
|
211
|
+
provider: null,
|
|
212
|
+
model: null,
|
|
213
|
+
apiKeyEnv: null,
|
|
214
|
+
baseUrl: null,
|
|
215
|
+
source: 'workflows.yaml',
|
|
216
|
+
workflowsFound: true,
|
|
217
|
+
parseWarning: `workflows.yaml parse error: ${err instanceof Error ? err.message : String(err)}`,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
if (!isRecord(parsed)) {
|
|
221
|
+
return {
|
|
222
|
+
provider: null,
|
|
223
|
+
model: null,
|
|
224
|
+
apiKeyEnv: null,
|
|
225
|
+
baseUrl: null,
|
|
226
|
+
source: 'workflows.yaml',
|
|
227
|
+
workflowsFound: true,
|
|
228
|
+
parseWarning: 'workflows.yaml root is not an object',
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
const funnelsRaw = parsed.funnels;
|
|
232
|
+
if (!Array.isArray(funnelsRaw)) {
|
|
233
|
+
return {
|
|
234
|
+
provider: null,
|
|
235
|
+
model: null,
|
|
236
|
+
apiKeyEnv: null,
|
|
237
|
+
baseUrl: null,
|
|
238
|
+
source: 'workflows.yaml',
|
|
239
|
+
workflowsFound: true,
|
|
240
|
+
parseWarning: 'workflows.yaml: funnels is not an array',
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
let policy = null;
|
|
244
|
+
for (const f of funnelsRaw) {
|
|
245
|
+
if (!isRecord(f))
|
|
246
|
+
continue;
|
|
247
|
+
if (f.workflowId === DIAGNOSTIC_FUNNEL_ID && isRecord(f.policy)) {
|
|
248
|
+
const { policy: candidate } = f;
|
|
249
|
+
if (isRecord(candidate)) {
|
|
250
|
+
policy = candidate;
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (policy === null) {
|
|
256
|
+
return {
|
|
257
|
+
provider: null,
|
|
258
|
+
model: null,
|
|
259
|
+
apiKeyEnv: null,
|
|
260
|
+
baseUrl: null,
|
|
261
|
+
source: 'workflows.yaml',
|
|
262
|
+
workflowsFound: true,
|
|
263
|
+
parseWarning: `workflows.yaml: funnel '${DIAGNOSTIC_FUNNEL_ID}' not found`,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
const provider = typeof policy.provider === 'string' ? policy.provider : null;
|
|
267
|
+
const model = typeof policy.model === 'string' ? policy.model : null;
|
|
268
|
+
const apiKeyEnv = typeof policy.apiKeyEnv === 'string' ? policy.apiKeyEnv : null;
|
|
269
|
+
const baseUrl = typeof policy.baseUrl === 'string' ? policy.baseUrl : null;
|
|
270
|
+
return {
|
|
271
|
+
provider: provider || opts.cliProvider || null,
|
|
272
|
+
model: model || opts.cliModel || null,
|
|
273
|
+
apiKeyEnv: apiKeyEnv || opts.cliApiKeyEnv || null,
|
|
274
|
+
baseUrl: baseUrl || opts.cliBaseUrl || null,
|
|
275
|
+
source: 'workflows.yaml',
|
|
276
|
+
workflowsFound: true,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
const MVP_CHANNELS = new Set(['prompt', 'code_tool_hook', 'defer_archive']);
|
|
280
|
+
export async function buildDoctorOutput(input) {
|
|
281
|
+
const workspaceDir = path.resolve(input.workspaceDir);
|
|
282
|
+
const pdDir = path.join(workspaceDir, FEATURE_FLAGS_CONFIG_DIR);
|
|
283
|
+
const featureFlagsPath = path.join(pdDir, FEATURE_FLAGS_CONFIG_FILENAME);
|
|
284
|
+
const workflowsPath = path.join(workspaceDir, '.state', 'workflows.yaml');
|
|
285
|
+
const stateDbPath = path.join(pdDir, 'state.db');
|
|
286
|
+
// 1) Feature flags
|
|
287
|
+
let enabledMvpChannels = [];
|
|
288
|
+
let disabledFlags = [];
|
|
289
|
+
let flagSource;
|
|
290
|
+
let flagWarnings;
|
|
291
|
+
let hasFeatureFlagsError = false;
|
|
292
|
+
let featureFlagsErrorMessage = '';
|
|
293
|
+
let correctionObserverEnabled = true;
|
|
294
|
+
let coFlagSource = 'defaults';
|
|
295
|
+
try {
|
|
296
|
+
const flags = loadEffectiveFeatureFlags(workspaceDir);
|
|
297
|
+
flagSource = flags.source;
|
|
298
|
+
flagWarnings = [...flags.warnings];
|
|
299
|
+
for (const flag of Object.values(flags.flags)) {
|
|
300
|
+
if (flag.enabled && MVP_CHANNELS.has(flag.id)) {
|
|
301
|
+
enabledMvpChannels.push(flag.id);
|
|
302
|
+
}
|
|
303
|
+
else if (!flag.enabled) {
|
|
304
|
+
disabledFlags.push(flag.id);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (flags.flags && flags.flags.correction_observer) {
|
|
308
|
+
correctionObserverEnabled = flags.flags.correction_observer.enabled;
|
|
309
|
+
coFlagSource = flags.source;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
hasFeatureFlagsError = true;
|
|
314
|
+
featureFlagsErrorMessage = err instanceof Error ? err.message : String(err);
|
|
315
|
+
flagSource = 'unavailable';
|
|
316
|
+
flagWarnings = [`feature flags unavailable: ${featureFlagsErrorMessage}`];
|
|
317
|
+
coFlagSource = 'unavailable';
|
|
318
|
+
}
|
|
319
|
+
// 2) Provider config from workflows.yaml (or CLI override)
|
|
320
|
+
const providerCfg = await resolveProviderConfigFromWorkflows(path.join(workspaceDir, '.state'), {
|
|
321
|
+
cliProvider: input.cliProvider,
|
|
322
|
+
cliModel: input.cliModel,
|
|
323
|
+
cliApiKeyEnv: input.cliApiKeyEnv,
|
|
324
|
+
cliBaseUrl: input.cliBaseUrl,
|
|
325
|
+
});
|
|
326
|
+
// 3) Build the provider health entry. NEVER leak env var value.
|
|
327
|
+
const providerHealth = [];
|
|
328
|
+
const warnings = [];
|
|
329
|
+
const nextActions = [];
|
|
330
|
+
if (providerCfg.source === 'missing' && !input.cliProvider) {
|
|
331
|
+
providerHealth.push({
|
|
332
|
+
provider: null,
|
|
333
|
+
model: null,
|
|
334
|
+
apiKeyEnv: null,
|
|
335
|
+
apiKeyPresent: false,
|
|
336
|
+
classification: 'config_missing',
|
|
337
|
+
reason: 'No provider configured (workflows.yaml funnel policy missing and no CLI override)',
|
|
338
|
+
nextAction: 'Configure provider/model/apiKeyEnv in workflows.yaml pd-runtime-v2-diagnosis policy, or pass --provider/--model/--apiKeyEnv flags',
|
|
339
|
+
source: providerCfg.source,
|
|
340
|
+
});
|
|
341
|
+
warnings.push('No provider configured for the diagnostic funnel');
|
|
342
|
+
nextActions.push('Configure provider/model/apiKeyEnv in workflows.yaml or pass CLI flags');
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
const apiKeyEnvName = providerCfg.apiKeyEnv;
|
|
346
|
+
const apiKeyPresent = !!apiKeyEnvName && Object.prototype.hasOwnProperty.call(process.env, apiKeyEnvName) && !!process.env[apiKeyEnvName];
|
|
347
|
+
let classification;
|
|
348
|
+
let reason;
|
|
349
|
+
let nextAction;
|
|
350
|
+
if (!providerCfg.provider || !providerCfg.model) {
|
|
351
|
+
classification = 'config_missing';
|
|
352
|
+
reason = !providerCfg.provider
|
|
353
|
+
? 'Provider not configured'
|
|
354
|
+
: 'Model not configured';
|
|
355
|
+
nextAction = 'Set provider and model in workflows.yaml funnel policy or pass --provider/--model flags';
|
|
356
|
+
}
|
|
357
|
+
else if (!apiKeyEnvName) {
|
|
358
|
+
classification = 'auth_missing';
|
|
359
|
+
reason = 'apiKeyEnv is not set in workflows.yaml';
|
|
360
|
+
nextAction = "Add 'apiKeyEnv: <ENV_VAR_NAME>' to workflows.yaml funnel policy and ensure the env var holds a valid key";
|
|
361
|
+
}
|
|
362
|
+
else if (!apiKeyPresent) {
|
|
363
|
+
classification = 'auth_missing';
|
|
364
|
+
reason = `Environment variable '${apiKeyEnvName}' is not set or empty`;
|
|
365
|
+
nextAction = `Set the environment variable '${apiKeyEnvName}' with a valid API key, then retry`;
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
// Config is well-formed and the key is present — check state.db for rate-limit / unavailable signals.
|
|
369
|
+
const signalResult = await inspectStateDbForProviderSignal(stateDbPath);
|
|
370
|
+
if (signalResult.warning) {
|
|
371
|
+
warnings.push(signalResult.warning);
|
|
372
|
+
}
|
|
373
|
+
if (signalResult.signal) {
|
|
374
|
+
const { classification: cls, reason: rsn } = signalResult.signal;
|
|
375
|
+
classification = cls;
|
|
376
|
+
reason = rsn;
|
|
377
|
+
switch (classification) {
|
|
378
|
+
case 'rate_limit':
|
|
379
|
+
nextAction = `Wait for the provider's rate limit to reset, or reduce request rate. Recent error in state.db.`;
|
|
380
|
+
break;
|
|
381
|
+
case 'auth_missing':
|
|
382
|
+
nextAction = `The env var is set, but the provider rejected the call. Verify the key value is current and has access to model '${providerCfg.model}'.`;
|
|
383
|
+
break;
|
|
384
|
+
case 'unavailable':
|
|
385
|
+
nextAction = `Provider/model temporarily unavailable. Try a different model or retry later. Check provider status page.`;
|
|
386
|
+
break;
|
|
387
|
+
default:
|
|
388
|
+
nextAction = 'Inspect recent task errors in state.db for details.';
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
classification = 'healthy';
|
|
393
|
+
reason = 'Provider, model, and apiKeyEnv are configured; env var is set; no recent error signals';
|
|
394
|
+
nextAction = 'Run pd diagnose run to validate end-to-end provider connectivity';
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
providerHealth.push({
|
|
398
|
+
provider: providerCfg.provider,
|
|
399
|
+
model: providerCfg.model,
|
|
400
|
+
apiKeyEnv: apiKeyEnvName,
|
|
401
|
+
apiKeyPresent,
|
|
402
|
+
classification,
|
|
403
|
+
reason,
|
|
404
|
+
nextAction,
|
|
405
|
+
source: providerCfg.source,
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
if (providerCfg.parseWarning) {
|
|
409
|
+
warnings.push(providerCfg.parseWarning);
|
|
410
|
+
if (!providerCfg.workflowsFound) {
|
|
411
|
+
nextActions.push('Create workflows.yaml in <workspace>/.state with a pd-runtime-v2-diagnosis funnel policy');
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
nextActions.push('Fix workflows.yaml parse error — see warnings for details');
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
// 4) Aggregate feature-flag warnings
|
|
418
|
+
for (const w of flagWarnings) {
|
|
419
|
+
warnings.push(w);
|
|
420
|
+
}
|
|
421
|
+
if (flagWarnings.length > 0 && !hasFeatureFlagsError) {
|
|
422
|
+
nextActions.push('Review .pd/feature-flags.yaml — see warnings for details');
|
|
423
|
+
}
|
|
424
|
+
if (hasFeatureFlagsError) {
|
|
425
|
+
warnings.push(`feature flags unavailable: ${featureFlagsErrorMessage}`);
|
|
426
|
+
nextActions.push(`Check that ${featureFlagsPath} is a readable file, not a directory.`);
|
|
427
|
+
nextActions.push('Re-run npx create-principles-disciple if the config was generated incorrectly.');
|
|
428
|
+
}
|
|
429
|
+
// 4.5) CorrectionObserver Diagnostics
|
|
430
|
+
let coStatus;
|
|
431
|
+
let coConfigSource;
|
|
432
|
+
let coProvider = null;
|
|
433
|
+
let coModel = null;
|
|
434
|
+
let coApiKeyEnv = null;
|
|
435
|
+
let coApiKeyPresent = false;
|
|
436
|
+
let coReason;
|
|
437
|
+
let coNextAction;
|
|
438
|
+
if (!correctionObserverEnabled) {
|
|
439
|
+
coStatus = 'disabled';
|
|
440
|
+
coConfigSource = 'missing';
|
|
441
|
+
coProvider = null;
|
|
442
|
+
coModel = null;
|
|
443
|
+
coApiKeyEnv = null;
|
|
444
|
+
coApiKeyPresent = false;
|
|
445
|
+
coReason = 'CorrectionObserver is disabled via feature flags';
|
|
446
|
+
coNextAction = 'Set correction_observer.enabled=true in .pd/feature-flags.yaml to enable it';
|
|
447
|
+
}
|
|
448
|
+
else {
|
|
449
|
+
const coWorkflowsPath = path.join(workspaceDir, '.state', 'workflows.yaml');
|
|
450
|
+
let coWorkflowsFound = false;
|
|
451
|
+
let coWorkflowsParseError = false;
|
|
452
|
+
let coWorkflowsParseErrorMessage = '';
|
|
453
|
+
let coWorkflowPolicy = null;
|
|
454
|
+
if (fs.existsSync(coWorkflowsPath)) {
|
|
455
|
+
coWorkflowsFound = true;
|
|
456
|
+
try {
|
|
457
|
+
const raw = fs.readFileSync(coWorkflowsPath, 'utf8');
|
|
458
|
+
const parsed = yaml.load(raw);
|
|
459
|
+
if (isRecord(parsed)) {
|
|
460
|
+
const funnelsRaw = parsed.funnels;
|
|
461
|
+
if (Array.isArray(funnelsRaw)) {
|
|
462
|
+
for (const f of funnelsRaw) {
|
|
463
|
+
if (isRecord(f) && f.workflowId === 'pd-correction-observer' && isRecord(f.policy)) {
|
|
464
|
+
coWorkflowPolicy = f.policy;
|
|
465
|
+
break;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
catch (err) {
|
|
472
|
+
coWorkflowsParseError = true;
|
|
473
|
+
coWorkflowsParseErrorMessage = err instanceof Error ? err.message : String(err);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
if (coWorkflowsParseError) {
|
|
477
|
+
coStatus = 'unavailable';
|
|
478
|
+
coConfigSource = 'unavailable';
|
|
479
|
+
coReason = `workflows.yaml parse failure: ${coWorkflowsParseErrorMessage}`;
|
|
480
|
+
coNextAction = 'Fix workflows.yaml syntax or file access permissions';
|
|
481
|
+
}
|
|
482
|
+
else if (coWorkflowsFound && coWorkflowPolicy && coWorkflowPolicy.runtimeKind === 'pi-ai') {
|
|
483
|
+
coConfigSource = 'workflows.yaml';
|
|
484
|
+
coProvider = typeof coWorkflowPolicy.provider === 'string' ? coWorkflowPolicy.provider : null;
|
|
485
|
+
coModel = typeof coWorkflowPolicy.model === 'string' ? coWorkflowPolicy.model : null;
|
|
486
|
+
coApiKeyEnv = typeof coWorkflowPolicy.apiKeyEnv === 'string' ? coWorkflowPolicy.apiKeyEnv : null;
|
|
487
|
+
coApiKeyPresent = !!coApiKeyEnv && Object.prototype.hasOwnProperty.call(process.env, coApiKeyEnv) && !!process.env[coApiKeyEnv];
|
|
488
|
+
if (!coProvider || !coModel) {
|
|
489
|
+
coStatus = 'config_missing';
|
|
490
|
+
coReason = !coProvider ? 'Provider not configured in workflows.yaml policy' : 'Model not configured in workflows.yaml policy';
|
|
491
|
+
coNextAction = 'Set provider and model in pd-correction-observer policy in workflows.yaml';
|
|
492
|
+
}
|
|
493
|
+
else if (!coApiKeyEnv) {
|
|
494
|
+
coStatus = 'auth_missing';
|
|
495
|
+
coReason = 'apiKeyEnv is not set in workflows.yaml pd-correction-observer policy';
|
|
496
|
+
coNextAction = "Add 'apiKeyEnv: <ENV_VAR_NAME>' to workflows.yaml pd-correction-observer policy and ensure the env var holds a valid key";
|
|
497
|
+
}
|
|
498
|
+
else if (!coApiKeyPresent) {
|
|
499
|
+
coStatus = 'auth_missing';
|
|
500
|
+
coReason = `Environment variable '${coApiKeyEnv}' is not set or empty`;
|
|
501
|
+
coNextAction = `Set the environment variable '${coApiKeyEnv}' with a valid API key, or disable correction_observer in feature flags`;
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
coStatus = 'configured';
|
|
505
|
+
coReason = 'CorrectionObserver is configured and ready via workflows.yaml';
|
|
506
|
+
coNextAction = 'No action required; correction observer is active';
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
coConfigSource = 'env';
|
|
511
|
+
coProvider = process.env.PD_CORRECTION_PROVIDER || 'anthropic';
|
|
512
|
+
coModel = process.env.PD_CORRECTION_MODEL || 'anthropic/claude-3-5-sonnet';
|
|
513
|
+
coApiKeyEnv = process.env.PD_CORRECTION_API_KEY_ENV || 'ANTHROPIC_API_KEY';
|
|
514
|
+
coApiKeyPresent = !!coApiKeyEnv && Object.prototype.hasOwnProperty.call(process.env, coApiKeyEnv) && !!process.env[coApiKeyEnv];
|
|
515
|
+
if (!coApiKeyPresent) {
|
|
516
|
+
coStatus = 'auth_missing';
|
|
517
|
+
coReason = `Environment variable '${coApiKeyEnv}' is not set or empty`;
|
|
518
|
+
coNextAction = `Set the environment variable '${coApiKeyEnv}' with a valid API key, or configure workflows.yaml, or disable correction_observer in feature flags`;
|
|
519
|
+
}
|
|
520
|
+
else {
|
|
521
|
+
coStatus = 'configured';
|
|
522
|
+
coReason = 'CorrectionObserver is configured and ready via env overrides/defaults';
|
|
523
|
+
coNextAction = 'No action required; correction observer is active';
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
// 5) Compute overall status
|
|
528
|
+
let status = 'ok';
|
|
529
|
+
const classifications = providerHealth.map((p) => p.classification);
|
|
530
|
+
if (classifications.includes('rate_limit') || classifications.includes('unavailable')) {
|
|
531
|
+
status = 'degraded';
|
|
532
|
+
}
|
|
533
|
+
if (classifications.includes('auth_missing') || classifications.includes('config_missing')) {
|
|
534
|
+
status = 'failed';
|
|
535
|
+
}
|
|
536
|
+
if ((warnings.length > 0 || hasFeatureFlagsError) && status === 'ok') {
|
|
537
|
+
status = 'degraded';
|
|
538
|
+
}
|
|
539
|
+
// 6) Reason
|
|
540
|
+
let reason;
|
|
541
|
+
if (status === 'failed') {
|
|
542
|
+
const failed = providerHealth.filter((p) => p.classification === 'auth_missing' || p.classification === 'config_missing');
|
|
543
|
+
if (failed.length > 0) {
|
|
544
|
+
reason = `Provider auth/config missing: ${failed.map((p) => p.classification).join(', ')}`;
|
|
545
|
+
}
|
|
546
|
+
else {
|
|
547
|
+
reason = 'Configuration is missing required fields';
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
else if (status === 'degraded') {
|
|
551
|
+
const degraded = providerHealth.filter((p) => p.classification === 'rate_limit' || p.classification === 'unavailable');
|
|
552
|
+
if (degraded.length > 0) {
|
|
553
|
+
reason = `Provider connectivity degraded: ${degraded.map((p) => p.classification).join(', ')}`;
|
|
554
|
+
}
|
|
555
|
+
else if (warnings.length > 0) {
|
|
556
|
+
reason = `Config warnings present: ${warnings.length} item(s)`;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
// 7) Build path entries
|
|
560
|
+
const out = {
|
|
561
|
+
status,
|
|
562
|
+
workspaceDir,
|
|
563
|
+
pdConfigPaths: {
|
|
564
|
+
workspaceDir: pathEntry(workspaceDir),
|
|
565
|
+
pdDir: pathEntry(pdDir),
|
|
566
|
+
featureFlags: pathEntry(featureFlagsPath),
|
|
567
|
+
workflowsYaml: pathEntry(workflowsPath),
|
|
568
|
+
stateDb: pathEntry(stateDbPath),
|
|
569
|
+
},
|
|
570
|
+
openclawConfigPaths: {
|
|
571
|
+
openclawHome: pathEntry(getOpenClawHome()),
|
|
572
|
+
openclawConfig: pathEntry(getOpenClawConfigPath()),
|
|
573
|
+
},
|
|
574
|
+
featureFlags: {
|
|
575
|
+
source: flagSource,
|
|
576
|
+
configPath: featureFlagsPath,
|
|
577
|
+
enabledMvpChannels,
|
|
578
|
+
disabledFlags,
|
|
579
|
+
warnings: flagWarnings,
|
|
580
|
+
},
|
|
581
|
+
providerHealth,
|
|
582
|
+
internalAgents: {
|
|
583
|
+
correctionObserver: {
|
|
584
|
+
enabled: correctionObserverEnabled,
|
|
585
|
+
flagSource: coFlagSource,
|
|
586
|
+
status: coStatus,
|
|
587
|
+
configSource: coConfigSource,
|
|
588
|
+
provider: coProvider,
|
|
589
|
+
model: coModel,
|
|
590
|
+
apiKeyEnv: coApiKeyEnv,
|
|
591
|
+
apiKeyPresent: coApiKeyPresent,
|
|
592
|
+
reason: coReason,
|
|
593
|
+
nextAction: coNextAction,
|
|
594
|
+
},
|
|
595
|
+
},
|
|
596
|
+
warnings,
|
|
597
|
+
nextActions: nextActions.length > 0 ? nextActions : ['All checks passed — provider is configured and reachable'],
|
|
598
|
+
};
|
|
599
|
+
if (reason)
|
|
600
|
+
out.reason = reason;
|
|
601
|
+
return out;
|
|
602
|
+
}
|
|
603
|
+
//# sourceMappingURL=config-doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-doctor.js","sourceRoot":"","sources":["../../src/services/config-doctor.ts"],"names":[],"mappings":"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"}
|