@principles/pd-cli 1.101.0 → 1.103.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/commands/diagnose.js +27 -27
  2. package/dist/commands/diagnose.js.map +1 -1
  3. package/dist/commands/pain-retry.d.ts.map +1 -1
  4. package/dist/commands/pain-retry.js +22 -27
  5. package/dist/commands/pain-retry.js.map +1 -1
  6. package/dist/commands/runtime-internalization-integrity.d.ts.map +1 -1
  7. package/dist/commands/runtime-internalization-integrity.js +40 -1
  8. package/dist/commands/runtime-internalization-integrity.js.map +1 -1
  9. package/dist/commands/runtime-internalization-run-once.d.ts.map +1 -1
  10. package/dist/commands/runtime-internalization-run-once.js +11 -9
  11. package/dist/commands/runtime-internalization-run-once.js.map +1 -1
  12. package/dist/commands/runtime.d.ts +1 -1
  13. package/dist/commands/runtime.d.ts.map +1 -1
  14. package/dist/commands/runtime.js +92 -25
  15. package/dist/commands/runtime.js.map +1 -1
  16. package/dist/services/mainline-snapshot-assembler.d.ts +35 -0
  17. package/dist/services/mainline-snapshot-assembler.d.ts.map +1 -0
  18. package/dist/services/mainline-snapshot-assembler.js +399 -0
  19. package/dist/services/mainline-snapshot-assembler.js.map +1 -0
  20. package/dist/services/resolve-runtime-from-pd-config.d.ts +59 -0
  21. package/dist/services/resolve-runtime-from-pd-config.d.ts.map +1 -0
  22. package/dist/services/resolve-runtime-from-pd-config.js +96 -0
  23. package/dist/services/resolve-runtime-from-pd-config.js.map +1 -0
  24. package/package.json +1 -1
  25. package/src/commands/diagnose.ts +26 -26
  26. package/src/commands/pain-retry.ts +21 -25
  27. package/src/commands/runtime-internalization-integrity.ts +40 -1
  28. package/src/commands/runtime-internalization-run-once.ts +10 -9
  29. package/src/commands/runtime.ts +96 -24
  30. package/src/services/mainline-snapshot-assembler.ts +544 -0
  31. package/src/services/resolve-runtime-from-pd-config.ts +142 -0
  32. package/tests/commands/console-launcher-edge-cases.test.ts +14 -47
  33. package/tests/commands/diagnose.test.ts +91 -39
  34. package/tests/commands/pain-retry.test.ts +130 -15
  35. package/tests/commands/pri-393-runtime-config-unification.test.ts +284 -0
  36. package/tests/commands/runtime-internalization-integrity.test.ts +37 -0
  37. package/tests/commands/runtime-internalization-run-once.test.ts +59 -53
  38. package/tests/commands/runtime.test.ts +124 -1
  39. package/tests/services/mainline-snapshot-assembler.test.ts +425 -0
