create-principles-disciple 1.80.0 → 1.82.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 (183) hide show
  1. package/core/dist/runtime-v2/__tests__/admission-gate.test.js +6 -6
  2. package/core/dist/runtime-v2/__tests__/admission-gate.test.js.map +1 -1
  3. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +39 -0
  4. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  5. package/core/dist/runtime-v2/__tests__/artificer-runner-vslice.test.js +52 -0
  6. package/core/dist/runtime-v2/__tests__/artificer-runner-vslice.test.js.map +1 -1
  7. package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice.test.js +245 -1
  8. package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice.test.js.map +1 -1
  9. package/core/dist/runtime-v2/__tests__/feedback/redact-sensitive.test.js +131 -1
  10. package/core/dist/runtime-v2/__tests__/feedback/redact-sensitive.test.js.map +1 -1
  11. package/core/dist/runtime-v2/__tests__/scribe-runner-vslice.test.js +425 -2
  12. package/core/dist/runtime-v2/__tests__/scribe-runner-vslice.test.js.map +1 -1
  13. package/core/dist/runtime-v2/__tests__/telemetry-event.test.d.ts +2 -0
  14. package/core/dist/runtime-v2/__tests__/telemetry-event.test.d.ts.map +1 -0
  15. package/core/dist/runtime-v2/__tests__/telemetry-event.test.js +69 -0
  16. package/core/dist/runtime-v2/__tests__/telemetry-event.test.js.map +1 -0
  17. package/core/dist/runtime-v2/admission-gate.d.ts.map +1 -1
  18. package/core/dist/runtime-v2/admission-gate.js +0 -8
  19. package/core/dist/runtime-v2/admission-gate.js.map +1 -1
  20. package/core/dist/runtime-v2/config/__tests__/pd-config-contract.test.d.ts +15 -0
  21. package/core/dist/runtime-v2/config/__tests__/pd-config-contract.test.d.ts.map +1 -0
  22. package/core/dist/runtime-v2/config/__tests__/pd-config-contract.test.js +685 -0
  23. package/core/dist/runtime-v2/config/__tests__/pd-config-contract.test.js.map +1 -0
  24. package/core/dist/runtime-v2/config/__tests__/pd-config-redaction-deep.test.d.ts +13 -0
  25. package/core/dist/runtime-v2/config/__tests__/pd-config-redaction-deep.test.d.ts.map +1 -0
  26. package/core/dist/runtime-v2/config/__tests__/pd-config-redaction-deep.test.js +447 -0
  27. package/core/dist/runtime-v2/config/__tests__/pd-config-redaction-deep.test.js.map +1 -0
  28. package/core/dist/runtime-v2/config/__tests__/pd-config-validation-edge-cases.test.d.ts +12 -0
  29. package/core/dist/runtime-v2/config/__tests__/pd-config-validation-edge-cases.test.d.ts.map +1 -0
  30. package/core/dist/runtime-v2/config/__tests__/pd-config-validation-edge-cases.test.js +433 -0
  31. package/core/dist/runtime-v2/config/__tests__/pd-config-validation-edge-cases.test.js.map +1 -0
  32. package/core/dist/runtime-v2/config/index.d.ts +14 -0
  33. package/core/dist/runtime-v2/config/index.d.ts.map +1 -0
  34. package/core/dist/runtime-v2/config/index.js +16 -0
  35. package/core/dist/runtime-v2/config/index.js.map +1 -0
  36. package/core/dist/runtime-v2/config/pd-config-defaults.d.ts +14 -0
  37. package/core/dist/runtime-v2/config/pd-config-defaults.d.ts.map +1 -0
  38. package/core/dist/runtime-v2/config/pd-config-defaults.js +74 -0
  39. package/core/dist/runtime-v2/config/pd-config-defaults.js.map +1 -0
  40. package/core/dist/runtime-v2/config/pd-config-effective.d.ts +14 -0
  41. package/core/dist/runtime-v2/config/pd-config-effective.d.ts.map +1 -0
  42. package/core/dist/runtime-v2/config/pd-config-effective.js +118 -0
  43. package/core/dist/runtime-v2/config/pd-config-effective.js.map +1 -0
  44. package/core/dist/runtime-v2/config/pd-config-feature-flags.d.ts +35 -0
  45. package/core/dist/runtime-v2/config/pd-config-feature-flags.d.ts.map +1 -0
  46. package/core/dist/runtime-v2/config/pd-config-feature-flags.js +99 -0
  47. package/core/dist/runtime-v2/config/pd-config-feature-flags.js.map +1 -0
  48. package/core/dist/runtime-v2/config/pd-config-redaction.d.ts +22 -0
  49. package/core/dist/runtime-v2/config/pd-config-redaction.d.ts.map +1 -0
  50. package/core/dist/runtime-v2/config/pd-config-redaction.js +179 -0
  51. package/core/dist/runtime-v2/config/pd-config-redaction.js.map +1 -0
  52. package/core/dist/runtime-v2/config/pd-config-types.d.ts +124 -0
  53. package/core/dist/runtime-v2/config/pd-config-types.d.ts.map +1 -0
  54. package/core/dist/runtime-v2/config/pd-config-types.js +35 -0
  55. package/core/dist/runtime-v2/config/pd-config-types.js.map +1 -0
  56. package/core/dist/runtime-v2/config/pd-config-validate.d.ts +16 -0
  57. package/core/dist/runtime-v2/config/pd-config-validate.d.ts.map +1 -0
  58. package/core/dist/runtime-v2/config/pd-config-validate.js +443 -0
  59. package/core/dist/runtime-v2/config/pd-config-validate.js.map +1 -0
  60. package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.js +10 -10
  61. package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.js.map +1 -1
  62. package/core/dist/runtime-v2/feedback/index.d.ts +1 -1
  63. package/core/dist/runtime-v2/feedback/index.d.ts.map +1 -1
  64. package/core/dist/runtime-v2/feedback/index.js +1 -1
  65. package/core/dist/runtime-v2/feedback/index.js.map +1 -1
  66. package/core/dist/runtime-v2/feedback/redact-sensitive.d.ts +2 -0
  67. package/core/dist/runtime-v2/feedback/redact-sensitive.d.ts.map +1 -1
  68. package/core/dist/runtime-v2/feedback/redact-sensitive.js +32 -3
  69. package/core/dist/runtime-v2/feedback/redact-sensitive.js.map +1 -1
  70. package/core/dist/runtime-v2/index.d.ts +5 -1
  71. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  72. package/core/dist/runtime-v2/index.js +9 -1
  73. package/core/dist/runtime-v2/index.js.map +1 -1
  74. package/core/dist/runtime-v2/internalization/__tests__/philosopher-runner-trust-boundary.test.d.ts +2 -0
  75. package/core/dist/runtime-v2/internalization/__tests__/philosopher-runner-trust-boundary.test.d.ts.map +1 -0
  76. package/core/dist/runtime-v2/internalization/__tests__/philosopher-runner-trust-boundary.test.js +398 -0
  77. package/core/dist/runtime-v2/internalization/__tests__/philosopher-runner-trust-boundary.test.js.map +1 -0
  78. package/core/dist/runtime-v2/internalization/artificer-output.d.ts +3 -2
  79. package/core/dist/runtime-v2/internalization/artificer-output.d.ts.map +1 -1
  80. package/core/dist/runtime-v2/internalization/artificer-output.js +40 -31
  81. package/core/dist/runtime-v2/internalization/artificer-output.js.map +1 -1
  82. package/core/dist/runtime-v2/internalization/artificer-runner.d.ts +59 -38
  83. package/core/dist/runtime-v2/internalization/artificer-runner.d.ts.map +1 -1
  84. package/core/dist/runtime-v2/internalization/artificer-runner.js +121 -395
  85. package/core/dist/runtime-v2/internalization/artificer-runner.js.map +1 -1
  86. package/core/dist/runtime-v2/internalization/dreamer-output.d.ts +4 -3
  87. package/core/dist/runtime-v2/internalization/dreamer-output.d.ts.map +1 -1
  88. package/core/dist/runtime-v2/internalization/dreamer-output.js +11 -9
  89. package/core/dist/runtime-v2/internalization/dreamer-output.js.map +1 -1
  90. package/core/dist/runtime-v2/internalization/dreamer-runner.d.ts +31 -92
  91. package/core/dist/runtime-v2/internalization/dreamer-runner.d.ts.map +1 -1
  92. package/core/dist/runtime-v2/internalization/dreamer-runner.js +79 -495
  93. package/core/dist/runtime-v2/internalization/dreamer-runner.js.map +1 -1
  94. package/core/dist/runtime-v2/internalization/evaluator-output.d.ts +2 -2
  95. package/core/dist/runtime-v2/internalization/evaluator-output.d.ts.map +1 -1
  96. package/core/dist/runtime-v2/internalization/evaluator-output.js +29 -23
  97. package/core/dist/runtime-v2/internalization/evaluator-output.js.map +1 -1
  98. package/core/dist/runtime-v2/internalization/evaluator-runner.d.ts +74 -48
  99. package/core/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
  100. package/core/dist/runtime-v2/internalization/evaluator-runner.js +164 -444
  101. package/core/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
  102. package/core/dist/runtime-v2/internalization/philosopher-output.d.ts +8 -2
  103. package/core/dist/runtime-v2/internalization/philosopher-output.d.ts.map +1 -1
  104. package/core/dist/runtime-v2/internalization/philosopher-output.js +16 -11
  105. package/core/dist/runtime-v2/internalization/philosopher-output.js.map +1 -1
  106. package/core/dist/runtime-v2/internalization/philosopher-runner.d.ts +36 -55
  107. package/core/dist/runtime-v2/internalization/philosopher-runner.d.ts.map +1 -1
  108. package/core/dist/runtime-v2/internalization/philosopher-runner.js +117 -401
  109. package/core/dist/runtime-v2/internalization/philosopher-runner.js.map +1 -1
  110. package/core/dist/runtime-v2/internalization/scribe-output.d.ts +8 -2
  111. package/core/dist/runtime-v2/internalization/scribe-output.d.ts.map +1 -1
  112. package/core/dist/runtime-v2/internalization/scribe-output.js +33 -17
  113. package/core/dist/runtime-v2/internalization/scribe-output.js.map +1 -1
  114. package/core/dist/runtime-v2/internalization/scribe-runner.d.ts +56 -49
  115. package/core/dist/runtime-v2/internalization/scribe-runner.d.ts.map +1 -1
  116. package/core/dist/runtime-v2/internalization/scribe-runner.js +116 -398
  117. package/core/dist/runtime-v2/internalization/scribe-runner.js.map +1 -1
  118. package/core/dist/runtime-v2/runner/__tests__/base-peer-runner-trust-boundary.test.d.ts +2 -0
  119. package/core/dist/runtime-v2/runner/__tests__/base-peer-runner-trust-boundary.test.d.ts.map +1 -0
  120. package/core/dist/runtime-v2/runner/__tests__/base-peer-runner-trust-boundary.test.js +379 -0
  121. package/core/dist/runtime-v2/runner/__tests__/base-peer-runner-trust-boundary.test.js.map +1 -0
  122. package/core/dist/runtime-v2/runner/base-peer-runner.d.ts +122 -0
  123. package/core/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -0
  124. package/core/dist/runtime-v2/runner/base-peer-runner.js +528 -0
  125. package/core/dist/runtime-v2/runner/base-peer-runner.js.map +1 -0
  126. package/core/dist/runtime-v2/runner/peer-runner-types.d.ts +107 -0
  127. package/core/dist/runtime-v2/runner/peer-runner-types.d.ts.map +1 -0
  128. package/core/dist/runtime-v2/runner/peer-runner-types.js +13 -0
  129. package/core/dist/runtime-v2/runner/peer-runner-types.js.map +1 -0
  130. package/core/dist/telemetry-event.d.ts +2 -2
  131. package/core/dist/telemetry-event.d.ts.map +1 -1
  132. package/core/dist/telemetry-event.js +89 -0
  133. package/core/dist/telemetry-event.js.map +1 -1
  134. package/dist/installer.d.ts +1 -1
  135. package/dist/installer.d.ts.map +1 -1
  136. package/dist/installer.js +24 -10
  137. package/dist/installer.js.map +1 -1
  138. package/dist/mvp-config.d.ts +33 -0
  139. package/dist/mvp-config.d.ts.map +1 -1
  140. package/dist/mvp-config.js +174 -0
  141. package/dist/mvp-config.js.map +1 -1
  142. package/package.json +1 -1
  143. package/pd-cli/dist/commands/config-doctor.d.ts +17 -0
  144. package/pd-cli/dist/commands/config-doctor.d.ts.map +1 -0
  145. package/pd-cli/dist/commands/config-doctor.js +143 -0
  146. package/pd-cli/dist/commands/config-doctor.js.map +1 -0
  147. package/pd-cli/dist/commands/console.d.ts +18 -0
  148. package/pd-cli/dist/commands/console.d.ts.map +1 -1
  149. package/pd-cli/dist/commands/console.js +439 -0
  150. package/pd-cli/dist/commands/console.js.map +1 -1
  151. package/pd-cli/dist/commands/runtime-features.d.ts +23 -8
  152. package/pd-cli/dist/commands/runtime-features.d.ts.map +1 -1
  153. package/pd-cli/dist/commands/runtime-features.js +72 -31
  154. package/pd-cli/dist/commands/runtime-features.js.map +1 -1
  155. package/pd-cli/dist/index.d.ts +1 -1
  156. package/pd-cli/dist/index.js +83 -31
  157. package/pd-cli/dist/index.js.map +1 -1
  158. package/pd-cli/dist/services/config-doctor.d.ts +102 -0
  159. package/pd-cli/dist/services/config-doctor.d.ts.map +1 -0
  160. package/pd-cli/dist/services/config-doctor.js +426 -0
  161. package/pd-cli/dist/services/config-doctor.js.map +1 -0
  162. package/pd-cli/dist/services/console-launcher.d.ts +110 -0
  163. package/pd-cli/dist/services/console-launcher.d.ts.map +1 -0
  164. package/pd-cli/dist/services/console-launcher.js +282 -0
  165. package/pd-cli/dist/services/console-launcher.js.map +1 -0
  166. package/pd-cli/dist/services/pd-config-loader.d.ts +64 -0
  167. package/pd-cli/dist/services/pd-config-loader.d.ts.map +1 -0
  168. package/pd-cli/dist/services/pd-config-loader.js +156 -0
  169. package/pd-cli/dist/services/pd-config-loader.js.map +1 -0
  170. package/pd-cli/package.json +3 -1
  171. package/plugin/dist/core/event-log.d.ts +10 -0
  172. package/plugin/dist/core/event-log.js +85 -1
  173. package/plugin/dist/core/pd-config-loader.d.ts +96 -0
  174. package/plugin/dist/core/pd-config-loader.js +307 -0
  175. package/plugin/dist/core/runtime-v2-prompt-activation-reader.d.ts +4 -0
  176. package/plugin/dist/core/runtime-v2-prompt-activation-reader.js +12 -56
  177. package/plugin/dist/core/surface-guard.d.ts +12 -8
  178. package/plugin/dist/core/surface-guard.js +51 -2
  179. package/plugin/dist/hooks/gate.js +3 -0
  180. package/plugin/dist/index.d.ts +4 -0
  181. package/plugin/dist/index.js +8 -52
  182. package/plugin/dist/service/correction-observer-service.d.ts +8 -0
  183. package/plugin/dist/service/correction-observer-service.js +48 -29
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-launcher.d.ts","sourceRoot":"","sources":["../../src/services/console-launcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,282 @@
1
+ /**
2
+ * PD Console Launcher — seed-friendly Console startup with port detection,
3
+ * reuse, and browser opening.
4
+ *
5
+ * PRI-300 MVP UX:
6
+ * - Default port 3100; auto-falls back to next available if 3100 is busy
7
+ * - Reuses a running Console if one is already serving on the chosen port
8
+ * - Refuses non-loopback hosts (ERR-049 loopback safety)
9
+ * - Opens the system browser on success (skipped under --json)
10
+ * - Emits `reason` + `nextAction` for every failure
11
+ *
12
+ * Constraints (no daemonization, no public bind, no manual port):
13
+ * - Does NOT start a background service
14
+ * - Does NOT bind to non-loopback hosts
15
+ * - Does NOT require user-configured ports (uses 3100 then 3101..)
16
+ */
17
+ import * as net from 'net';
18
+ import * as http from 'http';
19
+ const DEFAULT_PORT = 3100;
20
+ const DEFAULT_HOST = '127.0.0.1';
21
+ const PORT_FALLBACK_LIMIT = 20; // try 3100..3119 before giving up
22
+ // ─── Loopback safety (ERR-049) ──────────────────────────────────────────────
23
+ /** Returns true if the host resolves to a loopback address. */
24
+ export function isLoopbackHost(host) {
25
+ if (host === 'localhost' || host === '127.0.0.1' || host === '::1' || host === '[::1]')
26
+ return true;
27
+ // Reject any IPv4 host that doesn't start with 127.
28
+ if (/^127\./.test(host))
29
+ return true;
30
+ return false;
31
+ }
32
+ /**
33
+ * Normalize loopback host for safe use in listen/http.request.
34
+ * - [::1] → ::1 (strip brackets; Node net/http don't want brackets in host field)
35
+ * - localhost, 127.x.x.x, ::1 → pass through
36
+ * - non-loopback → return as-is (caller must reject via isLoopbackHost first)
37
+ */
38
+ export function normalizeLoopbackHost(host) {
39
+ if (host === '[::1]')
40
+ return '::1';
41
+ return host;
42
+ }
43
+ /**
44
+ * Build a valid Console URL from a normalized loopback host and port.
45
+ * - IPv6 ::1 → http://[::1]:port (brackets required for valid URL)
46
+ * - IPv4/localhost → http://host:port (unchanged)
47
+ */
48
+ export function buildConsoleUrl(host, port) {
49
+ if (host === '::1')
50
+ return `http://[::1]:${port}`;
51
+ return `http://${host}:${port}`;
52
+ }
53
+ // ─── Port detection (ERR-022: bounded) ───────────────────────────────────────
54
+ /** Returns true if the port on the given host accepts a TCP connection. */
55
+ export async function isPortInUse(host, port, timeoutMs = 800) {
56
+ if (Object.hasOwn(globalThis, '__mockIsPortInUse')) {
57
+ const mock = Reflect.get(globalThis, '__mockIsPortInUse');
58
+ return mock(host, port, timeoutMs);
59
+ }
60
+ return new Promise((resolve) => {
61
+ const socket = new net.Socket();
62
+ let settled = false;
63
+ const done = (inUse) => {
64
+ if (settled)
65
+ return;
66
+ settled = true;
67
+ try {
68
+ socket.destroy();
69
+ }
70
+ catch { /* ignore */ }
71
+ resolve(inUse);
72
+ };
73
+ socket.setTimeout(timeoutMs);
74
+ socket.once('connect', () => done(true));
75
+ socket.once('timeout', () => done(false));
76
+ socket.once('error', (err) => {
77
+ // ECONNREFUSED → port is free; EHOSTUNREACH/ENETUNREACH → also free.
78
+ if (err.code === 'ECONNREFUSED' || err.code === 'EHOSTUNREACH' || err.code === 'ENETUNREACH') {
79
+ done(false);
80
+ }
81
+ else {
82
+ done(false);
83
+ }
84
+ });
85
+ try {
86
+ socket.connect(port, host);
87
+ }
88
+ catch {
89
+ done(false);
90
+ }
91
+ });
92
+ }
93
+ /** Probe a port to see if it serves a healthy PD Console. */
94
+ export async function probeConsoleHealth(opts) {
95
+ const { host, port, timeoutMs = 1500, token } = opts;
96
+ if (Object.hasOwn(globalThis, '__mockProbeConsoleHealth')) {
97
+ const mock = Reflect.get(globalThis, '__mockProbeConsoleHealth');
98
+ return mock(opts);
99
+ }
100
+ return new Promise((resolve) => {
101
+ const headers = {};
102
+ if (token) {
103
+ headers.Authorization = `Bearer ${token}`;
104
+ }
105
+ const req = http.request({ host, port, path: '/api/health', method: 'GET', timeout: timeoutMs, headers }, (res) => {
106
+ // 401 means auth required — treat as unhealthy, not a generic error
107
+ if (res.statusCode === 401) {
108
+ resolve({ healthy: false, reason: 'console health endpoint returned 401 (unauthorized) — check PD_CONSOLE_TOKEN' });
109
+ return;
110
+ }
111
+ if (res.statusCode !== 200) {
112
+ resolve({ healthy: false, reason: `console health endpoint returned status ${res.statusCode ?? 'no-status'}` });
113
+ return;
114
+ }
115
+ let data = '';
116
+ res.on('data', (chunk) => {
117
+ data += chunk;
118
+ });
119
+ res.on('end', () => {
120
+ try {
121
+ const body = JSON.parse(data);
122
+ if (body && typeof body === 'object') {
123
+ const isHealthy = (Object.hasOwn(body, 'healthy') && Reflect.get(body, 'healthy') === true) ||
124
+ (Object.hasOwn(body, 'success') && Reflect.get(body, 'success') === true);
125
+ if (isHealthy) {
126
+ resolve({ healthy: true });
127
+ }
128
+ else {
129
+ resolve({ healthy: false, reason: 'console health JSON was missing healthy/success markers' });
130
+ }
131
+ }
132
+ else {
133
+ resolve({ healthy: false, reason: 'console health endpoint returned non-object JSON' });
134
+ }
135
+ }
136
+ catch (err) {
137
+ resolve({ healthy: false, reason: `failed to parse console health JSON: ${err instanceof Error ? err.message : String(err)}` });
138
+ }
139
+ });
140
+ });
141
+ req.on('timeout', () => {
142
+ req.destroy();
143
+ resolve({ healthy: false, reason: 'console health probe timed out' });
144
+ });
145
+ req.on('error', (err) => {
146
+ resolve({ healthy: false, reason: `console health probe error: ${err.message}` });
147
+ });
148
+ req.end();
149
+ });
150
+ }
151
+ /** Find the first available port in [preferred..preferred+limit]. */
152
+ export async function findAvailablePort(host, preferred, limit = PORT_FALLBACK_LIMIT) {
153
+ for (let i = 0; i < limit; i++) {
154
+ const candidate = preferred + i;
155
+ if (candidate > 65535 || candidate < 1) {
156
+ break;
157
+ }
158
+ if (!(await isPortInUse(host, candidate)))
159
+ return candidate;
160
+ }
161
+ return null;
162
+ }
163
+ // ─── Browser opener (best-effort, no throw) ──────────────────────────────────
164
+ /**
165
+ * Open the system browser. Best-effort — failures are reported but do not
166
+ * crash the launcher.
167
+ */
168
+ export async function openBrowser(url) {
169
+ const { spawn } = await import('child_process');
170
+ const { platform } = process;
171
+ let cmd;
172
+ let args;
173
+ if (platform === 'win32') {
174
+ cmd = 'cmd';
175
+ args = ['/c', 'start', '""', url];
176
+ }
177
+ else if (platform === 'darwin') {
178
+ cmd = 'open';
179
+ args = [url];
180
+ }
181
+ else {
182
+ cmd = 'xdg-open';
183
+ args = [url];
184
+ }
185
+ return new Promise((resolve) => {
186
+ try {
187
+ const child = spawn(cmd, args, { detached: true, stdio: 'ignore' });
188
+ let resolved = false;
189
+ const timer = setTimeout(() => {
190
+ if (!resolved) {
191
+ resolved = true;
192
+ child.unref();
193
+ resolve({ opened: true });
194
+ }
195
+ }, 100);
196
+ child.on('error', (err) => {
197
+ if (!resolved) {
198
+ resolved = true;
199
+ clearTimeout(timer);
200
+ resolve({
201
+ opened: false,
202
+ reason: `Failed to spawn browser process: ${err.message}`,
203
+ nextAction: `Ensure your system has '${cmd}' available in PATH or open the URL manually.`
204
+ });
205
+ }
206
+ });
207
+ }
208
+ catch (err) {
209
+ resolve({
210
+ opened: false,
211
+ reason: err instanceof Error ? err.message : String(err),
212
+ nextAction: 'Ensure child_process is available or open the URL manually.'
213
+ });
214
+ }
215
+ });
216
+ }
217
+ export async function planConsoleLaunch(input) {
218
+ if (Object.hasOwn(globalThis, '__mockPlanConsoleLaunch')) {
219
+ const mock = Reflect.get(globalThis, '__mockPlanConsoleLaunch');
220
+ return mock(input);
221
+ }
222
+ const { token } = input;
223
+ const rawHost = input.host ?? DEFAULT_HOST;
224
+ const host = normalizeLoopbackHost(rawHost);
225
+ const preferredPort = input.preferredPort ?? DEFAULT_PORT;
226
+ if (!isLoopbackHost(host)) {
227
+ return {
228
+ status: 'refused',
229
+ url: '',
230
+ port: preferredPort,
231
+ host,
232
+ reused: false,
233
+ reason: `Non-loopback host refused: '${host}'. Only 127.0.0.1, ::1, and 'localhost' are allowed.`,
234
+ nextAction: 'Use the default loopback host (do not pass --host 0.0.0.0 or any LAN address).',
235
+ };
236
+ }
237
+ // Step 1: Is there already a healthy console on the preferred port?
238
+ const health = await probeConsoleHealth({ host, port: preferredPort, token });
239
+ if (health.healthy) {
240
+ return {
241
+ status: 'reused',
242
+ url: buildConsoleUrl(host, preferredPort),
243
+ port: preferredPort,
244
+ host,
245
+ reused: true,
246
+ };
247
+ }
248
+ // Step 2: Is the preferred port simply occupied by something else?
249
+ const preferredInUse = await isPortInUse(host, preferredPort);
250
+ if (preferredInUse) {
251
+ // Try to find a free port in the fallback range.
252
+ const freePort = await findAvailablePort(host, preferredPort + 1, PORT_FALLBACK_LIMIT - 1);
253
+ if (freePort === null) {
254
+ return {
255
+ status: 'failed',
256
+ url: '',
257
+ port: preferredPort,
258
+ host,
259
+ reused: false,
260
+ reason: `No available port in ${preferredPort + 1}..${preferredPort + PORT_FALLBACK_LIMIT}`,
261
+ nextAction: `Stop the process holding port ${preferredPort} (e.g., another Console instance), or free a port in the fallback range.`,
262
+ };
263
+ }
264
+ return {
265
+ status: 'started',
266
+ url: buildConsoleUrl(host, freePort),
267
+ port: freePort,
268
+ host,
269
+ reused: false,
270
+ reason: `Preferred port ${preferredPort} was busy; using ${freePort} instead`,
271
+ };
272
+ }
273
+ // Preferred port is free → bind there.
274
+ return {
275
+ status: 'started',
276
+ url: buildConsoleUrl(host, preferredPort),
277
+ port: preferredPort,
278
+ host,
279
+ reused: false,
280
+ };
281
+ }
282
+ //# sourceMappingURL=console-launcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-launcher.js","sourceRoot":"","sources":["../../src/services/console-launcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * PD Config Loader — PRI-305
3
+ *
4
+ * I/O boundary: reads `.pd/config.yaml`, validates via core, computes effective config.
5
+ * This replaces the old `feature-flag-loader.ts` and `workflows.yaml` reading
6
+ * for CLI production paths.
7
+ *
8
+ * ADR-0016: PD owns exactly one user config file.
9
+ * - Missing config → defaults with nextAction
10
+ * - Malformed config → fail loud with errors and nextAction
11
+ * - No secrets in output
12
+ */
13
+ import type { EffectivePdConfig, RedactedPdConfigSummary, FeatureFlagsResult } from '@principles/core/runtime-v2';
14
+ export declare const PD_CONFIG_DIR = ".pd";
15
+ export declare const PD_CONFIG_FILENAME = "config.yaml";
16
+ export type ConfigSource = 'defaults' | 'user_config' | 'malformed';
17
+ export interface PdConfigLoadResultOk {
18
+ ok: true;
19
+ effective: EffectivePdConfig;
20
+ source: ConfigSource;
21
+ configPath: string;
22
+ /** Warnings from config resolution (not errors) */
23
+ warnings: string[];
24
+ /** If legacy files were detected */
25
+ legacyFilesDetected: string[];
26
+ }
27
+ export interface PdConfigLoadResultErr {
28
+ ok: false;
29
+ source: 'malformed';
30
+ configPath: string;
31
+ errors: {
32
+ path: string;
33
+ reason: string;
34
+ nextAction: string;
35
+ }[];
36
+ /** Fallback defaults are still available */
37
+ defaults: EffectivePdConfig;
38
+ /** Warnings from config resolution */
39
+ warnings: string[];
40
+ legacyFilesDetected: string[];
41
+ }
42
+ export type PdConfigLoadResult = PdConfigLoadResultOk | PdConfigLoadResultErr;
43
+ export declare function getPdConfigPath(workspaceDir: string): string;
44
+ /**
45
+ * Load and validate `.pd/config.yaml` from the workspace.
46
+ *
47
+ * - Missing file → returns defaults with source='defaults'
48
+ * - Malformed file → returns error result with defaults fallback
49
+ * - Valid file → returns effective config with source='user_config'
50
+ *
51
+ * Never throws on malformed input. Always provides a usable fallback.
52
+ */
53
+ export declare function loadPdConfig(workspaceDir: string): PdConfigLoadResult;
54
+ /**
55
+ * Compute feature flags from the loaded PD config.
56
+ * Works with both ok and error results (uses defaults for errors).
57
+ */
58
+ export declare function computeFlagsFromLoadResult(result: PdConfigLoadResult): FeatureFlagsResult;
59
+ /**
60
+ * Produce a redacted summary of the PD config for CLI/Console display.
61
+ * Never includes token/API key values or raw provider objects.
62
+ */
63
+ export declare function redactLoadResult(result: PdConfigLoadResult): RedactedPdConfigSummary;
64
+ //# sourceMappingURL=pd-config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pd-config-loader.d.ts","sourceRoot":"","sources":["../../src/services/pd-config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,OAAO,KAAK,EACV,iBAAiB,EAEjB,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,6BAA6B,CAAC;AAIrC,eAAO,MAAM,aAAa,QAAQ,CAAC;AACnC,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAIhD,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,aAAa,GAAG,WAAW,CAAC;AAEpE,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,IAAI,CAAC;IACT,SAAS,EAAE,iBAAiB,CAAC;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,oCAAoC;IACpC,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/D,4CAA4C;IAC5C,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,sCAAsC;IACtC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,MAAM,kBAAkB,GAAG,oBAAoB,GAAG,qBAAqB,CAAC;AAI9E,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE5D;AAoBD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,kBAAkB,CA8FrE;AAID;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,kBAAkB,GAAG,kBAAkB,CAGzF;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,GAAG,uBAAuB,CAGpF"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * PD Config Loader — PRI-305
3
+ *
4
+ * I/O boundary: reads `.pd/config.yaml`, validates via core, computes effective config.
5
+ * This replaces the old `feature-flag-loader.ts` and `workflows.yaml` reading
6
+ * for CLI production paths.
7
+ *
8
+ * ADR-0016: PD owns exactly one user config file.
9
+ * - Missing config → defaults with nextAction
10
+ * - Malformed config → fail loud with errors and nextAction
11
+ * - No secrets in output
12
+ */
13
+ import * as fs from 'fs';
14
+ import * as path from 'path';
15
+ import yaml from 'js-yaml';
16
+ import { validatePdConfig, computeEffectivePdConfig, computeFeatureFlagsFromConfig, redactPdConfig, } from '@principles/core/runtime-v2';
17
+ // ── Constants ────────────────────────────────────────────────────────────────
18
+ export const PD_CONFIG_DIR = '.pd';
19
+ export const PD_CONFIG_FILENAME = 'config.yaml';
20
+ // ── Config Path ──────────────────────────────────────────────────────────────
21
+ export function getPdConfigPath(workspaceDir) {
22
+ return path.join(workspaceDir, PD_CONFIG_DIR, PD_CONFIG_FILENAME);
23
+ }
24
+ // ── Legacy File Detection ────────────────────────────────────────────────────
25
+ function detectLegacyFiles(workspaceDir) {
26
+ const detected = [];
27
+ const legacyPaths = [
28
+ path.join(workspaceDir, PD_CONFIG_DIR, 'feature-flags.yaml'),
29
+ path.join(workspaceDir, '.state', 'workflows.yaml'),
30
+ ];
31
+ for (const p of legacyPaths) {
32
+ if (fs.existsSync(p)) {
33
+ detected.push(p);
34
+ }
35
+ }
36
+ return detected;
37
+ }
38
+ // ── Load PD Config ───────────────────────────────────────────────────────────
39
+ /**
40
+ * Load and validate `.pd/config.yaml` from the workspace.
41
+ *
42
+ * - Missing file → returns defaults with source='defaults'
43
+ * - Malformed file → returns error result with defaults fallback
44
+ * - Valid file → returns effective config with source='user_config'
45
+ *
46
+ * Never throws on malformed input. Always provides a usable fallback.
47
+ */
48
+ export function loadPdConfig(workspaceDir) {
49
+ const configPath = getPdConfigPath(workspaceDir);
50
+ const legacyFilesDetected = detectLegacyFiles(workspaceDir);
51
+ // 1) Config file missing → use defaults
52
+ if (!fs.existsSync(configPath)) {
53
+ const effective = computeEffectivePdConfig(null);
54
+ return {
55
+ ok: true,
56
+ effective,
57
+ source: 'defaults',
58
+ configPath,
59
+ warnings: [
60
+ ...effective.warnings,
61
+ ...(legacyFilesDetected.length > 0
62
+ ? [`Legacy config files detected (${legacyFilesDetected.length}): ${legacyFilesDetected.join(', ')}. PD now uses .pd/config.yaml.`]
63
+ : []),
64
+ ],
65
+ legacyFilesDetected,
66
+ };
67
+ }
68
+ // 2) Read the file
69
+ let raw;
70
+ try {
71
+ raw = fs.readFileSync(configPath, 'utf8');
72
+ }
73
+ catch (err) {
74
+ const message = err instanceof Error ? err.message : String(err);
75
+ const effective = computeEffectivePdConfig(null);
76
+ return {
77
+ ok: false,
78
+ source: 'malformed',
79
+ configPath,
80
+ errors: [{ path: '', reason: `Failed to read .pd/config.yaml: ${message}`, nextAction: 'Check file permissions for .pd/config.yaml' }],
81
+ warnings: [],
82
+ defaults: effective,
83
+ legacyFilesDetected,
84
+ };
85
+ }
86
+ // 3) Parse YAML — treat as unknown (ERR-001)
87
+ let parsed;
88
+ try {
89
+ parsed = yaml.load(raw, { schema: yaml.JSON_SCHEMA });
90
+ }
91
+ catch (err) {
92
+ const message = err instanceof Error ? err.message : String(err);
93
+ const effective = computeEffectivePdConfig(null);
94
+ return {
95
+ ok: false,
96
+ source: 'malformed',
97
+ configPath,
98
+ errors: [{ path: '', reason: `YAML parse error in .pd/config.yaml: ${message}`, nextAction: 'Fix YAML syntax in .pd/config.yaml' }],
99
+ warnings: [],
100
+ defaults: effective,
101
+ legacyFilesDetected,
102
+ };
103
+ }
104
+ // 4) Validate via core (ERR-001, ERR-005: no `as` bypasses)
105
+ const validationResult = validatePdConfig(parsed);
106
+ if (!validationResult.ok) {
107
+ const effective = computeEffectivePdConfig(null);
108
+ return {
109
+ ok: false,
110
+ source: 'malformed',
111
+ configPath,
112
+ errors: validationResult.errors.map(e => ({
113
+ path: e.path,
114
+ reason: e.reason,
115
+ nextAction: e.nextAction,
116
+ })),
117
+ warnings: [],
118
+ defaults: effective,
119
+ legacyFilesDetected,
120
+ };
121
+ }
122
+ // 5) Compute effective config
123
+ const effective = computeEffectivePdConfig(validationResult.value);
124
+ return {
125
+ ok: true,
126
+ effective,
127
+ source: 'user_config',
128
+ configPath,
129
+ warnings: [
130
+ ...effective.warnings,
131
+ ...(legacyFilesDetected.length > 0
132
+ ? [`Legacy config files detected (${legacyFilesDetected.length}): ${legacyFilesDetected.join(', ')}. PD now uses .pd/config.yaml.`]
133
+ : []),
134
+ ],
135
+ legacyFilesDetected,
136
+ };
137
+ }
138
+ // ── Feature Flags from Config ────────────────────────────────────────────────
139
+ /**
140
+ * Compute feature flags from the loaded PD config.
141
+ * Works with both ok and error results (uses defaults for errors).
142
+ */
143
+ export function computeFlagsFromLoadResult(result) {
144
+ const effective = result.ok ? result.effective : result.defaults;
145
+ return computeFeatureFlagsFromConfig(effective);
146
+ }
147
+ // ── Redacted Summary from Config ─────────────────────────────────────────────
148
+ /**
149
+ * Produce a redacted summary of the PD config for CLI/Console display.
150
+ * Never includes token/API key values or raw provider objects.
151
+ */
152
+ export function redactLoadResult(result) {
153
+ const effective = result.ok ? result.effective : result.defaults;
154
+ return redactPdConfig(effective);
155
+ }
156
+ //# sourceMappingURL=pd-config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pd-config-loader.js","sourceRoot":"","sources":["../../src/services/pd-config-loader.ts"],"names":[],"mappings":"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"}
@@ -15,9 +15,11 @@
15
15
  "dependencies": {
16
16
  "@principles/core": "file:../core",
17
17
  "commander": "^12.0.0",
18
- "js-yaml": "^4.1.1"
18
+ "js-yaml": "^4.1.1",
19
+ "better-sqlite3": "^12.9.0"
19
20
  },
