@principles/core 1.87.0 → 1.89.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 (55) hide show
  1. package/dist/runtime-v2/__tests__/architecture-regression.test.js +39 -0
  2. package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  3. package/dist/runtime-v2/__tests__/scribe-runner-vslice.test.js +425 -2
  4. package/dist/runtime-v2/__tests__/scribe-runner-vslice.test.js.map +1 -1
  5. package/dist/runtime-v2/config/__tests__/pd-config-contract.test.d.ts +15 -0
  6. package/dist/runtime-v2/config/__tests__/pd-config-contract.test.d.ts.map +1 -0
  7. package/dist/runtime-v2/config/__tests__/pd-config-contract.test.js +685 -0
  8. package/dist/runtime-v2/config/__tests__/pd-config-contract.test.js.map +1 -0
  9. package/dist/runtime-v2/config/index.d.ts +14 -0
  10. package/dist/runtime-v2/config/index.d.ts.map +1 -0
  11. package/dist/runtime-v2/config/index.js +16 -0
  12. package/dist/runtime-v2/config/index.js.map +1 -0
  13. package/dist/runtime-v2/config/pd-config-defaults.d.ts +14 -0
  14. package/dist/runtime-v2/config/pd-config-defaults.d.ts.map +1 -0
  15. package/dist/runtime-v2/config/pd-config-defaults.js +74 -0
  16. package/dist/runtime-v2/config/pd-config-defaults.js.map +1 -0
  17. package/dist/runtime-v2/config/pd-config-effective.d.ts +14 -0
  18. package/dist/runtime-v2/config/pd-config-effective.d.ts.map +1 -0
  19. package/dist/runtime-v2/config/pd-config-effective.js +118 -0
  20. package/dist/runtime-v2/config/pd-config-effective.js.map +1 -0
  21. package/dist/runtime-v2/config/pd-config-feature-flags.d.ts +35 -0
  22. package/dist/runtime-v2/config/pd-config-feature-flags.d.ts.map +1 -0
  23. package/dist/runtime-v2/config/pd-config-feature-flags.js +99 -0
  24. package/dist/runtime-v2/config/pd-config-feature-flags.js.map +1 -0
  25. package/dist/runtime-v2/config/pd-config-redaction.d.ts +22 -0
  26. package/dist/runtime-v2/config/pd-config-redaction.d.ts.map +1 -0
  27. package/dist/runtime-v2/config/pd-config-redaction.js +179 -0
  28. package/dist/runtime-v2/config/pd-config-redaction.js.map +1 -0
  29. package/dist/runtime-v2/config/pd-config-types.d.ts +124 -0
  30. package/dist/runtime-v2/config/pd-config-types.d.ts.map +1 -0
  31. package/dist/runtime-v2/config/pd-config-types.js +35 -0
  32. package/dist/runtime-v2/config/pd-config-types.js.map +1 -0
  33. package/dist/runtime-v2/config/pd-config-validate.d.ts +16 -0
  34. package/dist/runtime-v2/config/pd-config-validate.d.ts.map +1 -0
  35. package/dist/runtime-v2/config/pd-config-validate.js +443 -0
  36. package/dist/runtime-v2/config/pd-config-validate.js.map +1 -0
  37. package/dist/runtime-v2/index.d.ts +2 -0
  38. package/dist/runtime-v2/index.d.ts.map +1 -1
  39. package/dist/runtime-v2/index.js +6 -0
  40. package/dist/runtime-v2/index.js.map +1 -1
  41. package/dist/runtime-v2/internalization/scribe-output.d.ts +8 -2
  42. package/dist/runtime-v2/internalization/scribe-output.d.ts.map +1 -1
  43. package/dist/runtime-v2/internalization/scribe-output.js +33 -17
  44. package/dist/runtime-v2/internalization/scribe-output.js.map +1 -1
  45. package/dist/runtime-v2/internalization/scribe-runner.d.ts +56 -49
  46. package/dist/runtime-v2/internalization/scribe-runner.d.ts.map +1 -1
  47. package/dist/runtime-v2/internalization/scribe-runner.js +116 -398
  48. package/dist/runtime-v2/internalization/scribe-runner.js.map +1 -1
  49. package/dist/runtime-v2/runner/__tests__/base-peer-runner-trust-boundary.test.js +119 -0
  50. package/dist/runtime-v2/runner/__tests__/base-peer-runner-trust-boundary.test.js.map +1 -1
  51. package/dist/runtime-v2/runner/base-peer-runner.d.ts +1 -1
  52. package/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -1
  53. package/dist/runtime-v2/runner/base-peer-runner.js +8 -0
  54. package/dist/runtime-v2/runner/base-peer-runner.js.map +1 -1
  55. package/package.json +1 -1
