@principles/pd-cli 1.115.0 → 1.117.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 (53) hide show
  1. package/dist/commands/candidate.d.ts +23 -0
  2. package/dist/commands/candidate.d.ts.map +1 -1
  3. package/dist/commands/candidate.js +89 -3
  4. package/dist/commands/candidate.js.map +1 -1
  5. package/dist/commands/diagnose.d.ts.map +1 -1
  6. package/dist/commands/diagnose.js +153 -132
  7. package/dist/commands/diagnose.js.map +1 -1
  8. package/dist/commands/runtime-features.d.ts.map +1 -1
  9. package/dist/commands/runtime-features.js +2 -7
  10. package/dist/commands/runtime-features.js.map +1 -1
  11. package/dist/commands/runtime-internalization-integrity-repair.d.ts.map +1 -1
  12. package/dist/commands/runtime-internalization-integrity-repair.js +15 -31
  13. package/dist/commands/runtime-internalization-integrity-repair.js.map +1 -1
  14. package/dist/commands/runtime-internalization-run-once.d.ts.map +1 -1
  15. package/dist/commands/runtime-internalization-run-once.js +246 -326
  16. package/dist/commands/runtime-internalization-run-once.js.map +1 -1
  17. package/dist/commands/runtime-recovery.d.ts.map +1 -1
  18. package/dist/commands/runtime-recovery.js +9 -8
  19. package/dist/commands/runtime-recovery.js.map +1 -1
  20. package/dist/services/__tests__/cli-output.test.d.ts +18 -0
  21. package/dist/services/__tests__/cli-output.test.d.ts.map +1 -0
  22. package/dist/services/__tests__/cli-output.test.js +103 -0
  23. package/dist/services/__tests__/cli-output.test.js.map +1 -0
  24. package/dist/services/__tests__/runtime-adapter-resolver.test.d.ts +18 -0
  25. package/dist/services/__tests__/runtime-adapter-resolver.test.d.ts.map +1 -0
  26. package/dist/services/__tests__/runtime-adapter-resolver.test.js +651 -0
  27. package/dist/services/__tests__/runtime-adapter-resolver.test.js.map +1 -0
  28. package/dist/services/cli-output.d.ts +61 -0
  29. package/dist/services/cli-output.d.ts.map +1 -0
  30. package/dist/services/cli-output.js +72 -0
  31. package/dist/services/cli-output.js.map +1 -0
  32. package/dist/services/runtime-adapter-resolver.d.ts +105 -0
  33. package/dist/services/runtime-adapter-resolver.d.ts.map +1 -0
  34. package/dist/services/runtime-adapter-resolver.js +188 -0
  35. package/dist/services/runtime-adapter-resolver.js.map +1 -0
  36. package/package.json +1 -1
  37. package/src/commands/candidate.ts +92 -3
  38. package/src/commands/diagnose.ts +146 -138
  39. package/src/commands/runtime-features.ts +2 -6
  40. package/src/commands/runtime-internalization-integrity-repair.ts +16 -28
  41. package/src/commands/runtime-internalization-run-once.ts +242 -353
  42. package/src/commands/runtime-recovery.ts +9 -7
  43. package/src/services/__tests__/cli-output.test.ts +130 -0
  44. package/src/services/__tests__/runtime-adapter-resolver.test.ts +772 -0
  45. package/src/services/cli-output.ts +95 -0
  46. package/src/services/runtime-adapter-resolver.ts +339 -0
  47. package/tests/commands/candidate-internalization-backfill.test.ts +43 -3
  48. package/tests/commands/candidate-internalize-lineage.test.ts +521 -0
  49. package/tests/commands/candidate-internalize.test.ts +31 -5
  50. package/tests/commands/diagnose.test.ts +7 -3
  51. package/tests/commands/runtime-internalization-run-once.test.ts +11 -0
  52. package/tests/commands/runtime-recovery.test.ts +27 -4
  53. package/tests/services/rulehost-pipeline-e2e.test.ts +40 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-adapter-resolver.test.js","sourceRoot":"","sources":["../../../src/services/__tests__/runtime-adapter-resolver.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * PRI-432: Shared CLI output module.