20
21
  "devDependencies": {
22
+ "@types/better-sqlite3": "^7.6.13",
21
23
  "@types/js-yaml": "^4.0.9",
22
24
  "@types/node": "^25.6.2",
23
25
  "typescript": "^6.0.3",
@@ -43,6 +43,16 @@ export declare class EventLog {
43
43
  recordRuleHostAutoCorrectProposed(data: RuleHostAutoCorrectProposedEventData): void;
44
44
  recordRuleHostAutoCorrectApplied(data: RuleHostAutoCorrectAppliedEventData): void;
45
45
  recordRuntimeV2ActivationsInjected(data: RuntimeV2PromptActivationsInjectedEventData): void;
46
+ /**
47
+ * Redact telemetry-sensitive string values in event data before persistence.
48
+ * Applies redactTelemetryString to known high-risk fields (filePath, command,
49
+ * reason, args, new_string, old_string, text, paramsSummary values) and to all
50
+ * string values in tool_call/rulehost_* data as a safety net.
51
+ *
52
+ * ERR-002: never throws; returns data unchanged on error.
53
+ * ERR-045/046: covers composite command strings, Authorization headers, env vars.
54
+ */
55
+ private redactEventData;
46
56
  private record;
47
57
  private formatDate;
48
58
  private loadStats;