@principles/pd-cli 1.144.0 → 1.145.1

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.
@@ -0,0 +1,20 @@
1
+ interface CodexIngestCatchUpOptions {
2
+ workspace?: string;
3
+ json?: boolean;
4
+ maxRollouts?: number;
5
+ }
6
+ export interface CodexIngestCatchUpReport {
7
+ generatedAt: string;
8
+ host: 'codex';
9
+ workspace: string;
10
+ status: 'ok' | 'degraded' | 'skipped';
11
+ reason?: string;
12
+ nextAction?: string;
13
+ rolloutsProcessed: number;
14
+ remainingLagRollouts: string[];
15
+ unexaminedRollouts: string[];
16
+ degradations: string[];
17
+ }
18
+ export declare function handleCodexIngestCatchUp(options: CodexIngestCatchUpOptions): Promise<void>;
19
+ export {};
20
+ //# sourceMappingURL=codex-ingest-catchup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-ingest-catchup.d.ts","sourceRoot":"","sources":["../../src/commands/codex-ingest-catchup.ts"],"names":[],"mappings":"AAwBA,UAAU,yBAAyB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,SAAS,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAyCD,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BhG"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * pd codex ingest catch-up command implementation (Codex Governance Closure
3
+ * Slice C, PRI-624; SPEC §13/§15 recovery command).
4
+ *
5
+ * Performs ONE bounded non-destructive catch-up pass over the workspace's
6
+ * durable Codex checkpoints: resolves each previously-authenticated rollout
7
+ * by exact uuid, re-authorizes the transcript path, and resumes the bounded
8
+ * incremental ingestion from the checkpoint — then feeds any admission
9
+ * candidates through the same Slice B admission/continuation pass the hook
10
+ * uses. Flag-off (`codex_conversation_ingestion=false`) performs ZERO
11
+ * transcript filesystem I/O and reports a structured skip.
12
+ *
13
+ * This is the manual-mode counterpart of the Companion worker's catch-up
14
+ * step (worker cycle step 2); it creates no LLM execution.
15
+ *
16
+ * CLI gate compliance:
17
+ * - cli-1: --json outputs exactly one parseable JSON object on stdout.
18
+ * - cli-2: exit paths stop execution.
19
+ * - cli-5/6: skipped/degraded results carry reason + nextAction; nothing is
20
+ * mutated on failure (the ingestion seam is transactional per rollout).
21
+ */
22
+ import { resolveWorkspaceDir } from '../resolve-workspace.js';
23
+ import { catchUpCodexIngestion } from '@principles/codex-adapter';
24
+ function buildReport(generatedAt, workspace, result) {
25
+ if (result.status === 'skipped') {
26
+ return {
27
+ generatedAt,
28
+ host: 'codex',
29
+ workspace,
30
+ status: 'skipped',
31
+ reason: result.reason,
32
+ nextAction: result.nextAction,
33
+ rolloutsProcessed: 0,
34
+ remainingLagRollouts: [],
35
+ unexaminedRollouts: [],
36
+ degradations: [],
37
+ };
38
+ }
39
+ const degradations = [];
40
+ for (const rollout of result.rollouts) {
41
+ for (const degradation of rollout.admissionDegradations) {
42
+ degradations.push(`${rollout.rolloutIdentity}: ${degradation.reason}`);
43
+ }
44
+ if (rollout.outcome.status === 'degraded') {
45
+ degradations.push(`${rollout.rolloutIdentity}: ${rollout.outcome.reason}`);
46
+ }
47
+ }
48
+ return {
49
+ generatedAt,
50
+ host: 'codex',
51
+ workspace,
52
+ status: result.status,
53
+ rolloutsProcessed: result.rollouts.length,
54
+ remainingLagRollouts: [...result.remainingLagRollouts],
55
+ unexaminedRollouts: [...result.unexaminedRollouts],
56
+ degradations: degradations.slice(0, 10),
57
+ ...(degradations.length > 0 && result.status === 'degraded'
58
+ ? { reason: 'one or more rollouts degraded; committed observations remain durable', nextAction: 'Inspect the per-rollout degradations; re-run catch-up after fixing the underlying condition (Slice D adds the audited quarantine command).' }
59
+ : {}),
60
+ };
61
+ }
62
+ export async function handleCodexIngestCatchUp(options) {
63
+ const generatedAt = new Date().toISOString();
64
+ const workspace = resolveWorkspaceDir(options.workspace);
65
+ const result = await catchUpCodexIngestion({
66
+ workspaceDir: workspace,
67
+ env: { CODEX_HOME: process.env.CODEX_HOME },
68
+ ...(typeof options.maxRollouts === 'number' ? { maxRollouts: options.maxRollouts } : {}),
69
+ });
70
+ const report = buildReport(generatedAt, workspace, result);
71
+ if (options.json) {
72
+ console.log(JSON.stringify(report));
73
+ if (report.status === 'degraded')
74
+ process.exitCode = 1;
75
+ return;
76
+ }
77
+ const lines = [
78
+ `Codex ingestion catch-up (${workspace})`,
79
+ ` status: ${report.status}`,
80
+ ` rollouts processed: ${report.rolloutsProcessed}`,
81
+ ` remaining lag: ${report.remainingLagRollouts.length}`,
82
+ ` unexamined (bound): ${report.unexaminedRollouts.length}`,
83
+ ];
84
+ for (const degradation of report.degradations) {
85
+ lines.push(` degradation: ${degradation}`);
86
+ }
87
+ if (report.reason !== undefined)
88
+ lines.push(` reason: ${report.reason}`);
89
+ if (report.nextAction !== undefined)
90
+ lines.push(` next action: ${report.nextAction}`);
91
+ console.log(lines.join('\n'));
92
+ if (report.status === 'degraded')
93
+ process.exitCode = 1;
94
+ }
95
+ //# sourceMappingURL=codex-ingest-catchup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-ingest-catchup.js","sourceRoot":"","sources":["../../src/commands/codex-ingest-catchup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ interface CodexWorkerOptions {
2
+ workspace?: string;
3
+ json?: boolean;
4
+ once?: boolean;
5
+ intervalMs?: number;
6
+ status?: boolean;
7
+ }
8
+ export interface CodexWorkerStatusReport {
9
+ generatedAt: string;
10
+ host: 'codex';
11
+ workspace: string;
12
+ mode: 'ready' | 'manual_action_required' | 'paused' | 'degraded';
13
+ registeredInInstallManifest: boolean;
14
+ reason?: string;
15
+ nextAction?: string;
16
+ }
17
+ export declare function handleCodexWorker(options: CodexWorkerOptions): Promise<void>;
18
+ export {};
19
+ /** SPEC §15 worker mode, evaluated without executing anything. */
20
+ //# sourceMappingURL=codex-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-worker.d.ts","sourceRoot":"","sources":["../../src/commands/codex-worker.ts"],"names":[],"mappings":"AA6BA,UAAU,kBAAkB;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,GAAG,wBAAwB,GAAG,QAAQ,GAAG,UAAU,CAAC;IACjE,2BAA2B,EAAE,OAAO,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA6ED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDlF;;AAED,kEAAkE"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * pd codex worker command implementation (Codex Governance Closure Slice C,
3
+ * PRI-624; SPEC §13/§15; ADR-0020 §11.1).
4
+ *
5
+ * Runs the Workspace-scoped worker cycle — catch-up → reconciliation → one
6
+ * Diagnostician execution → one bounded downstream consumer cycle — either
7
+ * once (manual / Companion-supervised restart mode) or continuously.
8
+ *
9
+ * `status` answers the SPEC §15 worker-mode question without executing
10
+ * anything: `manual_action_required` means no Companion-registered worker
11
+ * serves this workspace (it is not in the install manifest) and the manual
12
+ * commands below are the recovery path.
13
+ *
14
+ * CLI gate compliance:
15
+ * - cli-1: --json is restricted to the single-output forms (--once / --status)
16
+ * so stdout is exactly one parseable JSON object; continuous mode streams
17
+ * human-readable reports instead (review P2).
18
+ * - cli-2: exit paths stop execution.
19
+ * - cli-6: paused/degraded modes carry reason + nextAction.
20
+ */
21
+ import fs from 'node:fs';
22
+ import os from 'node:os';
23
+ import path from 'node:path';
24
+ import { resolveWorkspaceDir } from '../resolve-workspace.js';
25
+ import { runCodexWorkspaceWorkerCycle } from '@principles/codex-adapter';
26
+ import { getInstallLayoutPaths, parseInstallManifest } from '@principles/install-layout';
27
+ const DEFAULT_INTERVAL_MS = 120_000;
28
+ async function printStatusReport(workspace, json) {
29
+ const generatedAt = new Date().toISOString();
30
+ const paths = getInstallLayoutPaths(os.homedir());
31
+ let registered = false;
32
+ let manifestError;
33
+ try {
34
+ const raw = JSON.parse(fs.readFileSync(paths.manifest, 'utf8'));
35
+ const parsed = parseInstallManifest(raw);
36
+ if (parsed.manifest !== undefined) {
37
+ registered = parsed.manifest.workspaces?.some((entry) => path.resolve(entry) === path.resolve(workspace)) ?? false;
38
+ }
39
+ else {
40
+ manifestError = parsed.error;
41
+ }
42
+ }
43
+ catch {
44
+ manifestError = 'install_manifest_unreadable';
45
+ }
46
+ // The status scan itself delegates mode computation to the cycle module's
47
+ // flag/config semantics by running a paused-compatible evaluation: a real
48
+ // cycle is NOT run (no execution, no lease, no transcript I/O).
49
+ const { computeCodexWorkerStatusMode } = await import('@principles/codex-adapter');
50
+ const evaluation = computeCodexWorkerStatusMode({ workspaceDir: workspace, registeredInInstallManifest: registered });
51
+ const report = {
52
+ generatedAt,
53
+ host: 'codex',
54
+ workspace,
55
+ mode: evaluation.mode,
56
+ registeredInInstallManifest: registered,
57
+ ...(evaluation.reason !== undefined ? { reason: evaluation.reason } : {}),
58
+ ...(evaluation.nextAction !== undefined ? { nextAction: evaluation.nextAction } : {}),
59
+ ...(manifestError !== undefined ? { reason: `${evaluation.reason ?? manifestError}` } : {}),
60
+ };
61
+ if (json) {
62
+ console.log(JSON.stringify(report));
63
+ return;
64
+ }
65
+ const lines = [
66
+ `Codex workspace worker status (${workspace})`,
67
+ ` mode: ${report.mode}`,
68
+ ` registered in install manifest: ${registered}`,
69
+ ];
70
+ if (report.reason !== undefined)
71
+ lines.push(` reason: ${report.reason}`);
72
+ if (report.nextAction !== undefined)
73
+ lines.push(` next action: ${report.nextAction}`);
74
+ console.log(lines.join('\n'));
75
+ if (report.mode === 'degraded')
76
+ process.exitCode = 1;
77
+ }
78
+ function printCycleReport(result, json) {
79
+ if (json) {
80
+ console.log(JSON.stringify(result));
81
+ return;
82
+ }
83
+ const lines = [
84
+ `Codex workspace worker (${result.workspaceDir})`,
85
+ ` mode: ${result.mode}${result.reason !== undefined ? ` (${result.reason})` : ''}`,
86
+ ];
87
+ if (result.report !== undefined) {
88
+ const { catchUp } = result.report;
89
+ const catchUpSummary = catchUp.status === 'skipped' ? `skipped (${catchUp.reason})` : `${catchUp.status} — processed=${catchUp.rollouts.length} lag=${catchUp.remainingLagRollouts.length}`;
90
+ lines.push(` catch-up: ${catchUpSummary}`);
91
+ lines.push(` reconcile: ok=${result.report.reconcile.ok} ensured=${result.report.reconcile.tasksEnsured} linksRepaired=${result.report.reconcile.linksRepaired}`);
92
+ if (result.report.diagnostician !== null) {
93
+ lines.push(` diagnostician: ${result.report.diagnostician.status} (${result.report.diagnostician.taskId})`);
94
+ }
95
+ else {
96
+ lines.push(' diagnostician: none pending');
97
+ }
98
+ if (result.report.downstream !== null) {
99
+ lines.push(` downstream: ran=${result.report.downstream.ran}${result.report.downstream.taskKind !== undefined ? ` kind=${result.report.downstream.taskKind}` : ''}${result.report.downstream.skipReason !== undefined ? ` skip=${result.report.downstream.skipReason}` : ''}`);
100
+ }
101
+ }
102
+ if (result.nextAction !== undefined)
103
+ lines.push(` next action: ${result.nextAction}`);
104
+ console.log(lines.join('\n'));
105
+ }
106
+ export async function handleCodexWorker(options) {
107
+ // cli-1: continuous mode streams one report per cycle — that is NOT one
108
+ // parseable JSON document. --json is only valid for the single-output
109
+ // forms (--once / --status), enforced here (review P2).
110
+ if (options.json === true && options.once !== true && options.status !== true) {
111
+ const error = {
112
+ generatedAt: new Date().toISOString(),
113
+ host: 'codex',
114
+ error: 'cli_contract',
115
+ reason: 'json_without_once_or_status',
116
+ nextAction: 'Use --json with --once (single cycle) or --status (no-op scan); continuous mode streams human-readable reports instead.',
117
+ };
118
+ console.log(JSON.stringify(error));
119
+ process.exitCode = 1;
120
+ return;
121
+ }
122
+ const workspace = resolveWorkspaceDir(options.workspace);
123
+ if (options.status === true) {
124
+ await printStatusReport(workspace, options.json === true);
125
+ return;
126
+ }
127
+ if (options.once === true) {
128
+ const result = await runCodexWorkspaceWorkerCycle({ workspaceDir: workspace, env: { CODEX_HOME: process.env.CODEX_HOME } });
129
+ printCycleReport(result, options.json === true);
130
+ if (result.mode === 'degraded')
131
+ process.exitCode = 1;
132
+ return;
133
+ }
134
+ const interval = typeof options.intervalMs === 'number' && options.intervalMs >= 1000 ? options.intervalMs : DEFAULT_INTERVAL_MS;
135
+ let stopped = false;
136
+ const onSignal = () => {
137
+ stopped = true;
138
+ };
139
+ process.on('SIGINT', onSignal);
140
+ process.on('SIGTERM', onSignal);
141
+ try {
142
+ while (!stopped) {
143
+ const result = await runCodexWorkspaceWorkerCycle({ workspaceDir: workspace, env: { CODEX_HOME: process.env.CODEX_HOME } });
144
+ printCycleReport(result, false);
145
+ if (stopped)
146
+ break;
147
+ await new Promise((resolve) => setTimeout(resolve, interval));
148
+ }
149
+ }
150
+ finally {
151
+ process.off('SIGINT', onSignal);
152
+ process.off('SIGTERM', onSignal);
153
+ }
154
+ }
155
+ /** SPEC §15 worker mode, evaluated without executing anything. */
156
+ //# sourceMappingURL=codex-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-worker.js","sourceRoot":"","sources":["../../src/commands/codex-worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * pd pain list command — PRI-640 (Governance Signal Host Attribution v0.1)
3
+ *
4
+ * Read-only: lists canonical pain_events rows from trajectory.db with their
5
+ * host attribution. `--host` filters by openclaw / codex / unknown.
6
+ *
7
+ * Usage:
8
+ * pd pain list [--workspace <path>] [--limit N] [--host openclaw|codex|unknown] [--json]
9
+ *
10
+ * Host semantics (SPEC §6/§12): host_kind is observability metadata only.
11
+ * NULL (legacy / manual / unprovable) is reported as `unknown` — never guessed.
12
+ * On a pre-PRI-640 database without the host_kind column every row reports
13
+ * `unknown` and a `host_kind_column_missing` warning is emitted (rc-9).
14
+ */
15
+ export type PainListHostFilter = 'openclaw' | 'codex' | 'unknown';
16
+ export interface PainListOptions {
17
+ workspace?: string;
18
+ limit?: number;
19
+ host?: string;
20
+ json?: boolean;
21
+ }
22
+ export interface PainListEntry {
23
+ /** Canonical pain identity; `row:<id>` when the legacy row has none. */
24
+ painId: string;
25
+ source: string;
26
+ /** 'openclaw' | 'codex' | 'unknown' — unknown covers NULL/unprovable. */
27
+ host: PainListHostFilter | 'unknown';
28
+ score: number;
29
+ severity: string | null;
30
+ createdAt: string;
31
+ runtimeTaskId: string | null;
32
+ }
33
+ export interface PainListResult {
34
+ count: number;
35
+ pains: PainListEntry[];
36
+ workspace: string;
37
+ hostFilter: PainListHostFilter | null;
38
+ warnings: string[];
39
+ }
40
+ export declare function listPains(dbPath: string, options?: {
41
+ limit?: number;
42
+ host?: PainListHostFilter;
43
+ }): Promise<PainListResult>;
44
+ export declare function handlePainList(opts: PainListOptions): Promise<void>;
45
+ //# sourceMappingURL=pain-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pain-list.d.ts","sourceRoot":"","sources":["../../src/commands/pain-list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,IAAI,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACtC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAoCD,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,kBAAkB,CAAA;CAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CA+CpI;AAoBD,wBAAsB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDzE"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * pd pain list command — PRI-640 (Governance Signal Host Attribution v0.1)
3
+ *
4
+ * Read-only: lists canonical pain_events rows from trajectory.db with their
5
+ * host attribution. `--host` filters by openclaw / codex / unknown.
6
+ *
7
+ * Usage:
8
+ * pd pain list [--workspace <path>] [--limit N] [--host openclaw|codex|unknown] [--json]
9
+ *
10
+ * Host semantics (SPEC §6/§12): host_kind is observability metadata only.
11
+ * NULL (legacy / manual / unprovable) is reported as `unknown` — never guessed.
12
+ * On a pre-PRI-640 database without the host_kind column every row reports
13
+ * `unknown` and a `host_kind_column_missing` warning is emitted (rc-9).
14
+ */
15
+ import * as fs from 'fs';
16
+ import * as path from 'path';
17
+ import { resolveWorkspaceDir } from '../resolve-workspace.js';
18
+ function isRecord(value) {
19
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
20
+ }
21
+ function ownField(row, key) {
22
+ return isRecord(row) && Object.hasOwn(row, key) ? row[key] : undefined;
23
+ }
24
+ /** Runtime Contract #1/#4: validate each DB row; skip malformed rows loudly. */
25
+ function toPainEntry(row) {
26
+ const id = ownField(row, 'id');
27
+ const source = ownField(row, 'source');
28
+ const score = ownField(row, 'score');
29
+ const createdAt = ownField(row, 'created_at');
30
+ if (typeof id !== 'number' || typeof source !== 'string' || typeof score !== 'number' || typeof createdAt !== 'string') {
31
+ return null;
32
+ }
33
+ const canonicalPainId = ownField(row, 'canonical_pain_id');
34
+ const hostKind = ownField(row, 'host_kind');
35
+ const severity = ownField(row, 'severity');
36
+ const runtimeTaskId = ownField(row, 'runtime_task_id');
37
+ const host = hostKind === 'openclaw' || hostKind === 'codex' ? hostKind : 'unknown';
38
+ return {
39
+ painId: typeof canonicalPainId === 'string' && canonicalPainId.length > 0 ? canonicalPainId : `row:${id}`,
40
+ source,
41
+ host,
42
+ score,
43
+ severity: typeof severity === 'string' ? severity : null,
44
+ createdAt,
45
+ runtimeTaskId: typeof runtimeTaskId === 'string' && runtimeTaskId.length > 0 ? runtimeTaskId : null,
46
+ };
47
+ }
48
+ export async function listPains(dbPath, options = {}) {
49
+ const Database = (await import('better-sqlite3')).default;
50
+ const db = new Database(dbPath, { readonly: true });
51
+ try {
52
+ const warnings = [];
53
+ const columns = db.prepare('PRAGMA table_info(pain_events)').all();
54
+ const hasHostKindColumn = columns.some((row) => ownField(row, 'name') === 'host_kind');
55
+ if (!hasHostKindColumn) {
56
+ warnings.push('host_kind_column_missing');
57
+ }
58
+ const params = [];
59
+ let query = 'SELECT id, source, score, severity, created_at, canonical_pain_id, runtime_task_id';
60
+ query += hasHostKindColumn ? ', host_kind' : ", NULL AS host_kind";
61
+ query += ' FROM pain_events WHERE 1=1';
62
+ if (options.host === 'unknown') {
63
+ query += hasHostKindColumn ? ' AND host_kind IS NULL' : '';
64
+ }
65
+ else if (options.host === 'openclaw' || options.host === 'codex') {
66
+ if (!hasHostKindColumn) {
67
+ return { count: 0, pains: [], workspace: path.dirname(path.dirname(dbPath)), hostFilter: options.host, warnings };
68
+ }
69
+ query += ' AND host_kind = ?';
70
+ params.push(options.host);
71
+ }
72
+ query += ' ORDER BY created_at DESC, id DESC';
73
+ const limit = options.limit ?? 20;
74
+ query += ' LIMIT ?';
75
+ params.push(limit);
76
+ const rawRows = db.prepare(query).all(...params);
77
+ const skipped = rawRows.length - rawRows.map(toPainEntry).filter((entry) => entry !== null).length;
78
+ if (skipped > 0) {
79
+ warnings.push(`malformed_rows_skipped:${skipped}`);
80
+ }
81
+ const pains = rawRows
82
+ .map(toPainEntry)
83
+ .filter((entry) => entry !== null);
84
+ return {
85
+ count: pains.length,
86
+ pains,
87
+ workspace: path.dirname(path.dirname(dbPath)),
88
+ hostFilter: options.host ?? null,
89
+ warnings,
90
+ };
91
+ }
92
+ finally {
93
+ db.close();
94
+ }
95
+ }
96
+ function printHuman(result) {
97
+ const filterNote = result.hostFilter ? ` (host: ${result.hostFilter})` : '';
98
+ console.log(`Pain events — ${result.count} shown${filterNote}`);
99
+ console.log('─'.repeat(96));
100
+ for (const pain of result.pains) {
101
+ const painId = pain.painId.length > 40 ? `${pain.painId.slice(0, 37)}...` : pain.painId;
102
+ console.log(` ${pain.createdAt} host=${pain.host.padEnd(8)} score=${String(pain.score).padEnd(3)} ${pain.severity ?? '-'.padEnd(6)} ${pain.source}`);
103
+ console.log(` id: ${painId}${pain.runtimeTaskId ? ` | task: ${pain.runtimeTaskId}` : ''}`);
104
+ }
105
+ console.log('─'.repeat(96));
106
+ for (const warning of result.warnings) {
107
+ console.error(`WARN: ${warning}`);
108
+ }
109
+ if (result.warnings.includes('host_kind_column_missing')) {
110
+ console.error('Next: run `pd runtime init --workspace <dir>` (or restart the OpenClaw plugin) to migrate this workspace schema.');
111
+ }
112
+ }
113
+ export async function handlePainList(opts) {
114
+ const { workspace, limit: rawLimit, host: rawHost, json } = opts;
115
+ if (rawHost !== undefined && rawHost !== 'openclaw' && rawHost !== 'codex' && rawHost !== 'unknown') {
116
+ const message = `invalid host filter: expected openclaw | codex | unknown, got ${rawHost}`;
117
+ if (json) {
118
+ console.log(JSON.stringify({ status: 'failed', reason: 'invalid_host_filter', message, nextAction: 'Pass --host openclaw, --host codex, or --host unknown.' }));
119
+ }
120
+ else {
121
+ console.error('Error: ' + message);
122
+ console.error('Next: Pass --host openclaw, --host codex, or --host unknown.');
123
+ }
124
+ process.exit(1);
125
+ return; // guard: test stubs of process.exit continue execution (cli-2-exit-stops)
126
+ }
127
+ const hostFilter = rawHost;
128
+ let effectiveLimit = 20;
129
+ if (rawLimit !== undefined) {
130
+ if (!Number.isInteger(rawLimit) || rawLimit < 1 || rawLimit > 10000) {
131
+ const message = `invalid limit: limit must be an integer between 1 and 10000, got ${rawLimit}`;
132
+ if (json) {
133
+ console.log(JSON.stringify({ status: 'failed', reason: 'invalid_limit', message, nextAction: 'Pass --limit with a valid integer (1-10000).' }));
134
+ }
135
+ else {
136
+ console.error('Error: ' + message);
137
+ console.error('Next: Pass --limit with a valid integer (1-10000).');
138
+ }
139
+ process.exit(1);
140
+ return; // guard: test stubs of process.exit continue execution (cli-2-exit-stops)
141
+ }
142
+ effectiveLimit = rawLimit;
143
+ }
144
+ const workspaceDir = resolveWorkspaceDir(workspace);
145
+ const dbPath = path.join(workspaceDir, '.state', 'trajectory.db');
146
+ if (!fs.existsSync(dbPath)) {
147
+ const message = `trajectory database not found at ${dbPath}`;
148
+ if (json) {
149
+ console.log(JSON.stringify({ status: 'failed', reason: 'trajectory_db_not_found', message, nextAction: 'Initialize the PD workspace first (pd runtime init), or pass --workspace pointing at an initialized workspace.' }));
150
+ }
151
+ else {
152
+ console.error('Error: ' + message);
153
+ console.error('Next: Initialize the PD workspace first (pd runtime init), or pass --workspace pointing at an initialized workspace.');
154
+ }
155
+ process.exit(1);
156
+ return; // guard: test stubs of process.exit continue execution (cli-2-exit-stops)
157
+ }
158
+ const result = await listPains(dbPath, { limit: effectiveLimit, ...(hostFilter ? { host: hostFilter } : {}) });
159
+ if (json) {
160
+ console.log(JSON.stringify(result, null, 2));
161
+ return;
162
+ }
163
+ printHuman(result);
164
+ }
165
+ //# sourceMappingURL=pain-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pain-list.js","sourceRoot":"","sources":["../../src/commands/pain-list.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-init.d.ts","sourceRoot":"","sources":["../../src/commands/runtime-init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAqCH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,aAAa,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC1D,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC1D,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAwGD,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAwLhG;AA0DD,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B/E"}
1
+ {"version":3,"file":"runtime-init.d.ts","sourceRoot":"","sources":["../../src/commands/runtime-init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAqCH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,aAAa,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC1D,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC1D,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAmHD,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAwLhG;AA0DD,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B/E"}
@@ -48,12 +48,23 @@ const DB_NAMES = {
48
48
  */
49
49
  function buildConfigYaml(workspaceDir) {
50
50
  const config = getDefaultPdConfig();
51
+ // PRI-637: `pd runtime init` is PD machinery writing a bootstrap snapshot, so
52
+ // every flag entry records `source: 'system'` — an ORIGIN HINT, NOT proof that
53
+ // the value lacks Owner intent (direct .pd/config.yaml editing is a supported
54
+ // path; an Owner may later pin behavior on top of this entry). Labels are
55
+ // metadata only; effective values are unchanged. If a flag graduates, system-
56
+ // origin entries are cleanup CANDIDATES that still require explicit Owner
57
+ // confirmation before removal.
58
+ const features = {};
59
+ for (const [id, entry] of Object.entries(config.features)) {
60
+ features[id] = { category: entry.category, enabled: entry.enabled, source: 'system' };
61
+ }
51
62
  const yamlObj = {
52
63
  version: config.version,
53
64
  workspace: {
54
65
  default: workspaceDir,
55
66
  },
56
- features: config.features,
67
+ features,
57
68
  runtimeProfiles: config.runtimeProfiles,
58
69
  internalAgents: config.internalAgents,
59
70
  ui: config.ui,