3
+ *
4
+ * Extracts common output patterns from 3 CLI commands:
5
+ * - runtime-features.ts (JSON/text emit)
6
+ * - runtime-recovery.ts (dry-run/confirm conflict + JSON/text emit)
7
+ * - runtime-internalization-integrity-repair.ts (conflict + error catch + JSON/text emit)
8
+ *
9
+ * Design decisions:
10
+ * - formatText stays call-site-specific (domain layout differs per command).
11
+ * This module handles only cross-cutting output concerns.
12
+ * - Functions return exit codes; callers handle process.exit()/process.exitCode.
13
+ * This follows CLI Operator Gate rule #2 (no process.exit in shared modules).
14
+ * - JSON error shape: { ok: false, reason: string, nextAction: string }
15
+ * (matches runtime-internalization-integrity-repair.ts canonical pattern)
16
+ *
17
+ * ERR refs:
18
+ * - ERR-001 (no any): all types explicit
19
+ * - ERR-005 (no as bypass): no type casts
20
+ * - ERR-009 (fail-loud): emitError/emitFlagConflict return exit code 1
21
+ * - ERR-002 (graceful degradation with reason): all error paths include reason + nextAction
22
+ * - ERR-014 (bounded preview): JSON.stringify on known shapes only
23
+ */
24
+ export interface EmitResultOptions<T> {
25
+ /** When true, emit JSON to stdout; when false, emit text via formatText. */
26
+ json: boolean;
27
+ /** Call-site-specific text formatter (domain layout differs per command). */
28
+ formatText: (output: T) => string;
29
+ }
30
+ export interface EmitErrorOptions {
31
+ /** When true, emit JSON error to stdout; when false, emit text to stderr. */
32
+ json: boolean;
33
+ /** Next action suggestion for the user. */
34
+ nextAction: string;
35
+ }
36
+ export interface EmitFlagConflictOptions {
37
+ /** When true, emit JSON error to stdout; when false, emit text to stderr. */
38
+ json: boolean;
39
+ }
40
+ /**
41
+ * Emit a result object as JSON (stdout) or text (stdout via formatText).
42
+ * Does NOT set exit code — caller decides based on result status.
43
+ */
44
+ export declare function emitResult<T extends object>(output: T, opts: EmitResultOptions<T>): void;
45
+ /**
46
+ * Emit a dry-run/confirm flag conflict error.
47
+ * Returns exit code 1. Caller should process.exit(1) or set process.exitCode = 1.
48
+ *
49
+ * JSON shape: { ok: false, reason: string, nextAction: string }
50
+ * Text shape: console.error with message
51
+ */
52
+ export declare function emitFlagConflict(opts: EmitFlagConflictOptions): number;
53
+ /**
54
+ * Emit a structured error from a caught exception.
55
+ * Returns exit code 1. Caller should process.exit(1) or set process.exitCode = 1.
56
+ *
57
+ * JSON shape: { ok: false, reason: string, nextAction: string }
58
+ * Text shape: console.error with "Error: <message>"
59
+ */
60
+ export declare function emitError(err: unknown, opts: EmitErrorOptions): number;
61
+ //# sourceMappingURL=cli-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-output.d.ts","sourceRoot":"","sources":["../../src/services/cli-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,4EAA4E;IAC5E,IAAI,EAAE,OAAO,CAAC;IACd,6EAA6E;IAC7E,UAAU,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,6EAA6E;IAC7E,IAAI,EAAE,OAAO,CAAC;IACd,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,6EAA6E;IAC7E,IAAI,EAAE,OAAO,CAAC;CACf;AAID;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI,CAMxF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,CAUtE;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAStE"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * PRI-432: Shared CLI output module.
3
+ *
4
+ * Extracts common output patterns from 3 CLI commands:
5
+ * - runtime-features.ts (JSON/text emit)
6
+ * - runtime-recovery.ts (dry-run/confirm conflict + JSON/text emit)
7
+ * - runtime-internalization-integrity-repair.ts (conflict + error catch + JSON/text emit)
8
+ *
9
+ * Design decisions:
10
+ * - formatText stays call-site-specific (domain layout differs per command).
11
+ * This module handles only cross-cutting output concerns.
12
+ * - Functions return exit codes; callers handle process.exit()/process.exitCode.
13
+ * This follows CLI Operator Gate rule #2 (no process.exit in shared modules).
14
+ * - JSON error shape: { ok: false, reason: string, nextAction: string }
15
+ * (matches runtime-internalization-integrity-repair.ts canonical pattern)
16
+ *
17
+ * ERR refs:
18
+ * - ERR-001 (no any): all types explicit
19
+ * - ERR-005 (no as bypass): no type casts
20
+ * - ERR-009 (fail-loud): emitError/emitFlagConflict return exit code 1
21
+ * - ERR-002 (graceful degradation with reason): all error paths include reason + nextAction
22
+ * - ERR-014 (bounded preview): JSON.stringify on known shapes only
23
+ */
24
+ // ── Functions ──────────────────────────────────────────────────────────────
25
+ /**
26
+ * Emit a result object as JSON (stdout) or text (stdout via formatText).
27
+ * Does NOT set exit code — caller decides based on result status.
28
+ */
29
+ export function emitResult(output, opts) {
30
+ if (opts.json) {
31
+ console.log(JSON.stringify(output, null, 2));
32
+ }
33
+ else {
34
+ console.log(opts.formatText(output));
35
+ }
36
+ }
37
+ /**
38
+ * Emit a dry-run/confirm flag conflict error.
39
+ * Returns exit code 1. Caller should process.exit(1) or set process.exitCode = 1.
40
+ *
41
+ * JSON shape: { ok: false, reason: string, nextAction: string }
42
+ * Text shape: console.error with message
43
+ */
44
+ export function emitFlagConflict(opts) {
45
+ const reason = 'Error: --dry-run and --confirm are mutually exclusive';
46
+ const nextAction = 'Specify only one of --dry-run or --confirm';
47
+ if (opts.json) {
48
+ console.log(JSON.stringify({ ok: false, reason, nextAction }, null, 2));
49
+ }
50
+ else {
51
+ console.error(`${reason}. Specify one or the other.`);
52
+ }
53
+ return 1;
54
+ }
55
+ /**
56
+ * Emit a structured error from a caught exception.
57
+ * Returns exit code 1. Caller should process.exit(1) or set process.exitCode = 1.
58
+ *
59
+ * JSON shape: { ok: false, reason: string, nextAction: string }
60
+ * Text shape: console.error with "Error: <message>"
61
+ */
62
+ export function emitError(err, opts) {
63
+ const reason = err instanceof Error ? err.message : String(err);
64
+ if (opts.json) {
65
+ console.log(JSON.stringify({ ok: false, reason, nextAction: opts.nextAction }, null, 2));
66
+ }
67
+ else {
68
+ console.error(`Error: ${reason}`);
69
+ }
70
+ return 1;
71
+ }
72
+ //# sourceMappingURL=cli-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-output.js","sourceRoot":"","sources":["../../src/services/cli-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAuBH,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAmB,MAAS,EAAE,IAA0B;IAChF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAA6B;IAC5D,MAAM,MAAM,GAAG,uDAAuD,CAAC;IACvE,MAAM,UAAU,GAAG,4CAA4C,CAAC;IAEhE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,6BAA6B,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,GAAY,EAAE,IAAsB;IAC5D,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEhE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * PRI-431 Step 3: Shared runtime-adapter resolver.
3
+ *
4
+ * Extracted from duplicated `resolveRuntimeAdapter` in:
5
+ * - packages/pd-cli/src/commands/runtime-internalization-run-once.ts (L222-551)
6
+ * - packages/pd-cli/src/commands/diagnose.ts (L186-334, inline)
7
+ *
8
+ * Design decisions:
9
+ * - Test-double payloads stay call-site-specific via `testDoublePayloadBuilder` callback.
10
+ * The 7 internalization runner payloads (philosopher/scribe/artificer/...) are unique
11
+ * to run-once.ts; the diagnostician payload is unique to diagnose.ts. Unifying them
12
+ * would couple unrelated domains.
13
+ * - CLI-gate concerns (process.exit, telemetry, help text) stay at call sites.
14
+ * This resolver throws structured `ConfigResolutionError` that handlers translate.
15
+ * - Lives in pd-cli/services (NOT core) because it constructs adapters and reads
16
+ * CLI feature flags via `loadEffectiveFeatureFlags`, which is a pd-cli service.
17
+ *
18
+ * ERR refs:
19
+ * - ERR-001 (no any): all types explicit
20
+ * - ERR-005 (no as bypass): no type casts
21
+ * - ERR-009 (fail-loud): ConfigResolutionError thrown with structured fields
22
+ * - ERR-013 (Object.hasOwn): feature flag check uses Object.hasOwn
23
+ * - ERR-002 (graceful degradation with reason): structured error includes reason + nextAction
24
+ */
25
+ import { TestDoubleRuntimeAdapter, isRuntimeConfigError, validateRuntimeConfig } from '@principles/core/runtime-v2';
26
+ import type { PDRuntimeAdapter, PdL2ArtifactReader, RuntimeConfig, RuntimeConfigResult } from '@principles/core/runtime-v2';
27
+ import type { ResolvedRuntimeFromPdConfig } from './resolve-runtime-from-pd-config.js';
28
+ export type ConfigResolutionErrorKind = 'missing-fields' | 'invalid-config' | 'unsupported-runtime' | 'test-double-refused';
29
+ export interface ConfigResolutionErrorDetails {
30
+ /** Required fields that are missing (for 'missing-fields' kind). */
31
+ missing?: string[];
32
+ /** Structured next action for the operator (CLI Operator Gate rule #6). */
33
+ nextAction?: string;
34
+ }
35
+ export declare class ConfigResolutionError extends Error {
36
+ readonly kind: ConfigResolutionErrorKind;
37
+ readonly missing?: string[];
38
+ readonly nextAction?: string;
39
+ constructor(message: string, kind: ConfigResolutionErrorKind, details?: ConfigResolutionErrorDetails);
40
+ }
41
+ export interface ResolveAdapterOptions {
42
+ /** Runtime kind: 'test-double' | 'pi-ai' | 'openclaw-cli' | 'config' */
43
+ runtimeKind: string;
44
+ /** Workspace directory (for config resolution + feature flags) */
45
+ workspaceDir: string;
46
+ /** Runner kind (for L2 dreamer routing). Optional. */
47
+ runnerKind?: string;
48
+ /** CLI timeout override. Takes precedence over config timeoutMs. */
49
+ timeoutMs?: number;
50
+ /**
51
+ * Whether test-double runtime is allowed. Default: false.
52
+ * When false, 'test-double' runtimeKind throws ConfigResolutionError.
53
+ */
54
+ allowTestDouble?: boolean;
55
+ /**
56
+ * Call-site-specific test-double payload builder.
57
+ * Required when runtimeKind === 'test-double' and allowTestDouble === true.
58
+ * Receives the full opts object so the builder can access taskId, runnerKind, etc.
59
+ */
60
+ testDoublePayloadBuilder?: (opts: ResolveAdapterOptions) => PDRuntimeAdapter;
61
+ /**
62
+ * CLI overrides for pi-ai runtime (from --provider, --model, etc. flags).
63
+ * When provided, these take precedence over config values.
64
+ */
65
+ piAiOverrides?: {
66
+ provider?: string;
67
+ model?: string;
68
+ apiKeyEnv?: string;
69
+ baseUrl?: string;
70
+ maxRetries?: number;
71
+ };
72
+ /**
73
+ * CLI override for openclaw mode (from --openclaw-local / --openclaw-gateway flags).
74
+ * When provided, takes precedence over config openclawMode.
75
+ */
76
+ openclawMode?: 'local' | 'gateway';
77
+ /** PRI-419: L2 artifact reader (only used when l2_dreamer is on). */
78
+ l2ArtifactReader?: PdL2ArtifactReader;
79
+ /** PRI-419: workspace stateDir for L2 principle reader (only used when l2_dreamer is on). */
80
+ l2StateDir?: string;
81
+ /** PRI-431 Step 1d: CLI agentId override for openclaw-cli (from --agent flag). Default: 'main'. */
82
+ agentId?: string;
83
+ /**
84
+ * PRI-431 Step 1d: Whether config resolution errors are tolerated (proceed with CLI overrides alone).
85
+ * When true, pi-ai branch skips validateRuntimeConfig and uses manual missing-field check.
86
+ * Default: false (config errors throw ConfigResolutionError).
87
+ */
88
+ configOptional?: boolean;
89
+ /**
90
+ * PRI-431 Step 1d: Whether to validate that process.env[apiKeyEnv] is set before
91
+ * constructing PiAiRuntimeAdapter. Default: false (env var check stays at call site for backward compat).
92
+ */
93
+ validateApiKeyEnv?: boolean;
94
+ /**
95
+ * PRI-431 Step 1d: Callback invoked with the full resolved config object (including legacyWarnings)
96
+ * after successful config resolution. Useful for telemetry, legacyWarnings printing, etc.
97
+ * NOT called for test-double branch (no config resolution).
98
+ * Called even when config returns error IF configOptional is true.
99
+ */
100
+ onConfigResolved?: (resolved: ResolvedRuntimeFromPdConfig) => void;
101
+ }
102
+ export declare function resolveRuntimeAdapterFromConfig(opts: ResolveAdapterOptions): PDRuntimeAdapter;
103
+ export type { RuntimeConfig, RuntimeConfigResult };
104
+ export { TestDoubleRuntimeAdapter, isRuntimeConfigError, validateRuntimeConfig };
105
+ //# sourceMappingURL=runtime-adapter-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-adapter-resolver.d.ts","sourceRoot":"","sources":["../../src/services/runtime-adapter-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EACL,wBAAwB,EAMxB,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAG5H,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAIvF,MAAM,MAAM,yBAAyB,GACjC,gBAAgB,GAChB,gBAAgB,GAChB,qBAAqB,GACrB,qBAAqB,CAAC;AAE1B,MAAM,WAAW,4BAA4B;IAC3C,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;gBAG3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,yBAAyB,EAC/B,OAAO,CAAC,EAAE,4BAA4B;CAQzC;AAID,MAAM,WAAW,qBAAqB;IACpC,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,gBAAgB,CAAC;IAC7E;;;OAGG;IACH,aAAa,CAAC,EAAE;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IACtC,6FAA6F;IAC7F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mGAAmG;IACnG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,2BAA2B,KAAK,IAAI,CAAC;CACpE;AAID,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,qBAAqB,GAAG,gBAAgB,CAkM7F;AAID,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * PRI-431 Step 3: Shared runtime-adapter resolver.
3
+ *
4
+ * Extracted from duplicated `resolveRuntimeAdapter` in:
5
+ * - packages/pd-cli/src/commands/runtime-internalization-run-once.ts (L222-551)
6
+ * - packages/pd-cli/src/commands/diagnose.ts (L186-334, inline)
7
+ *
8
+ * Design decisions:
9
+ * - Test-double payloads stay call-site-specific via `testDoublePayloadBuilder` callback.
10
+ * The 7 internalization runner payloads (philosopher/scribe/artificer/...) are unique
11
+ * to run-once.ts; the diagnostician payload is unique to diagnose.ts. Unifying them
12
+ * would couple unrelated domains.
13
+ * - CLI-gate concerns (process.exit, telemetry, help text) stay at call sites.
14
+ * This resolver throws structured `ConfigResolutionError` that handlers translate.
15
+ * - Lives in pd-cli/services (NOT core) because it constructs adapters and reads
16
+ * CLI feature flags via `loadEffectiveFeatureFlags`, which is a pd-cli service.
17
+ *
18
+ * ERR refs:
19
+ * - ERR-001 (no any): all types explicit
20
+ * - ERR-005 (no as bypass): no type casts
21
+ * - ERR-009 (fail-loud): ConfigResolutionError thrown with structured fields
22
+ * - ERR-013 (Object.hasOwn): feature flag check uses Object.hasOwn
23
+ * - ERR-002 (graceful degradation with reason): structured error includes reason + nextAction
24
+ */
25
+ import { TestDoubleRuntimeAdapter, PiAiRuntimeAdapter, OpenClawCliRuntimeAdapter, L2AgentLoopAdapter, buildL2PrincipleReaderFromLedger, loadLedger, isRuntimeConfigError, validateRuntimeConfig, } from '@principles/core/runtime-v2';
26
+ import { loadEffectiveFeatureFlags } from './feature-flag-loader.js';
27
+ import { resolveRuntimeFromPdConfig } from './resolve-runtime-from-pd-config.js';
28
+ export class ConfigResolutionError extends Error {
29
+ kind;
30
+ missing;
31
+ nextAction;
32
+ constructor(message, kind, details) {
33
+ super(message);
34
+ this.name = 'ConfigResolutionError';
35
+ this.kind = kind;
36
+ this.missing = details?.missing;
37
+ this.nextAction = details?.nextAction;
38
+ }
39
+ }
40
+ // ── Resolver function ──────────────────────────────────────────────────────
41
+ export function resolveRuntimeAdapterFromConfig(opts) {
42
+ // ── test-double branch ──────────────────────────────────────────────────
43
+ if (opts.runtimeKind === 'test-double') {
44
+ if (!opts.allowTestDouble) {
45
+ throw new ConfigResolutionError('runtimeKind "test-double" requires allowTestDouble=true.', 'test-double-refused', { nextAction: 'Pass --allow-test-double or use a production runtime kind.' });
46
+ }
47
+ if (!opts.testDoublePayloadBuilder) {
48
+ throw new ConfigResolutionError('runtimeKind "test-double" requires testDoublePayloadBuilder callback.', 'missing-fields', {
49
+ missing: ['testDoublePayloadBuilder'],
50
+ nextAction: 'Provide a testDoublePayloadBuilder function that constructs the test-double adapter.',
51
+ });
52
+ }
53
+ return opts.testDoublePayloadBuilder(opts);
54
+ }
55
+ // ── Resolve config from .pd/config.yaml (for pi-ai, openclaw-cli, config) ──
56
+ const resolved = resolveRuntimeFromPdConfig(opts.workspaceDir);
57
+ const configResult = resolved.result;
58
+ // PRI-431 Step 1d: invoke onConfigResolved callback (for telemetry, legacyWarnings, etc.)
59
+ opts.onConfigResolved?.(resolved);
60
+ if (isRuntimeConfigError(configResult)) {
61
+ if (!opts.configOptional) {
62
+ throw new ConfigResolutionError(`Config resolution from .pd/config.yaml failed: ${configResult.reason}. ${configResult.message}`, 'invalid-config', { nextAction: configResult.nextAction });
63
+ }
64
+ // configOptional=true: proceed with CLI overrides alone (pi-ai branch handles missing fields)
65
+ }
66
+ // ── pi-ai branch ────────────────────────────────────────────────────────
67
+ // When runtimeKind === 'config', configResult must be a valid RuntimeConfig
68
+ // (if it were an error and !configOptional, we threw above; if configOptional,
69
+ // the caller passes an explicit runtimeKind, never 'config'). The type guard
70
+ // also narrows for TypeScript.
71
+ const isPiAi = opts.runtimeKind === 'pi-ai' ||
72
+ (opts.runtimeKind === 'config' &&
73
+ !isRuntimeConfigError(configResult) &&
74
+ configResult.runtimeKind === 'pi-ai');
75
+ if (isPiAi) {
76
+ // PRI-431 Step 1d + PR review fix: validateRuntimeConfig is only called when
77
+ // config is valid AND configOptional is false. When configOptional=true (diagnose.ts),
78
+ // skip validateRuntimeConfig to match the original diagnose.ts behavior (which never
79
+ // called it — only did a manual missing-field check on merged values). This avoids
80
+ // a behavior change where validateRuntimeConfig would reject configs missing baseUrl
81
+ // for non-built-in providers, even when the user passes --baseUrl on the CLI.
82
+ if (!opts.configOptional && !isRuntimeConfigError(configResult)) {
83
+ try {
84
+ validateRuntimeConfig(configResult);
85
+ }
86
+ catch (err) {
87
+ throw new ConfigResolutionError(err instanceof Error ? err.message : String(err), 'invalid-config');
88
+ }
89
+ }
90
+ // Merge CLI overrides with config values (overrides take precedence)
91
+ // When configOptional and config failed, configResult fields are unavailable — use empty object
92
+ const configFields = isRuntimeConfigError(configResult) ? {} : configResult;
93
+ const provider = opts.piAiOverrides?.provider ?? configFields.provider;
94
+ const model = opts.piAiOverrides?.model ?? configFields.model;
95
+ const apiKeyEnv = opts.piAiOverrides?.apiKeyEnv ?? configFields.apiKeyEnv;
96
+ const baseUrl = opts.piAiOverrides?.baseUrl ?? configFields.baseUrl;
97
+ const maxRetries = opts.piAiOverrides?.maxRetries ?? configFields.maxRetries;
98
+ const adapterTimeoutMs = opts.timeoutMs ?? configFields.timeoutMs;
99
+ // PRI-431 Step 1d + PR review fix: manual missing-field check on MERGED values
100
+ // when configOptional=true. The original diagnose.ts always did this check on merged
101
+ // values (not just when config failed), so we replicate that here. This covers both
102
+ // the "config failed" case and the "config valid but missing fields not in config" case.
103
+ if (opts.configOptional) {
104
+ const missing = [];
105
+ if (!provider)
106
+ missing.push('provider');
107
+ if (!model)
108
+ missing.push('model');
109
+ if (!apiKeyEnv)
110
+ missing.push('apiKeyEnv');
111
+ if (missing.length > 0) {
112
+ throw new ConfigResolutionError(`Missing required pi-ai config: ${missing.join(', ')}.`, 'missing-fields', {
113
+ missing,
114
+ nextAction: 'Pass --provider, --model, --apiKeyEnv flags or configure .pd/config.yaml runtime profile.',
115
+ });
116
+ }
117
+ }
118
+ // PRI-431 Step 1d: validate API key env var when requested
119
+ if (opts.validateApiKeyEnv && apiKeyEnv && !process.env[apiKeyEnv]) {
120
+ throw new ConfigResolutionError(`Environment variable '${apiKeyEnv}' is not set.`, 'invalid-config', {
121
+ nextAction: 'Set the env var (e.g., export OPENAI_API_KEY=...) or choose a different apiKeyEnv.',
122
+ });
123
+ }
124
+ // PRI-419: L2 dreamer sub-branch — when l2_dreamer flag is on AND this is the
125
+ // dreamer runner, route through the L2 multi-turn agent loop adapter.
126
+ // Other runners (philosopher/scribe/...) stay on L1.
127
+ if (opts.runnerKind === 'dreamer' && opts.l2ArtifactReader && opts.l2StateDir) {
128
+ const effectiveFlags = loadEffectiveFeatureFlags(opts.workspaceDir);
129
+ const l2Flag = Object.hasOwn(effectiveFlags.flags, 'l2_dreamer')
130
+ ? effectiveFlags.flags.l2_dreamer.enabled
131
+ : false;
132
+ if (l2Flag) {
133
+ return new L2AgentLoopAdapter({
134
+ provider: String(provider),
135
+ model: String(model),
136
+ apiKeyEnv: String(apiKeyEnv),
137
+ baseUrl,
138
+ workspace: opts.workspaceDir,
139
+ totalBudgetMs: adapterTimeoutMs,
140
+ }, {
141
+ artifactReader: opts.l2ArtifactReader,
142
+ principleReader: buildL2PrincipleReaderFromLedger(loadLedger(opts.l2StateDir)),
143
+ });
144
+ }
145
+ }
146
+ return new PiAiRuntimeAdapter({
147
+ provider: String(provider),
148
+ model: String(model),
149
+ apiKeyEnv: String(apiKeyEnv),
150
+ maxRetries,
151
+ timeoutMs: adapterTimeoutMs,
152
+ baseUrl,
153
+ workspace: opts.workspaceDir,
154
+ });
155
+ }
156
+ // ── openclaw-cli branch ─────────────────────────────────────────────────
157
+ const isOpenClawCli = opts.runtimeKind === 'openclaw-cli' ||
158
+ (opts.runtimeKind === 'config' &&
159
+ !isRuntimeConfigError(configResult) &&
160
+ configResult.runtimeKind === 'openclaw-cli');
161
+ if (isOpenClawCli) {
162
+ // PRI-431 Step 1d: handle configOptional — when config failed, configFields is empty
163
+ const openclawConfigFields = isRuntimeConfigError(configResult)
164
+ ? {}
165
+ : configResult;
166
+ // CLI override takes precedence over config
167
+ const openclawMode = opts.openclawMode ?? openclawConfigFields.openclawMode;
168
+ if (!openclawMode) {
169
+ throw new ConfigResolutionError("runtimeKind 'openclaw-cli' requires openclawMode.", 'missing-fields', {
170
+ missing: ['openclawMode'],
171
+ nextAction: 'Add openclawMode: local|gateway to your .pd/config.yaml runtime profile or use --openclaw-local/--openclaw-gateway flags.',
172
+ });
173
+ }
174
+ // PRI-431 Step 1d: only pass agentId when explicitly provided (backward compat with run-once.ts)
175
+ const openclawAdapterOpts = {
176
+ runtimeMode: openclawMode,
177
+ workspaceDir: opts.workspaceDir,
178
+ };
179
+ if (opts.agentId !== undefined) {
180
+ openclawAdapterOpts.agentId = opts.agentId;
181
+ }
182
+ return new OpenClawCliRuntimeAdapter(openclawAdapterOpts);
183
+ }
184
+ // ── Unsupported runtime ────────────────────────────────────────────────
185
+ throw new Error(`Unsupported runtime kind: ${opts.runtimeKind}. Supported: test-double, pi-ai, openclaw-cli, config`);
186
+ }
187
+ export { TestDoubleRuntimeAdapter, isRuntimeConfigError, validateRuntimeConfig };
188
+ //# sourceMappingURL=runtime-adapter-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-adapter-resolver.js","sourceRoot":"","sources":["../../src/services/runtime-adapter-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EAClB,gCAAgC,EAChC,UAAU,EACV,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAkBjF,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACrC,IAAI,CAA4B;IAChC,OAAO,CAAY;IACnB,UAAU,CAAU;IAE7B,YACE,OAAe,EACf,IAA+B,EAC/B,OAAsC;QAEtC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC;IACxC,CAAC;CACF;AAkED,8EAA8E;AAE9E,MAAM,UAAU,+BAA+B,CAAC,IAA2B;IACzE,2EAA2E;IAC3E,IAAI,IAAI,CAAC,WAAW,KAAK,aAAa,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,IAAI,qBAAqB,CAC7B,0DAA0D,EAC1D,qBAAqB,EACrB,EAAE,UAAU,EAAE,4DAA4D,EAAE,CAC7E,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACnC,MAAM,IAAI,qBAAqB,CAC7B,uEAAuE,EACvE,gBAAgB,EAChB;gBACE,OAAO,EAAE,CAAC,0BAA0B,CAAC;gBACrC,UAAU,EACR,sFAAsF;aACzF,CACF,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,8EAA8E;IAC9E,MAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAwB,QAAQ,CAAC,MAAM,CAAC;IAE1D,0FAA0F;IAC1F,IAAI,CAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC,CAAC;IAElC,IAAI,oBAAoB,CAAC,YAAY,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,IAAI,qBAAqB,CAC7B,kDAAkD,YAAY,CAAC,MAAM,KAAK,YAAY,CAAC,OAAO,EAAE,EAChG,gBAAgB,EAChB,EAAE,UAAU,EAAE,YAAY,CAAC,UAAU,EAAE,CACxC,CAAC;QACJ,CAAC;QACD,8FAA8F;IAChG,CAAC;IAED,2EAA2E;IAC3E,4EAA4E;IAC5E,+EAA+E;IAC/E,6EAA6E;IAC7E,+BAA+B;IAC/B,MAAM,MAAM,GACV,IAAI,CAAC,WAAW,KAAK,OAAO;QAC5B,CAAC,IAAI,CAAC,WAAW,KAAK,QAAQ;YAC5B,CAAC,oBAAoB,CAAC,YAAY,CAAC;YACnC,YAAY,CAAC,WAAW,KAAK,OAAO,CAAC,CAAC;IAC1C,IAAI,MAAM,EAAE,CAAC;QACX,6EAA6E;QAC7E,uFAAuF;QACvF,qFAAqF;QACrF,mFAAmF;QACnF,qFAAqF;QACrF,8EAA8E;QAC9E,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,EAAE,CAAC;YAChE,IAAI,CAAC;gBACH,qBAAqB,CAAC,YAAY,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,qBAAqB,CAC7B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAChD,gBAAgB,CACjB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,qEAAqE;QACrE,gGAAgG;QAChG,MAAM,YAAY,GAA2B,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;QACpG,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,IAAI,YAAY,CAAC,QAAQ,CAAC;QACvE,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC;QAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,IAAI,YAAY,CAAC,SAAS,CAAC;QAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,UAAU,IAAI,YAAY,CAAC,UAAU,CAAC;QAC7E,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,IAAI,YAAY,CAAC,SAAS,CAAC;QAElE,+EAA+E;QAC/E,qFAAqF;QACrF,oFAAoF;QACpF,yFAAyF;QACzF,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,IAAI,CAAC,QAAQ;gBAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK;gBAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,SAAS;gBAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,qBAAqB,CAC7B,kCAAkC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EACvD,gBAAgB,EAChB;oBACE,OAAO;oBACP,UAAU,EACR,2FAA2F;iBAC9F,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,2DAA2D;QAC3D,IAAI,IAAI,CAAC,iBAAiB,IAAI,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,qBAAqB,CAC7B,yBAAyB,SAAS,eAAe,EACjD,gBAAgB,EAChB;gBACE,UAAU,EACR,oFAAoF;aACvF,CACF,CAAC;QACJ,CAAC;QAED,8EAA8E;QAC9E,sEAAsE;QACtE,qDAAqD;QACrD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9E,MAAM,cAAc,GAAG,yBAAyB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,YAAY,CAAC;gBAC9D,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO;gBACzC,CAAC,CAAC,KAAK,CAAC;YACV,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,IAAI,kBAAkB,CAC3B;oBACE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;oBAC1B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;oBACpB,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;oBAC5B,OAAO;oBACP,SAAS,EAAE,IAAI,CAAC,YAAY;oBAC5B,aAAa,EAAE,gBAAgB;iBAChC,EACD;oBACE,cAAc,EAAE,IAAI,CAAC,gBAAgB;oBACrC,eAAe,EAAE,gCAAgC,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;iBAC/E,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,kBAAkB,CAAC;YAC5B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;YAC1B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;YACpB,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;YAC5B,UAAU;YACV,SAAS,EAAE,gBAAgB;YAC3B,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,YAAY;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,2EAA2E;IAC3E,MAAM,aAAa,GACjB,IAAI,CAAC,WAAW,KAAK,cAAc;QACnC,CAAC,IAAI,CAAC,WAAW,KAAK,QAAQ;YAC5B,CAAC,oBAAoB,CAAC,YAAY,CAAC;YACnC,YAAY,CAAC,WAAW,KAAK,cAAc,CAAC,CAAC;IACjD,IAAI,aAAa,EAAE,CAAC;QAClB,qFAAqF;QACrF,MAAM,oBAAoB,GAA2B,oBAAoB,CAAC,YAAY,CAAC;YACrF,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,YAAY,CAAC;QACjB,4CAA4C;QAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,oBAAoB,CAAC,YAAY,CAAC;QAC5E,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,qBAAqB,CAC7B,mDAAmD,EACnD,gBAAgB,EAChB;gBACE,OAAO,EAAE,CAAC,cAAc,CAAC;gBACzB,UAAU,EACR,2HAA2H;aAC9H,CACF,CAAC;QACJ,CAAC;QACD,iGAAiG;QACjG,MAAM,mBAAmB,GAIrB;YACF,WAAW,EAAE,YAAY;YACzB,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC;QACF,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,mBAAmB,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7C,CAAC;QACD,OAAO,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,CAAC;IAC5D,CAAC;IAED,0EAA0E;IAC1E,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,CAAC,WAAW,uDAAuD,CACrG,CAAC;AACJ,CAAC;AAKD,OAAO,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@principles/pd-cli",
3
- "version": "1.115.0",
3
+ "version": "1.117.0",
4
4
  "description": "PD CLI — Pain recording, sample management, and evolution tasks",