@@ -0,0 +1,179 @@
1
+ /**
2
+ * PD Config Redaction — PRI-304
3
+ *
4
+ * Produces safe summaries for CLI/Console display.
5
+ * Never includes token/API key values or raw OpenClaw provider objects.
6
+ * Uses safe serialization for previews (ERR-014, ERR-016, ERR-017).
7
+ * Redaction uses ANY-segment logic for sensitive keys (ERR-045).
8
+ * String values run through full redaction pipeline before truncation (ERR-046).
9
+ */
10
+ import { DANGEROUS_KEYS, } from './pd-config-types.js';
11
+ // ── Sensitive Key Detection ─────────────────────────────────────────────────
12
+ const SENSITIVE_KEY_SEGMENTS = new Set([
13
+ 'key', 'token', 'secret', 'password', 'auth', 'credential', 'apikey', 'api_key',
14
+ 'accesstoken', 'access_token', 'refreshtoken', 'refresh_token',
15
+ 'private', 'certificate', 'signature',
16
+ ]);
17
+ function isSensitiveKey(key) {
18
+ const segments = key.toLowerCase().split(/[_\-.]/);
19
+ if (segments.length === 0)
20
+ return false;
21
+ // ANY-segment match (ERR-045): flag if any segment is sensitive
22
+ return segments.some(seg => SENSITIVE_KEY_SEGMENTS.has(seg));
23
+ }
24
+ // ── Safe String Redaction ───────────────────────────────────────────────────
25
+ const TOKEN_PATTERN = /\bsk-(?:ant-)?[A-Za-z0-9_-]{8,}\b/g;
26
+ const BEARER_PATTERN = /\bBearer\s+[A-Za-z0-9._\-+/=]{8,}\b/g;
27
+ const KEY_ASSIGN_PATTERN = /\b(api[_-]?key|token|secret|password)\s*[:=]\s*['"]?([^\s'",}{]{4,})['"]?/gi;
28
+ function redactString(value) {
29
+ return value
30
+ .replace(TOKEN_PATTERN, '[REDACTED]')
31
+ .replace(BEARER_PATTERN, '[REDACTED]')
32
+ .replace(KEY_ASSIGN_PATTERN, (_m, key) => `${key}=[REDACTED]`);
33
+ }
34
+ function safeTruncate(value, maxLen) {
35
+ if (value.length <= maxLen)
36
+ return value;
37
+ return value.slice(0, maxLen) + '…';
38
+ }
39
+ // ── Profile Label ───────────────────────────────────────────────────────────
40
+ function buildProfileLabel(id, profile) {
41
+ if (profile.type === 'openclaw') {
42
+ const oc = profile;
43
+ const parts = ['openclaw'];
44
+ if (oc.provider)
45
+ parts.push(oc.provider);
46
+ if (oc.model)
47
+ parts.push(oc.model);
48
+ if (oc.source && !oc.provider && !oc.model)
49
+ parts.push(oc.source);
50
+ return parts.join(': ');
51
+ }
52
+ // pi-ai
53
+ const pd = profile;
54
+ return `pi-ai: ${pd.provider}/${pd.model}`;
55
+ }
56
+ // ── Profile Readiness ───────────────────────────────────────────────────────
57
+ function assessProfileReadiness(profile) {
58
+ if (profile.type === 'openclaw') {
59
+ const oc = profile;
60
+ // OpenClaw profile with source=default is always "ready" (delegated to OpenClaw)
61
+ if (oc.source === 'default')
62
+ return 'ready';
63
+ // OpenClaw profile with provider+model may be ready
64
+ if (oc.provider && oc.model)
65
+ return 'ready';
66
+ return 'needs_setup';
67
+ }
68
+ // pi-ai: needs apiKeyEnv set
69
+ const pd = profile;
70
+ if (!pd.provider || !pd.model || !pd.apiKeyEnv)
71
+ return 'needs_setup';
72
+ return 'not_ready'; // has config but runtime availability unknown
73
+ }
74
+ // ── Agent Readiness ─────────────────────────────────────────────────────────
75
+ function assessAgentReadiness(enabled, profileId, profiles) {
76
+ if (!enabled)
77
+ return 'disabled';
78
+ if (!Object.hasOwn(profiles, profileId))
79
+ return 'needs_setup';
80
+ const profile = profiles[profileId];
81
+ if (!profile)
82
+ return 'needs_setup';
83
+ const profileReadiness = assessProfileReadiness(profile);
84
+ return profileReadiness;
85
+ }
86
+ // ── Redact Config ───────────────────────────────────────────────────────────
87
+ /**
88
+ * Produce a redacted summary of the effective PD config.
89
+ * Safe for CLI output, Console display, and diagnostics copy.
90
+ * Never includes token/API key values or raw provider objects.
91
+ */
92
+ export function redactPdConfig(effective) {
93
+ const { config, source, warnings } = effective;
94
+ // Features
95
+ const features = [];
96
+ for (const [id, entry] of Object.entries(config.features)) {
97
+ if (DANGEROUS_KEYS.has(id))
98
+ continue;
99
+ features.push({
100
+ id,
101
+ category: entry.category,
102
+ enabled: entry.enabled,
103
+ });
104
+ }
105
+ // Runtime profiles — redacted
106
+ const runtimeProfiles = [];
107
+ for (const [id, profile] of Object.entries(config.runtimeProfiles)) {
108
+ if (DANGEROUS_KEYS.has(id))
109
+ continue;
110
+ const summary = {
111
+ id,
112
+ type: profile.type,
113
+ label: buildProfileLabel(id, profile),
114
+ readiness: assessProfileReadiness(profile),
115
+ };
116
+ // For pi-ai profiles: show apiKeyEnv name, never the value
117
+ if (profile.type === 'pi-ai') {
118
+ const pd = profile;
119
+ summary.apiKeyEnv = pd.apiKeyEnv;
120
+ }
121
+ runtimeProfiles.push(summary);
122
+ }
123
+ // Agents — redacted
124
+ const agents = [];
125
+ for (const name of Object.keys(config.internalAgents.agents)) {
126
+ const binding = config.internalAgents.agents[name];
127
+ const profileId = binding.runtimeProfile ?? config.internalAgents.defaultRuntime;
128
+ const profile = config.runtimeProfiles[profileId];
129
+ agents.push({
130
+ name,
131
+ enabled: binding.enabled,
132
+ runtimeProfileId: profileId,
133
+ runtimeProfileLabel: profile ? buildProfileLabel(profileId, profile) : `unknown:${profileId}`,
134
+ readiness: assessAgentReadiness(binding.enabled, profileId, config.runtimeProfiles),
135
+ });
136
+ }
137
+ return {
138
+ version: config.version,
139
+ source,
140
+ features,
141
+ runtimeProfiles,
142
+ defaultRuntime: config.internalAgents.defaultRuntime,
143
+ agents,
144
+ ui: config.ui,
145
+ warnings,
146
+ };
147
+ }
148
+ /**
149
+ * Redact an arbitrary value for safe display.
150
+ * Runs through sensitive key detection and string redaction.
151
+ */
152
+ export function redactConfigValue(value, key) {
153
+ // If the key itself is sensitive, redact the entire value
154
+ if (key !== undefined && isSensitiveKey(key)) {
155
+ return '[REDACTED]';
156
+ }
157
+ if (value === null || value === undefined)
158
+ return value;
159
+ if (typeof value === 'string') {
160
+ return safeTruncate(redactString(value), 200);
161
+ }
162
+ if (typeof value === 'number' || typeof value === 'boolean')
163
+ return value;
164
+ if (Array.isArray(value)) {
165
+ return value.slice(0, 20).map((v) => redactConfigValue(v, undefined));
166
+ }
167
+ if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
168
+ const result = {};
169
+ const entries = Object.entries(value).slice(0, 30);
170
+ for (const [k, v] of entries) {
171
+ if (DANGEROUS_KEYS.has(k))
172
+ continue;
173
+ result[k] = redactConfigValue(v, k);
174
+ }
175
+ return result;
176
+ }
177
+ return '[REDACTED]';
178
+ }
179
+ //# sourceMappingURL=pd-config-redaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pd-config-redaction.js","sourceRoot":"","sources":["../../../src/runtime-v2/config/pd-config-redaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * PD-Owned Config Contract — PRI-304
3
+ *
4
+ * Pure types and constants for `.pd/config.yaml`.
5
+ * No I/O — YAML loading lives in pd-cli / plugin boundary.
6
+ *
7
+ * ADR-0016: PD owns exactly one user config file.
8
+ * .pd/feature-flags.yaml is retired into this contract.
9
+ * .state/workflows.yaml is not a compatibility input.
10
+ * PD does not own provider secrets.
11
+ */
12
+ export declare const PD_CONFIG_VERSION = 1;
13
+ export type PdConfigVersion = 1;
14
+ export declare const VALID_FEATURE_CATEGORIES: readonly ["core", "quiet", "gone"];
15
+ export type FeatureCategory = (typeof VALID_FEATURE_CATEGORIES)[number];
16
+ export interface FeatureFlagEntry {
17
+ category: FeatureCategory;
18
+ enabled: boolean;
19
+ }
20
+ export declare const VALID_PROFILE_TYPES: readonly ["openclaw", "pi-ai"];
21
+ export type RuntimeProfileType = (typeof VALID_PROFILE_TYPES)[number];
22
+ /** OpenClaw profile: references only, no secrets */
23
+ export interface OpenClawRuntimeProfile {
24
+ type: 'openclaw';
25
+ /** Optional provider label (e.g. "lmstudio") */
26
+ provider?: string;
27
+ /** Optional model label (e.g. "qwen3.6-27b-mtp") */
28
+ model?: string;
29
+ /** Optional source identifier (e.g. "default") */
30
+ source?: string;
31
+ }
32
+ /** PD-local pi-ai profile: non-secret fields + apiKeyEnv name */
33
+ export interface PdLocalRuntimeProfile {
34
+ type: 'pi-ai';
35
+ provider: string;
36
+ model: string;
37
+ /** Environment variable name containing the API key — never the key value itself */
38
+ apiKeyEnv: string;
39
+ /** Optional base URL override */
40
+ baseUrl?: string;
41
+ /** Optional timeout in milliseconds */
42
+ timeoutMs?: number;
43
+ }
44
+ export type RuntimeProfile = OpenClawRuntimeProfile | PdLocalRuntimeProfile;
45
+ export declare const INTERNAL_AGENT_NAMES: readonly ["diagnostician", "dreamer", "philosopher", "scribe", "artificer", "evaluator", "rolloutReviewer", "trainer", "correctionObserver", "empathyObserver"];
46
+ export type InternalAgentName = (typeof INTERNAL_AGENT_NAMES)[number];
47
+ export interface InternalAgentBinding {
48
+ enabled: boolean;
49
+ /** Runtime profile ID referencing a profile in runtimeProfiles */
50
+ runtimeProfile?: string;
51
+ }
52
+ export interface InternalAgentsConfig {
53
+ /** Default runtime profile for all agents without explicit override */
54
+ defaultRuntime: string;
55
+ /** Per-agent overrides */
56
+ agents: Record<InternalAgentName, InternalAgentBinding>;
57
+ }
58
+ export declare const VALID_DIAGNOSTICS_MODES: readonly ["simple", "advanced"];
59
+ export type DiagnosticsMode = (typeof VALID_DIAGNOSTICS_MODES)[number];
60
+ export interface UiConfig {
61
+ diagnostics: {
62
+ mode: DiagnosticsMode;
63
+ };
64
+ }
65
+ export interface PdConfig {
66
+ version: PdConfigVersion;
67
+ features: Record<string, FeatureFlagEntry>;
68
+ runtimeProfiles: Record<string, RuntimeProfile>;
69
+ internalAgents: InternalAgentsConfig;
70
+ ui: UiConfig;
71
+ }
72
+ export interface PdConfigValidationError {
73
+ path: string;
74
+ reason: string;
75
+ nextAction: string;
76
+ }
77
+ export interface PdConfigValidationResultOk {
78
+ ok: true;
79
+ value: PdConfig;
80
+ }
81
+ export interface PdConfigValidationResultErr {
82
+ ok: false;
83
+ errors: PdConfigValidationError[];
84
+ }
85
+ export type PdConfigValidationResult = PdConfigValidationResultOk | PdConfigValidationResultErr;
86
+ export interface EffectivePdConfig {
87
+ config: PdConfig;
88
+ source: 'defaults' | 'user_config';
89
+ warnings: string[];
90
+ }
91
+ export interface RedactedRuntimeProfileSummary {
92
+ id: string;
93
+ type: RuntimeProfileType;
94
+ /** Safe label for display (e.g. "openclaw: lmstudio/qwen3.6-27b-mtp") */
95
+ label: string;
96
+ /** For pi-ai profiles: the env var name, never the value */
97
+ apiKeyEnv?: string;
98
+ /** Whether the profile appears ready (has required fields) */
99
+ readiness: 'ready' | 'not_ready' | 'needs_setup' | 'disabled' | 'unknown';
100
+ }
101
+ export interface RedactedAgentSummary {
102
+ name: InternalAgentName;
103
+ enabled: boolean;
104
+ runtimeProfileId: string;
105
+ runtimeProfileLabel: string;
106
+ readiness: 'ready' | 'not_ready' | 'needs_setup' | 'disabled' | 'unknown';
107
+ }
108
+ export interface RedactedFeatureSummary {
109
+ id: string;
110
+ category: FeatureCategory;
111
+ enabled: boolean;
112
+ }
113
+ export interface RedactedPdConfigSummary {
114
+ version: PdConfigVersion;
115
+ source: 'defaults' | 'user_config';
116
+ features: RedactedFeatureSummary[];
117
+ runtimeProfiles: RedactedRuntimeProfileSummary[];
118
+ defaultRuntime: string;
119
+ agents: RedactedAgentSummary[];
120
+ ui: UiConfig;
121
+ warnings: string[];
122
+ }
123
+ export declare const DANGEROUS_KEYS: Set<string>;
124
+ //# sourceMappingURL=pd-config-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pd-config-types.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/config/pd-config-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * PD-Owned Config Contract — PRI-304
3
+ *
4
+ * Pure types and constants for `.pd/config.yaml`.
5
+ * No I/O — YAML loading lives in pd-cli / plugin boundary.
6
+ *
7
+ * ADR-0016: PD owns exactly one user config file.
8
+ * .pd/feature-flags.yaml is retired into this contract.
9
+ * .state/workflows.yaml is not a compatibility input.
10
+ * PD does not own provider secrets.
11
+ */
12
+ // ── Config Version ──────────────────────────────────────────────────────────
13
+ export const PD_CONFIG_VERSION = 1;
14
+ // ── Feature Flag Category ───────────────────────────────────────────────────
15
+ export const VALID_FEATURE_CATEGORIES = ['core', 'quiet', 'gone'];
16
+ // ── Runtime Profile Types ───────────────────────────────────────────────────
17
+ export const VALID_PROFILE_TYPES = ['openclaw', 'pi-ai'];
18
+ // ── Internal Agent Names ────────────────────────────────────────────────────
19
+ export const INTERNAL_AGENT_NAMES = [
20
+ 'diagnostician',
21
+ 'dreamer',
22
+ 'philosopher',
23
+ 'scribe',
24
+ 'artificer',
25
+ 'evaluator',
26
+ 'rolloutReviewer',
27
+ 'trainer',
28
+ 'correctionObserver',
29
+ 'empathyObserver',
30
+ ];
31
+ // ── UI Config ───────────────────────────────────────────────────────────────
32
+ export const VALID_DIAGNOSTICS_MODES = ['simple', 'advanced'];
33
+ // ── Dangerous Keys ──────────────────────────────────────────────────────────
34
+ export const DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
35
+ //# sourceMappingURL=pd-config-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pd-config-types.js","sourceRoot":"","sources":["../../../src/runtime-v2/config/pd-config-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,+EAA+E;AAE/E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAGnC,+EAA+E;AAE/E,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAU,CAAC;AAU3E,+EAA+E;AAE/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,UAAU,EAAE,OAAO,CAAU,CAAC;AA6BlE,+EAA+E;AAE/E,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,eAAe;IACf,SAAS;IACT,aAAa;IACb,QAAQ;IACR,WAAW;IACX,WAAW;IACX,iBAAiB;IACjB,SAAS;IACT,oBAAoB;IACpB,iBAAiB;CACT,CAAC;AAqBX,+EAA+E;AAE/E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAU,CAAC;AAuFvE,+EAA+E;AAE/E,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * PD Config Validation — PRI-304
3
+ *
4
+ * Runtime validation from `unknown` (parsed YAML/JSON).
5
+ * No `as` bypasses on untrusted input (ERR-001, ERR-005).
6
+ * Uses `Object.hasOwn()` for key checks (ERR-013).
7
+ * Missing/malformed required fields fail loud (ERR-009, ERR-010).
8
+ * Non-boolean enabled fields fail loud (ERR-047).
9
+ */
10
+ import { type PdConfigValidationResult } from './pd-config-types.js';
11
+ /**
12
+ * Validate a parsed `.pd/config.yaml` value from unknown input.
13
+ * Returns structured result — never throws on malformed input.
14
+ */
15
+ export declare function validatePdConfig(raw: unknown): PdConfigValidationResult;
16
+ //# sourceMappingURL=pd-config-validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pd-config-validate.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/config/pd-config-validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAEL,KAAK,wBAAwB,EAmB9B,MAAM,sBAAsB,CAAC;AA+W9B;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,wBAAwB,CAyHvE"}