@@ -0,0 +1,399 @@
1
+ /**
2
+ * Shared MainlineSnapshot assembler (PRI-394)
3
+ *
4
+ * I/O-boundary reader that assembles a read-only `MainlineSnapshot` from real
5
+ * Runtime V2 SQLite state, then hands it to core's pure `assertMainlineContract`.
6
+ *
7
+ * Rules:
8
+ * - This module lives in pd-cli (I/O boundary). It reads `.pd/state.db` via
9
+ * the existing `RuntimeStateManager` / `SqliteConnection` abstractions.
10
+ * - It does NOT judge the contract. Judgment lives exclusively in
11
+ * `packages/principles-core/src/runtime-v2/mainline-contract.ts`.
12
+ * - All DB JSON / `diagnosticJson` / artifact metadata is treated as `unknown`
13
+ * and validated at runtime before use (EP-01).
14
+ * - It never throws on malformed input; it returns a snapshot that the pure
15
+ * contract will judge as a violation with a concrete `nextAction`.
16
+ */
17
+ import { RuntimeStateManager, assertMainlineContract, EMPTY_CONTEXT_SENTINEL, hydratePITaskRecord, } from '@principles/core/runtime-v2';
18
+ import { loadPdConfig } from './pd-config-loader.js';
19
+ // ── Safe JSON helpers ────────────────────────────────────────────────────────
20
+ function safeJsonParse(raw) {
21
+ if (raw === null || raw === undefined || raw.trim() === '') {
22
+ return { ok: false, reason: 'diagnosticJson is empty' };
23
+ }
24
+ try {
25
+ return { ok: true, value: JSON.parse(raw) };
26
+ }
27
+ catch (err) {
28
+ const detail = err instanceof Error ? err.message : String(err);
29
+ return { ok: false, reason: `diagnosticJson is not valid JSON: ${detail}` };
30
+ }
31
+ }
32
+ function isNonEmptyString(value) {
33
+ return typeof value === 'string' && value.trim() !== '';
34
+ }
35
+ function isObject(value) {
36
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
37
+ }
38
+ function readOwnString(obj, key) {
39
+ if (!Object.hasOwn(obj, key))
40
+ return undefined;
41
+ const value = obj[key];
42
+ return isNonEmptyString(value) ? value : undefined;
43
+ }
44
+ function validateDiagnosticianArtifactRow(value) {
45
+ if (!isObject(value))
46
+ return null;
47
+ const artifactId = readOwnString(value, 'artifact_id');
48
+ const runId = readOwnString(value, 'run_id');
49
+ const taskId = readOwnString(value, 'task_id');
50
+ const artifactKind = readOwnString(value, 'artifact_kind');
51
+ const contentJson = readOwnString(value, 'content_json');
52
+ if (!artifactId || !contentJson)
53
+ return null;
54
+ return { artifactId, runId: runId ?? '', taskId: taskId ?? '', artifactKind: artifactKind ?? '', contentJson };
55
+ }
56
+ function validateConsumedCandidateRow(value) {
57
+ if (!isObject(value))
58
+ return null;
59
+ const candidateId = readOwnString(value, 'candidate_id');
60
+ if (!candidateId)
61
+ return null;
62
+ return { candidateId };
63
+ }
64
+ // ── Context hash helper ──────────────────────────────────────────────────────
65
+ function hashContextRefs(contextRefs) {
66
+ const str = contextRefs.join('\u0000');
67
+ let hash = 0;
68
+ for (let i = 0; i < str.length; i++) {
69
+ const char = str.charCodeAt(i);
70
+ hash = ((hash << 5) - hash + char) | 0;
71
+ }
72
+ return `ctx-${Math.abs(hash).toString(16)}`;
73
+ }
74
+ // ── Readiness fallback ───────────────────────────────────────────────────────
75
+ function buildDefaultReadiness(workspaceDir, warnings) {
76
+ const configLoadResult = loadPdConfig(workspaceDir);
77
+ const effective = configLoadResult.ok ? configLoadResult.effective : configLoadResult.defaults;
78
+ const defaultProfile = effective.config?.internalAgents?.defaultRuntime ?? 'openclaw.default';
79
+ if (!configLoadResult.ok) {
80
+ for (const err of configLoadResult.errors) {
81
+ warnings.push(`${err.path}: ${err.reason}`);
82
+ }
83
+ }
84
+ if (configLoadResult.warnings.length > 0) {
85
+ warnings.push(...configLoadResult.warnings);
86
+ }
87
+ return {
88
+ configDoctorProfile: defaultProfile,
89
+ runtimeProbeProfile: null,
90
+ configSource: '.pd/config.yaml',
91
+ probeConfigSource: '.pd/config.yaml',
92
+ diagnosticianReady: false,
93
+ diagnosticianReadinessReason: 'No readiness snapshot provided; run "pd runtime probe" first.',
94
+ };
95
+ }
96
+ // ── Diagnosis task lookup ────────────────────────────────────────────────────
97
+ async function findDiagnosisTask(stateManager, requestedPainId, warnings) {
98
+ const allTasks = await stateManager.listTasks();
99
+ const diagTasks = allTasks.filter((t) => t.taskKind === 'diagnostician');
100
+ if (requestedPainId) {
101
+ const sortedByDate = [...diagTasks].sort((a, b) => (b.createdAt ?? '').localeCompare(a.createdAt ?? ''));
102
+ for (const task of sortedByDate) {
103
+ const parsed = safeJsonParse(task.diagnosticJson);
104
+ if (!parsed.ok)
105
+ continue;
106
+ const sourcePainId = isObject(parsed.value) ? readOwnString(parsed.value, 'sourcePainId') : undefined;
107
+ if (sourcePainId === requestedPainId) {
108
+ return { painId: requestedPainId, diagnosisTask: task };
109
+ }
110
+ }
111
+ return { painId: requestedPainId, diagnosisTask: null };
112
+ }
113
+ // No painId provided — pick the latest diagnostician task by createdAt.
114
+ const sorted = diagTasks.sort((a, b) => (b.createdAt ?? '').localeCompare(a.createdAt ?? ''));
115
+ for (const task of sorted) {
116
+ const parsed = safeJsonParse(task.diagnosticJson);
117
+ if (!parsed.ok) {
118
+ warnings.push(`Task ${task.taskId} has malformed diagnosticJson: ${parsed.reason}`);
119
+ continue;
120
+ }
121
+ const sourcePainId = isObject(parsed.value) ? readOwnString(parsed.value, 'sourcePainId') : undefined;
122
+ if (sourcePainId) {
123
+ return { painId: sourcePainId, diagnosisTask: task };
124
+ }
125
+ }
126
+ return { painId: null, diagnosisTask: sorted[0] ?? null };
127
+ }
128
+ async function buildDiagnosisTaskSnapshot(stateManager, task) {
129
+ const runs = await stateManager.getRunsByTask(task.taskId);
130
+ const hasSucceededRun = runs.some((r) => r.executionStatus === 'succeeded');
131
+ return {
132
+ taskId: task.taskId,
133
+ status: task.status,
134
+ hasSucceededRun,
135
+ };
136
+ }
137
+ async function findDiagnosticianArtifact(input) {
138
+ const { stateManager, diagnosisTaskId, painId, warnings } = input;
139
+ const db = stateManager.connection.getDb();
140
+ const rows = db
141
+ .prepare(`SELECT artifact_id, run_id, task_id, artifact_kind, content_json
142
+ FROM artifacts
143
+ WHERE task_id = ? AND artifact_kind = 'diagnostician_output'
144
+ ORDER BY created_at DESC
145
+ LIMIT 1`)
146
+ .all(diagnosisTaskId);
147
+ const [raw] = rows;
148
+ if (!raw)
149
+ return null;
150
+ const row = validateDiagnosticianArtifactRow(raw);
151
+ if (!row) {
152
+ warnings.push(`Malformed diagnostician artifact row for task ${diagnosisTaskId}: missing artifact_id or content_json`);
153
+ return null;
154
+ }
155
+ let sourcePainId = painId;
156
+ const parsed = safeJsonParse(row.contentJson);
157
+ if (parsed.ok && isObject(parsed.value)) {
158
+ const artifactPainId = readOwnString(parsed.value, 'painId');
159
+ if (artifactPainId) {
160
+ sourcePainId = artifactPainId;
161
+ }
162
+ }
163
+ else if (parsed.ok === false) {
164
+ warnings.push(`Artifact ${row.artifactId} content_json parse failed: ${parsed.reason}`);
165
+ }
166
+ return {
167
+ artifactId: row.artifactId,
168
+ sourcePainId,
169
+ };
170
+ }
171
+ async function findCandidate(stateManager, artifactId, warnings) {
172
+ const artifactWithCandidates = await stateManager.getArtifactWithCandidates(artifactId);
173
+ if (!artifactWithCandidates || artifactWithCandidates.candidates.length === 0)
174
+ return null;
175
+ const [candidate] = artifactWithCandidates.candidates;
176
+ if (!candidate)
177
+ return null;
178
+ const { status } = candidate;
179
+ if (status !== 'pending' && status !== 'consumed' && status !== 'expired') {
180
+ warnings.push(`Candidate ${candidate.candidateId} has unexpected status "${status}"`);
181
+ }
182
+ return {
183
+ candidateId: candidate.candidateId,
184
+ status,
185
+ sourceTaskId: candidate.taskId,
186
+ sourceArtifactId: candidate.artifactId,
187
+ sourceRunId: candidate.sourceRunId,
188
+ };
189
+ }
190
+ function buildDreamerTaskSnapshot(task, warnings) {
191
+ const piTask = hydratePITaskRecord(task);
192
+ if (!piTask) {
193
+ warnings.push(`Dreamer task ${task.taskId} has invalid PI metadata`);
194
+ return null;
195
+ }
196
+ const inputArtifactRefs = [];
197
+ for (const ref of piTask.inputArtifactRefs ?? []) {
198
+ if (isObject(ref) && isNonEmptyString(ref.artifactType) && isNonEmptyString(ref.ref)) {
199
+ inputArtifactRefs.push({
200
+ artifactType: ref.artifactType,
201
+ ref: ref.ref,
202
+ });
203
+ }
204
+ }
205
+ return {
206
+ taskId: task.taskId,
207
+ dependencyTaskIds: piTask.dependencyTaskIds,
208
+ inputArtifactRefs,
209
+ };
210
+ }
211
+ async function findDreamerTask(stateManager, candidate, warnings) {
212
+ // Predictable taskId from intake-to-internalization bridge.
213
+ const predictableIds = [
214
+ `dreamer-${candidate.candidateId}-prompt`,
215
+ `dreamer-${candidate.candidateId}-code_tool_hook`,
216
+ `dreamer-${candidate.candidateId}-defer_archive`,
217
+ ];
218
+ for (const taskId of predictableIds) {
219
+ const task = await stateManager.getTask(taskId);
220
+ if (task && task.taskKind === 'dreamer') {
221
+ return buildDreamerTaskSnapshot(task, warnings);
222
+ }
223
+ }
224
+ // Fallback: scan dreamer tasks whose diagnostic_json references this candidate.
225
+ const allTasks = await stateManager.listTasks();
226
+ for (const task of allTasks) {
227
+ if (task.taskKind !== 'dreamer')
228
+ continue;
229
+ const parsed = safeJsonParse(task.diagnosticJson);
230
+ if (!parsed.ok)
231
+ continue;
232
+ const candidateId = isObject(parsed.value) ? readOwnString(parsed.value, 'candidateId') : undefined;
233
+ if (candidateId === candidate.candidateId) {
234
+ return buildDreamerTaskSnapshot(task, warnings);
235
+ }
236
+ }
237
+ return null;
238
+ }
239
+ async function buildDreamerContextSnapshot(stateManager, dreamerTask, warnings) {
240
+ const contextRefs = [];
241
+ for (const depId of dreamerTask.dependencyTaskIds) {
242
+ const dep = await stateManager.getTask(depId);
243
+ if (!dep) {
244
+ warnings.push(`Dreamer task ${dreamerTask.taskId} dependency ${depId} not found`);
245
+ continue;
246
+ }
247
+ if (dep.resultRef)
248
+ contextRefs.push(dep.resultRef);
249
+ const depPi = hydratePITaskRecord(dep);
250
+ if (depPi?.outputArtifactRefs) {
251
+ for (const ref of depPi.outputArtifactRefs) {
252
+ if (ref && isNonEmptyString(ref.ref)) {
253
+ contextRefs.push(ref.ref);
254
+ }
255
+ }
256
+ }
257
+ }
258
+ const contextHash = contextRefs.length === 0 ? EMPTY_CONTEXT_SENTINEL : hashContextRefs(contextRefs);
259
+ return { contextHash, contextRefs };
260
+ }
261
+ async function findSuccessor(stateManager, dreamerTaskId) {
262
+ const allTasks = await stateManager.listTasks();
263
+ for (const task of allTasks) {
264
+ if (task.taskKind !== 'philosopher')
265
+ continue;
266
+ const piTask = hydratePITaskRecord(task);
267
+ if (!piTask)
268
+ continue;
269
+ const { parentTaskId, dependencyTaskIds: deps = [] } = piTask;
270
+ if (parentTaskId === dreamerTaskId || deps.includes(dreamerTaskId)) {
271
+ return {
272
+ taskId: task.taskId,
273
+ taskKind: task.taskKind,
274
+ exists: true,
275
+ };
276
+ }
277
+ }
278
+ return null;
279
+ }
280
+ async function findReviewablePrinciple(stateManager, philosopherTaskId) {
281
+ const artifacts = await stateManager.piArtifactStore.listBySourceTaskId(philosopherTaskId);
282
+ const principleArtifact = artifacts.find((a) => a.artifactKind === 'principle');
283
+ if (!principleArtifact)
284
+ return null;
285
+ let principleId;
286
+ const parsed = safeJsonParse(principleArtifact.contentJson);
287
+ if (parsed.ok && isObject(parsed.value)) {
288
+ const { principleCandidate: candidate } = parsed.value;
289
+ if (isObject(candidate)) {
290
+ const id = readOwnString(candidate, 'principleId');
291
+ if (id)
292
+ principleId = id;
293
+ }
294
+ }
295
+ return {
296
+ exists: true,
297
+ principleId,
298
+ reviewable: principleArtifact.validationStatus !== 'rejected',
299
+ };
300
+ }
301
+ async function assembleChain(input) {
302
+ const { stateManager, painId, diagnosisTask, warnings } = input;
303
+ const diagnosisTaskSnapshot = diagnosisTask
304
+ ? await buildDiagnosisTaskSnapshot(stateManager, diagnosisTask)
305
+ : null;
306
+ const diagnosticianArtifact = diagnosisTask
307
+ ? await findDiagnosticianArtifact({
308
+ stateManager,
309
+ diagnosisTaskId: diagnosisTask.taskId,
310
+ painId,
311
+ warnings,
312
+ })
313
+ : null;
314
+ const candidate = diagnosticianArtifact
315
+ ? await findCandidate(stateManager, diagnosticianArtifact.artifactId, warnings)
316
+ : null;
317
+ const dreamerTask = candidate
318
+ ? await findDreamerTask(stateManager, candidate, warnings)
319
+ : null;
320
+ const dreamerContext = dreamerTask
321
+ ? await buildDreamerContextSnapshot(stateManager, dreamerTask, warnings)
322
+ : null;
323
+ const successor = dreamerTask
324
+ ? await findSuccessor(stateManager, dreamerTask.taskId)
325
+ : null;
326
+ const principle = successor
327
+ ? await findReviewablePrinciple(stateManager, successor.taskId)
328
+ : null;
329
+ return {
330
+ painId,
331
+ diagnosisTask: diagnosisTaskSnapshot,
332
+ diagnosticianArtifact,
333
+ candidate,
334
+ dreamerTask,
335
+ dreamerContext,
336
+ successor,
337
+ principle,
338
+ };
339
+ }
340
+ // ── Workspace-level auto-consumption hole ────────────────────────────────────
341
+ async function findConsumedCandidatesMissingDreamer(stateManager, warnings) {
342
+ const db = stateManager.connection.getDb();
343
+ const rows = db
344
+ .prepare(`SELECT candidate_id FROM principle_candidates WHERE status = 'consumed'`)
345
+ .all();
346
+ const allTasks = await stateManager.listTasks();
347
+ const dreamerTasks = allTasks.filter((t) => t.taskKind === 'dreamer');
348
+ const dreamerTaskIds = new Set(dreamerTasks.map((t) => t.taskId));
349
+ const orphans = [];
350
+ for (const raw of rows) {
351
+ const row = validateConsumedCandidateRow(raw);
352
+ if (!row) {
353
+ warnings.push('Malformed consumed candidate row: missing candidate_id');
354
+ continue;
355
+ }
356
+ const { candidateId } = row;
357
+ const predictableIds = [
358
+ `dreamer-${candidateId}-prompt`,
359
+ `dreamer-${candidateId}-code_tool_hook`,
360
+ `dreamer-${candidateId}-defer_archive`,
361
+ ];
362
+ const hasDreamerByTaskId = predictableIds.some((taskId) => dreamerTaskIds.has(taskId));
363
+ const hasDreamerByJson = !hasDreamerByTaskId && dreamerTasks.some((dt) => {
364
+ const parsed = safeJsonParse(dt.diagnosticJson);
365
+ if (!parsed.ok)
366
+ return false;
367
+ const id = isObject(parsed.value) ? readOwnString(parsed.value, 'candidateId') : undefined;
368
+ return id === candidateId;
369
+ });
370
+ if (!hasDreamerByTaskId && !hasDreamerByJson) {
371
+ orphans.push(candidateId);
372
+ }
373
+ }
374
+ return orphans;
375
+ }
376
+ // ── Assembler ────────────────────────────────────────────────────────────────
377
+ export async function assembleMainlineSnapshot(options) {
378
+ const stateManager = new RuntimeStateManager({ workspaceDir: options.workspaceDir, readonly: true });
379
+ const warnings = [];
380
+ try {
381
+ await stateManager.initialize();
382
+ const readiness = options.readiness ?? buildDefaultReadiness(options.workspaceDir, warnings);
383
+ const { painId, diagnosisTask } = await findDiagnosisTask(stateManager, options.painId, warnings);
384
+ const chain = await assembleChain({ stateManager, painId, diagnosisTask, warnings });
385
+ const consumedCandidatesMissingDreamer = await findConsumedCandidatesMissingDreamer(stateManager, warnings);
386
+ const snapshot = {
387
+ readiness,
388
+ chain,
389
+ consumedCandidatesMissingDreamer,
390
+ };
391
+ return { snapshot, warnings, resolvedPainId: painId };
392
+ }
393
+ finally {
394
+ await stateManager.close();
395
+ }
396
+ }
397
+ // Re-export the pure contract so callers can judge the assembled snapshot.
398
+ export { assertMainlineContract, EMPTY_CONTEXT_SENTINEL };
399
+ //# sourceMappingURL=mainline-snapshot-assembler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mainline-snapshot-assembler.js","sourceRoot":"","sources":["../../src/services/mainline-snapshot-assembler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Unified runtime config resolver from .pd/config.yaml — PRI-393
3
+ *
4
+ * All MVP mainline execution paths (probe, run-once, diagnose, pain-retry)
5
+ * MUST use this helper instead of the legacy resolveRuntimeConfig(stateDir)
6
+ * which reads .state/workflows.yaml.
7
+ *
8
+ * Canonical source: .pd/config.yaml via loadPdConfig → resolveRuntimeConfigFromPdConfig.
9
+ * .state/workflows.yaml is reported as a legacy warning only.
10
+ *
11
+ * ERR refs:
12
+ * - ERR-002: fail loud with reason + nextAction
13
+ * - EP-07: runtime state source alignment
14
+ */
15
+ import type { RuntimeConfigResult, RuntimeConfig } from '@principles/core/runtime-v2';
16
+ import type { PdConfigLoadResult } from './pd-config-loader.js';
17
+ export interface ResolvedRuntimeFromPdConfig {
18
+ /** The resolved runtime config (or error). */
19
+ result: RuntimeConfigResult;
20
+ /** Legacy files detected (.state/workflows.yaml etc.) — informational only. */
21
+ legacyWarnings: string[];
22
+ /** The PD config load result for downstream use (feature flags, etc.). */
23
+ configLoadResult: PdConfigLoadResult;
24
+ /** Canonical config source label, e.g. ".pd/config.yaml". */
25
+ configSource: string;
26
+ }
27
+ /**
28
+ * Resolve runtime configuration exclusively from .pd/config.yaml.
29
+ *
30
+ * This is the ONLY production entry point for runtime config resolution
31
+ * in pd-cli commands. Legacy resolveRuntimeConfig(stateDir) must NOT be
32
+ * called by probe/run-once/diagnose/pain-retry.
33
+ *
34
+ * @param workspaceDir - The resolved workspace directory.
35
+ * @param getEnvVar - Env var accessor, defaults to process.env.
36
+ * @returns Resolved runtime config with legacy warnings.
37
+ */
38
+ export declare function resolveRuntimeFromPdConfig(workspaceDir: string, getEnvVar?: (name: string) => string | undefined): ResolvedRuntimeFromPdConfig;
39
+ /**
40
+ * Resolve runtime config from .pd/config.yaml, then merge with CLI flag overrides.
41
+ *
42
+ * CLI flags take priority over config values (same semantics as before PRI-393,
43
+ * but reading from .pd/config.yaml instead of .state/workflows.yaml).
44
+ *
45
+ * @param workspaceDir - The resolved workspace directory.
46
+ * @param overrides - CLI flag overrides (provider, model, apiKeyEnv, etc.).
47
+ * @param getEnvVar - Env var accessor.
48
+ */
49
+ export declare function resolveRuntimeWithOverrides(workspaceDir: string, overrides: {
50
+ provider?: string;
51
+ model?: string;
52
+ apiKeyEnv?: string;
53
+ baseUrl?: string;
54
+ maxRetries?: number;
55
+ timeoutMs?: number;
56
+ }, getEnvVar?: (name: string) => string | undefined): ResolvedRuntimeFromPdConfig & {
57
+ mergedConfig: RuntimeConfig | null;
58
+ };
59
+ //# sourceMappingURL=resolve-runtime-from-pd-config.d.ts.map
@@ -0,0 +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;AAMH,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;CACtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EACpB,SAAS,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAuC,GAC5E,2BAA2B,CA6C7B;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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Unified runtime config resolver from .pd/config.yaml — PRI-393
3
+ *
4
+ * All MVP mainline execution paths (probe, run-once, diagnose, pain-retry)
5
+ * MUST use this helper instead of the legacy resolveRuntimeConfig(stateDir)
6
+ * which reads .state/workflows.yaml.
7
+ *
8
+ * Canonical source: .pd/config.yaml via loadPdConfig → resolveRuntimeConfigFromPdConfig.
9
+ * .state/workflows.yaml is reported as a legacy warning only.
10
+ *
11
+ * ERR refs:
12
+ * - ERR-002: fail loud with reason + nextAction
13
+ * - EP-07: runtime state source alignment
14
+ */
15
+ import { resolveRuntimeConfigFromPdConfig, isRuntimeConfigError, } from '@principles/core/runtime-v2';
16
+ import { loadPdConfig } from './pd-config-loader.js';
17
+ /**
18
+ * Resolve runtime configuration exclusively from .pd/config.yaml.
19
+ *
20
+ * This is the ONLY production entry point for runtime config resolution
21
+ * in pd-cli commands. Legacy resolveRuntimeConfig(stateDir) must NOT be
22
+ * called by probe/run-once/diagnose/pain-retry.
23
+ *
24
+ * @param workspaceDir - The resolved workspace directory.
25
+ * @param getEnvVar - Env var accessor, defaults to process.env.
26
+ * @returns Resolved runtime config with legacy warnings.
27
+ */
28
+ export function resolveRuntimeFromPdConfig(workspaceDir, getEnvVar = (name) => process.env[name]) {
29
+ const configLoadResult = loadPdConfig(workspaceDir);
30
+ // Malformed config → fail loud. Do NOT fall back to defaults for execution.
31
+ // Missing config is ok (loadPdConfig returns ok:true with defaults), but
32
+ // ok:false always means the file exists and is broken.
33
+ if (!configLoadResult.ok) {
34
+ const [firstError] = configLoadResult.errors;
35
+ const result = {
36
+ ok: false,
37
+ reason: `config_malformed:${firstError?.reason ?? 'unknown'}`,
38
+ message: firstError?.reason ?? '.pd/config.yaml is malformed',
39
+ nextAction: firstError?.nextAction ?? 'Fix .pd/config.yaml syntax and retry',
40
+ };
41
+ const legacyWarnings = configLoadResult.legacyFilesDetected.length > 0
42
+ ? [
43
+ `Legacy config files detected: ${configLoadResult.legacyFilesDetected.join(', ')}. ` +
44
+ `These are NOT used for runtime resolution. PD uses .pd/config.yaml exclusively.`,
45
+ ]
46
+ : [];
47
+ return {
48
+ result,
49
+ legacyWarnings,
50
+ configLoadResult,
51
+ configSource: '.pd/config.yaml',
52
+ };
53
+ }
54
+ const result = resolveRuntimeConfigFromPdConfig(configLoadResult.effective, getEnvVar);
55
+ const legacyWarnings = configLoadResult.legacyFilesDetected.length > 0
56
+ ? [
57
+ `Legacy config files detected: ${configLoadResult.legacyFilesDetected.join(', ')}. ` +
58
+ `These are NOT used for runtime resolution. PD uses .pd/config.yaml exclusively.`,
59
+ ]
60
+ : [];
61
+ return {
62
+ result,
63
+ legacyWarnings,
64
+ configLoadResult,
65
+ configSource: '.pd/config.yaml',
66
+ };
67
+ }
68
+ /**
69
+ * Resolve runtime config from .pd/config.yaml, then merge with CLI flag overrides.
70
+ *
71
+ * CLI flags take priority over config values (same semantics as before PRI-393,
72
+ * but reading from .pd/config.yaml instead of .state/workflows.yaml).
73
+ *
74
+ * @param workspaceDir - The resolved workspace directory.
75
+ * @param overrides - CLI flag overrides (provider, model, apiKeyEnv, etc.).
76
+ * @param getEnvVar - Env var accessor.
77
+ */
78
+ export function resolveRuntimeWithOverrides(workspaceDir, overrides, getEnvVar = (name) => process.env[name]) {
79
+ const base = resolveRuntimeFromPdConfig(workspaceDir, getEnvVar);
80
+ if (isRuntimeConfigError(base.result)) {
81
+ return { ...base, mergedConfig: null };
82
+ }
83
+ const config = base.result;
84
+ // CLI flags override config values
85
+ const merged = {
86
+ ...config,
87
+ provider: overrides.provider || config.provider,
88
+ model: overrides.model || config.model,
89
+ apiKeyEnv: overrides.apiKeyEnv || config.apiKeyEnv,
90
+ baseUrl: overrides.baseUrl || config.baseUrl,
91
+ maxRetries: overrides.maxRetries ?? config.maxRetries,
92
+ timeoutMs: overrides.timeoutMs ?? config.timeoutMs,
93
+ };
94
+ return { ...base, mergedConfig: merged };
95
+ }
96
+ //# sourceMappingURL=resolve-runtime-from-pd-config.js.map
@@ -0,0 +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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@principles/pd-cli",
3
- "version": "1.101.0",
3
+ "version": "1.103.0",
4
4
  "description": "PD CLI — Pain recording, sample management, and evolution tasks",
5
5
  "type": "module",
6
6
  "bin": {