5
5
  "type": "module",
6
6
  "bin": {
@@ -123,6 +123,56 @@ interface ResolvedRecommendation {
123
123
  usedFallback: boolean;
124
124
  }
125
125
 
126
+ /**
127
+ * Resolve `sourcePainId` from the canonical diagnostician task chain.
128
+ *
129
+ * The `CandidateRecord` does not carry `sourcePainId` — it must be resolved by
130
+ * looking up the diagnostician task (`candidate.taskId`) and parsing its
131
+ * `diagnosticJson`, which contains `sourcePainId` as a top-level key (set by
132
+ * `PainSignalBridge.buildDiagnosticJson`).
133
+ *
134
+ * Runtime Contract:
135
+ * - Rule 1: parsed JSON treated as `unknown`
136
+ * - Rule 2: no `as` bypass; type narrowing via `typeof` + `Object.hasOwn`
137
+ * - Rule 5: `Object.hasOwn` for untrusted key checks
138
+ *
139
+ * ERR-004: `sourcePainId` resolved from canonical chain, never invented.
140
+ *
141
+ * @returns The validated `sourcePainId`, or `null` when it cannot be resolved
142
+ * (task missing, JSON malformed, field absent, wrong type, or blank).
143
+ * Callers at the production boundary must fail loud on `null`.
144
+ */
145
+ export async function resolveSourcePainIdFromDiagnostician(
146
+ stateManager: RuntimeStateManager,
147
+ candidate: { taskId?: string },
148
+ ): Promise<string | null> {
149
+ const diagTaskId = candidate.taskId?.trim();
150
+ if (!diagTaskId) return null;
151
+
152
+ const diagTask = await stateManager.getTask(diagTaskId);
153
+ // PRI-435 (CodeRabbit P1): Verify taskKind is 'diagnostician' to prevent
154
+ // cross-task-chain lineage contamination. If candidate.taskId points to a
155
+ // non-diagnostician task, sourcePainId must not be trusted.
156
+ if (!diagTask || diagTask.taskKind !== 'diagnostician') return null;
157
+
158
+ if (typeof diagTask.diagnosticJson !== 'string') return null;
159
+
160
+ let parsed: unknown;
161
+ try {
162
+ parsed = JSON.parse(diagTask.diagnosticJson);
163
+ } catch {
164
+ return null;
165
+ }
166
+
167
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) return null;
168
+ if (!Object.hasOwn(parsed, 'sourcePainId')) return null;
169
+
170
+ const sourcePainId = Reflect.get(parsed, 'sourcePainId');
171
+ if (typeof sourcePainId !== 'string' || sourcePainId.trim() === '') return null;
172
+
173
+ return sourcePainId.trim();
174
+ }
175
+
126
176
  function resolveCandidateRecommendation(
127
177
  candidate: { sourceRecommendationJson?: string; description?: string },
128
178
  stateManager: RuntimeStateManager,
@@ -258,7 +308,30 @@ export async function handleCandidateInternalize(opts: CandidateInternalizeOptio
258
308
 
259
309
  const decision = decideInternalizationRoute(recommendation as Parameters<typeof decideInternalizationRoute>[0]);
260
310
 
261
- const seed = buildDreamerSeedFromCandidate(candidate, { route: decision.route, ready: decision.ready });
311
+ // PRI-435: Resolve sourcePainId from the canonical diagnostician task chain.
312
+ // The CandidateRecord does not carry sourcePainId — it must be looked up
313
+ // from the diagnostician task's diagnosticJson via candidate.taskId.
314
+ // Missing/malformed sourcePainId must fail loud with no side effects.
315
+ const sourcePainId = await resolveSourcePainIdFromDiagnostician(stateManager, candidate);
316
+ if (sourcePainId === null) {
317
+ const result: CandidateInternalizeResult = {
318
+ candidateId: opts.candidateId,
319
+ route: decision.route,
320
+ status: 'no_task_created',
321
+ reason: `Cannot resolve sourcePainId from diagnostician task chain for candidate ${opts.candidateId}`,
322
+ nextAction: 'Verify the diagnostician task diagnosticJson contains a valid top-level sourcePainId; re-run diagnosis if the pain signal is missing',
323
+ };
324
+ if (opts.json) {
325
+ console.log(JSON.stringify(result, null, 2));
326
+ } else {
327
+ console.error(`Cannot resolve sourcePainId for candidate ${opts.candidateId}`);
328
+ console.error(`Next: ${result.nextAction}`);
329
+ }
330
+ process.exit(1);
331
+ return;
332
+ }
333
+
334
+ const seed = buildDreamerSeedFromCandidate(candidate, { route: decision.route, ready: decision.ready, sourcePainId });
262
335
  if ('decision' in seed) {
263
336
  const decisionResult = seed as { decision: string; reason?: string; taskId?: string };
264
337
  const reason = decisionResult.decision === 'already_exists'
@@ -828,7 +901,15 @@ export async function handleCandidateInternalizationBackfill(opts: CandidateBack
828
901
  const recommendation = resolveCandidateRecommendation(candidate, stateManager, candidateId);
829
902
  const decision = decideInternalizationRoute(recommendation as Parameters<typeof decideInternalizationRoute>[0]);
830
903
 
831
- const seed = buildDreamerSeedFromCandidate(candidate, { route: decision.route, ready: decision.ready });
904
+ // PRI-435: Resolve sourcePainId from the canonical diagnostician task chain.
905
+ // Missing/malformed sourcePainId must fail loud per-candidate with no side effects.
906
+ const sourcePainId = await resolveSourcePainIdFromDiagnostician(stateManager, candidate);
907
+ if (sourcePainId === null) {
908
+ output.errors++;
909
+ output.results.push({ candidateId, route: decision.route, status: 'error', reason: `Cannot resolve sourcePainId from diagnostician task chain for candidate ${candidateId}`, statusBefore: 'consumed', statusAfter: 'consumed', intakeDecision: 'not_needed', seedDecision: 'skipped', nextAction: 'Verify the diagnostician task diagnosticJson contains a valid top-level sourcePainId; re-run diagnosis if the pain signal is missing' });
910
+ continue;
911
+ }
912
+ const seed = buildDreamerSeedFromCandidate(candidate, { route: decision.route, ready: decision.ready, sourcePainId });
832
913
  if ('decision' in seed) {
833
914
  output.deferred++;
834
915
  const decisionResult = seed as { decision: string; reason?: string; taskId?: string };
@@ -899,7 +980,15 @@ export async function handleCandidateInternalizationBackfill(opts: CandidateBack
899
980
  const recommendation = resolveCandidateRecommendation(candidate, stateManager, candidateId);
900
981
  const decision = decideInternalizationRoute(recommendation as Parameters<typeof decideInternalizationRoute>[0]);
901
982
 
902
- const seed = buildDreamerSeedFromCandidate(candidate, { route: decision.route, ready: decision.ready });
983
+ // PRI-435: Resolve sourcePainId from the canonical diagnostician task chain.
984
+ // Missing/malformed sourcePainId must fail loud per-candidate with no side effects.
985
+ const sourcePainId = await resolveSourcePainIdFromDiagnostician(stateManager, candidate);
986
+ if (sourcePainId === null) {
987
+ output.errors++;
988
+ output.results.push({ candidateId, route: decision.route, status: 'error', reason: `Cannot resolve sourcePainId from diagnostician task chain for candidate ${candidateId}`, statusBefore: 'pending', statusAfter: 'pending', intakeDecision: 'skipped', seedDecision: 'skipped', nextAction: 'Verify the diagnostician task diagnosticJson contains a valid top-level sourcePainId; re-run diagnosis if the pain signal is missing' });
989
+ continue;
990
+ }
991
+ const seed = buildDreamerSeedFromCandidate(candidate, { route: decision.route, ready: decision.ready, sourcePainId });
903
992
  if ('decision' in seed) {
904
993
  output.deferred++;
905
994
  const decisionResult = seed as { decision: string; reason?: string; taskId?: string };