@principles/pd-cli 1.102.0 → 1.103.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/runtime-internalization-integrity.d.ts.map +1 -1
- package/dist/commands/runtime-internalization-integrity.js +40 -1
- package/dist/commands/runtime-internalization-integrity.js.map +1 -1
- package/dist/services/mainline-snapshot-assembler.d.ts +35 -0
- package/dist/services/mainline-snapshot-assembler.d.ts.map +1 -0
- package/dist/services/mainline-snapshot-assembler.js +399 -0
- package/dist/services/mainline-snapshot-assembler.js.map +1 -0
- package/package.json +1 -1
- package/src/commands/runtime-internalization-integrity.ts +40 -1
- package/src/services/mainline-snapshot-assembler.ts +544 -0
- package/tests/commands/runtime-internalization-integrity.test.ts +37 -0
- package/tests/services/mainline-snapshot-assembler.test.ts +425 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-internalization-integrity.d.ts","sourceRoot":"","sources":["../../src/commands/runtime-internalization-integrity.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runtime-internalization-integrity.d.ts","sourceRoot":"","sources":["../../src/commands/runtime-internalization-integrity.ts"],"names":[],"mappings":"AAMA,UAAU,+BAA+B;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAoCD,wBAAsB,qCAAqC,CAAC,IAAI,EAAE,+BAA+B,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDhH"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as path from 'path';
|
|
2
2
|
import { InternalizationChainIntegrityReadModel } from '@principles/core/runtime-v2';
|
|
3
3
|
import { resolveWorkspaceDir } from '../resolve-workspace.js';
|
|
4
|
+
import { assembleMainlineSnapshot } from '../services/mainline-snapshot-assembler.js';
|
|
4
5
|
function formatTextOutput(result) {
|
|
5
6
|
const lines = [];
|
|
6
7
|
const icon = result.overallStatus === 'ok' ? '✓' : result.overallStatus === 'degraded' ? '⚠' : '✗';
|
|
@@ -38,7 +39,45 @@ export async function handleRuntimeInternalizationIntegrity(opts) {
|
|
|
38
39
|
const workspaceDir = opts.workspace
|
|
39
40
|
? path.resolve(opts.workspace)
|
|
40
41
|
: resolveWorkspaceDir();
|
|
41
|
-
|
|
42
|
+
let warnings;
|
|
43
|
+
let snapshot;
|
|
44
|
+
try {
|
|
45
|
+
({ snapshot, warnings } = await assembleMainlineSnapshot({ workspaceDir }));
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
49
|
+
const failure = {
|
|
50
|
+
overallStatus: 'error',
|
|
51
|
+
brokenLinks: [{
|
|
52
|
+
type: 'mainline_snapshot_assembly_failed',
|
|
53
|
+
severity: 'error',
|
|
54
|
+
reason: `Failed to assemble mainline snapshot: ${reason}`,
|
|
55
|
+
recommendedAction: 'Verify workspace state.db/config and rerun `pd runtime internalization integrity`.',
|
|
56
|
+
}],
|
|
57
|
+
chainSummaries: {
|
|
58
|
+
totalCandidates: 0,
|
|
59
|
+
totalDreamerTasks: 0,
|
|
60
|
+
totalPhilosopherTasks: 0,
|
|
61
|
+
totalPIArtifacts: 0,
|
|
62
|
+
chainsWithBrokenLinks: 0,
|
|
63
|
+
},
|
|
64
|
+
generatedAt: new Date().toISOString(),
|
|
65
|
+
};
|
|
66
|
+
if (opts.json) {
|
|
67
|
+
console.log(JSON.stringify(failure, null, 2));
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
console.error(`FAIL: ${failure.brokenLinks[0].reason}`);
|
|
71
|
+
}
|
|
72
|
+
process.exitCode = 1;
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (!opts.json && warnings.length > 0) {
|
|
76
|
+
for (const warning of warnings) {
|
|
77
|
+
console.warn(`Warning: ${warning}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const model = new InternalizationChainIntegrityReadModel({ workspaceDir, mainlineSnapshot: snapshot });
|
|
42
81
|
const result = model.check();
|
|
43
82
|
if (opts.json) {
|
|
44
83
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-internalization-integrity.js","sourceRoot":"","sources":["../../src/commands/runtime-internalization-integrity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,sCAAsC,EAAE,MAAM,6BAA6B,CAAC;AAErF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-internalization-integrity.js","sourceRoot":"","sources":["../../src/commands/runtime-internalization-integrity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared MainlineSnapshot assembler (PRI-394)
|
|
3
|
+
*
|
|
4
|
+
* I/O-boundary reader that assembles a read-only `MainlineSnapshot` from real
|
|
5
|
+
* Runtime V2 SQLite state, then hands it to core's pure `assertMainlineContract`.
|
|
6
|
+
*
|
|
7
|
+
* Rules:
|
|
8
|
+
* - This module lives in pd-cli (I/O boundary). It reads `.pd/state.db` via
|
|
9
|
+
* the existing `RuntimeStateManager` / `SqliteConnection` abstractions.
|
|
10
|
+
* - It does NOT judge the contract. Judgment lives exclusively in
|
|
11
|
+
* `packages/principles-core/src/runtime-v2/mainline-contract.ts`.
|
|
12
|
+
* - All DB JSON / `diagnosticJson` / artifact metadata is treated as `unknown`
|
|
13
|
+
* and validated at runtime before use (EP-01).
|
|
14
|
+
* - It never throws on malformed input; it returns a snapshot that the pure
|
|
15
|
+
* contract will judge as a violation with a concrete `nextAction`.
|
|
16
|
+
*/
|
|
17
|
+
import { assertMainlineContract, EMPTY_CONTEXT_SENTINEL, type MainlineSnapshot, type RuntimeReadinessSnapshot } from '@principles/core/runtime-v2';
|
|
18
|
+
export interface AssembleMainlineSnapshotOptions {
|
|
19
|
+
/** Workspace directory containing `.pd/state.db`. */
|
|
20
|
+
workspaceDir: string;
|
|
21
|
+
/** Specific painId to evaluate. If omitted, the latest diagnostician task is used. */
|
|
22
|
+
painId?: string;
|
|
23
|
+
/** Pre-built readiness snapshot. If omitted, a degraded one is assembled from `.pd/config.yaml`. */
|
|
24
|
+
readiness?: RuntimeReadinessSnapshot;
|
|
25
|
+
}
|
|
26
|
+
export interface AssembleMainlineSnapshotResult {
|
|
27
|
+
snapshot: MainlineSnapshot;
|
|
28
|
+
/** Non-fatal assembly warnings (e.g., malformed JSON that the contract will judge). */
|
|
29
|
+
warnings: string[];
|
|
30
|
+
/** The painId that was evaluated (useful when caller did not provide one). */
|
|
31
|
+
resolvedPainId: string | null;
|
|
32
|
+
}
|
|
33
|
+
export declare function assembleMainlineSnapshot(options: AssembleMainlineSnapshotOptions): Promise<AssembleMainlineSnapshotResult>;
|
|
34
|
+
export { assertMainlineContract, EMPTY_CONTEXT_SENTINEL };
|
|
35
|
+
//# sourceMappingURL=mainline-snapshot-assembler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mainline-snapshot-assembler.d.ts","sourceRoot":"","sources":["../../src/services/mainline-snapshot-assembler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAEL,sBAAsB,EACtB,sBAAsB,EAEtB,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAU9B,MAAM,6BAA6B,CAAC;AAIrC,MAAM,WAAW,+BAA+B;IAC9C,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oGAAoG;IACpG,SAAS,CAAC,EAAE,wBAAwB,CAAC;CACtC;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,uFAAuF;IACvF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8EAA8E;IAC9E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AA8cD,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,8BAA8B,CAAC,CAwBzC;AAGD,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared MainlineSnapshot assembler (PRI-394)
|
|
3
|
+
*
|
|
4
|
+
* I/O-boundary reader that assembles a read-only `MainlineSnapshot` from real
|
|
5
|
+
* Runtime V2 SQLite state, then hands it to core's pure `assertMainlineContract`.
|
|
6
|
+
*
|
|
7
|
+
* Rules:
|
|
8
|
+
* - This module lives in pd-cli (I/O boundary). It reads `.pd/state.db` via
|
|
9
|
+
* the existing `RuntimeStateManager` / `SqliteConnection` abstractions.
|
|
10
|
+
* - It does NOT judge the contract. Judgment lives exclusively in
|
|
11
|
+
* `packages/principles-core/src/runtime-v2/mainline-contract.ts`.
|
|
12
|
+
* - All DB JSON / `diagnosticJson` / artifact metadata is treated as `unknown`
|
|
13
|
+
* and validated at runtime before use (EP-01).
|
|
14
|
+
* - It never throws on malformed input; it returns a snapshot that the pure
|
|
15
|
+
* contract will judge as a violation with a concrete `nextAction`.
|
|
16
|
+
*/
|
|
17
|
+
import { RuntimeStateManager, assertMainlineContract, EMPTY_CONTEXT_SENTINEL, hydratePITaskRecord, } from '@principles/core/runtime-v2';
|
|
18
|
+
import { loadPdConfig } from './pd-config-loader.js';
|
|
19
|
+
// ── Safe JSON helpers ────────────────────────────────────────────────────────
|
|
20
|
+
function safeJsonParse(raw) {
|
|
21
|
+
if (raw === null || raw === undefined || raw.trim() === '') {
|
|
22
|
+
return { ok: false, reason: 'diagnosticJson is empty' };
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
return { ok: true, value: JSON.parse(raw) };
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
29
|
+
return { ok: false, reason: `diagnosticJson is not valid JSON: ${detail}` };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function isNonEmptyString(value) {
|
|
33
|
+
return typeof value === 'string' && value.trim() !== '';
|
|
34
|
+
}
|
|
35
|
+
function isObject(value) {
|
|
36
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
37
|
+
}
|
|
38
|
+
function readOwnString(obj, key) {
|
|
39
|
+
if (!Object.hasOwn(obj, key))
|
|
40
|
+
return undefined;
|
|
41
|
+
const value = obj[key];
|
|
42
|
+
return isNonEmptyString(value) ? value : undefined;
|
|
43
|
+
}
|
|
44
|
+
function validateDiagnosticianArtifactRow(value) {
|
|
45
|
+
if (!isObject(value))
|
|
46
|
+
return null;
|
|
47
|
+
const artifactId = readOwnString(value, 'artifact_id');
|
|
48
|
+
const runId = readOwnString(value, 'run_id');
|
|
49
|
+
const taskId = readOwnString(value, 'task_id');
|
|
50
|
+
const artifactKind = readOwnString(value, 'artifact_kind');
|
|
51
|
+
const contentJson = readOwnString(value, 'content_json');
|
|
52
|
+
if (!artifactId || !contentJson)
|
|
53
|
+
return null;
|
|
54
|
+
return { artifactId, runId: runId ?? '', taskId: taskId ?? '', artifactKind: artifactKind ?? '', contentJson };
|
|
55
|
+
}
|
|
56
|
+
function validateConsumedCandidateRow(value) {
|
|
57
|
+
if (!isObject(value))
|
|
58
|
+
return null;
|
|
59
|
+
const candidateId = readOwnString(value, 'candidate_id');
|
|
60
|
+
if (!candidateId)
|
|
61
|
+
return null;
|
|
62
|
+
return { candidateId };
|
|
63
|
+
}
|
|
64
|
+
// ── Context hash helper ──────────────────────────────────────────────────────
|
|
65
|
+
function hashContextRefs(contextRefs) {
|
|
66
|
+
const str = contextRefs.join('\u0000');
|
|
67
|
+
let hash = 0;
|
|
68
|
+
for (let i = 0; i < str.length; i++) {
|
|
69
|
+
const char = str.charCodeAt(i);
|
|
70
|
+
hash = ((hash << 5) - hash + char) | 0;
|
|
71
|
+
}
|
|
72
|
+
return `ctx-${Math.abs(hash).toString(16)}`;
|
|
73
|
+
}
|
|
74
|
+
// ── Readiness fallback ───────────────────────────────────────────────────────
|
|
75
|
+
function buildDefaultReadiness(workspaceDir, warnings) {
|
|
76
|
+
const configLoadResult = loadPdConfig(workspaceDir);
|
|
77
|
+
const effective = configLoadResult.ok ? configLoadResult.effective : configLoadResult.defaults;
|
|
78
|
+
const defaultProfile = effective.config?.internalAgents?.defaultRuntime ?? 'openclaw.default';
|
|
79
|
+
if (!configLoadResult.ok) {
|
|
80
|
+
for (const err of configLoadResult.errors) {
|
|
81
|
+
warnings.push(`${err.path}: ${err.reason}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (configLoadResult.warnings.length > 0) {
|
|
85
|
+
warnings.push(...configLoadResult.warnings);
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
configDoctorProfile: defaultProfile,
|
|
89
|
+
runtimeProbeProfile: null,
|
|
90
|
+
configSource: '.pd/config.yaml',
|
|
91
|
+
probeConfigSource: '.pd/config.yaml',
|
|
92
|
+
diagnosticianReady: false,
|
|
93
|
+
diagnosticianReadinessReason: 'No readiness snapshot provided; run "pd runtime probe" first.',
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// ── Diagnosis task lookup ────────────────────────────────────────────────────
|
|
97
|
+
async function findDiagnosisTask(stateManager, requestedPainId, warnings) {
|
|
98
|
+
const allTasks = await stateManager.listTasks();
|
|
99
|
+
const diagTasks = allTasks.filter((t) => t.taskKind === 'diagnostician');
|
|
100
|
+
if (requestedPainId) {
|
|
101
|
+
const sortedByDate = [...diagTasks].sort((a, b) => (b.createdAt ?? '').localeCompare(a.createdAt ?? ''));
|
|
102
|
+
for (const task of sortedByDate) {
|
|
103
|
+
const parsed = safeJsonParse(task.diagnosticJson);
|
|
104
|
+
if (!parsed.ok)
|
|
105
|
+
continue;
|
|
106
|
+
const sourcePainId = isObject(parsed.value) ? readOwnString(parsed.value, 'sourcePainId') : undefined;
|
|
107
|
+
if (sourcePainId === requestedPainId) {
|
|
108
|
+
return { painId: requestedPainId, diagnosisTask: task };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return { painId: requestedPainId, diagnosisTask: null };
|
|
112
|
+
}
|
|
113
|
+
// No painId provided — pick the latest diagnostician task by createdAt.
|
|
114
|
+
const sorted = diagTasks.sort((a, b) => (b.createdAt ?? '').localeCompare(a.createdAt ?? ''));
|
|
115
|
+
for (const task of sorted) {
|
|
116
|
+
const parsed = safeJsonParse(task.diagnosticJson);
|
|
117
|
+
if (!parsed.ok) {
|
|
118
|
+
warnings.push(`Task ${task.taskId} has malformed diagnosticJson: ${parsed.reason}`);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const sourcePainId = isObject(parsed.value) ? readOwnString(parsed.value, 'sourcePainId') : undefined;
|
|
122
|
+
if (sourcePainId) {
|
|
123
|
+
return { painId: sourcePainId, diagnosisTask: task };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return { painId: null, diagnosisTask: sorted[0] ?? null };
|
|
127
|
+
}
|
|
128
|
+
async function buildDiagnosisTaskSnapshot(stateManager, task) {
|
|
129
|
+
const runs = await stateManager.getRunsByTask(task.taskId);
|
|
130
|
+
const hasSucceededRun = runs.some((r) => r.executionStatus === 'succeeded');
|
|
131
|
+
return {
|
|
132
|
+
taskId: task.taskId,
|
|
133
|
+
status: task.status,
|
|
134
|
+
hasSucceededRun,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
async function findDiagnosticianArtifact(input) {
|
|
138
|
+
const { stateManager, diagnosisTaskId, painId, warnings } = input;
|
|
139
|
+
const db = stateManager.connection.getDb();
|
|
140
|
+
const rows = db
|
|
141
|
+
.prepare(`SELECT artifact_id, run_id, task_id, artifact_kind, content_json
|
|
142
|
+
FROM artifacts
|
|
143
|
+
WHERE task_id = ? AND artifact_kind = 'diagnostician_output'
|
|
144
|
+
ORDER BY created_at DESC
|
|
145
|
+
LIMIT 1`)
|
|
146
|
+
.all(diagnosisTaskId);
|
|
147
|
+
const [raw] = rows;
|
|
148
|
+
if (!raw)
|
|
149
|
+
return null;
|
|
150
|
+
const row = validateDiagnosticianArtifactRow(raw);
|
|
151
|
+
if (!row) {
|
|
152
|
+
warnings.push(`Malformed diagnostician artifact row for task ${diagnosisTaskId}: missing artifact_id or content_json`);
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
let sourcePainId = painId;
|
|
156
|
+
const parsed = safeJsonParse(row.contentJson);
|
|
157
|
+
if (parsed.ok && isObject(parsed.value)) {
|
|
158
|
+
const artifactPainId = readOwnString(parsed.value, 'painId');
|
|
159
|
+
if (artifactPainId) {
|
|
160
|
+
sourcePainId = artifactPainId;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else if (parsed.ok === false) {
|
|
164
|
+
warnings.push(`Artifact ${row.artifactId} content_json parse failed: ${parsed.reason}`);
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
artifactId: row.artifactId,
|
|
168
|
+
sourcePainId,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
async function findCandidate(stateManager, artifactId, warnings) {
|
|
172
|
+
const artifactWithCandidates = await stateManager.getArtifactWithCandidates(artifactId);
|
|
173
|
+
if (!artifactWithCandidates || artifactWithCandidates.candidates.length === 0)
|
|
174
|
+
return null;
|
|
175
|
+
const [candidate] = artifactWithCandidates.candidates;
|
|
176
|
+
if (!candidate)
|
|
177
|
+
return null;
|
|
178
|
+
const { status } = candidate;
|
|
179
|
+
if (status !== 'pending' && status !== 'consumed' && status !== 'expired') {
|
|
180
|
+
warnings.push(`Candidate ${candidate.candidateId} has unexpected status "${status}"`);
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
candidateId: candidate.candidateId,
|
|
184
|
+
status,
|
|
185
|
+
sourceTaskId: candidate.taskId,
|
|
186
|
+
sourceArtifactId: candidate.artifactId,
|
|
187
|
+
sourceRunId: candidate.sourceRunId,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function buildDreamerTaskSnapshot(task, warnings) {
|
|
191
|
+
const piTask = hydratePITaskRecord(task);
|
|
192
|
+
if (!piTask) {
|
|
193
|
+
warnings.push(`Dreamer task ${task.taskId} has invalid PI metadata`);
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
const inputArtifactRefs = [];
|
|
197
|
+
for (const ref of piTask.inputArtifactRefs ?? []) {
|
|
198
|
+
if (isObject(ref) && isNonEmptyString(ref.artifactType) && isNonEmptyString(ref.ref)) {
|
|
199
|
+
inputArtifactRefs.push({
|
|
200
|
+
artifactType: ref.artifactType,
|
|
201
|
+
ref: ref.ref,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
taskId: task.taskId,
|
|
207
|
+
dependencyTaskIds: piTask.dependencyTaskIds,
|
|
208
|
+
inputArtifactRefs,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
async function findDreamerTask(stateManager, candidate, warnings) {
|
|
212
|
+
// Predictable taskId from intake-to-internalization bridge.
|
|
213
|
+
const predictableIds = [
|
|
214
|
+
`dreamer-${candidate.candidateId}-prompt`,
|
|
215
|
+
`dreamer-${candidate.candidateId}-code_tool_hook`,
|
|
216
|
+
`dreamer-${candidate.candidateId}-defer_archive`,
|
|
217
|
+
];
|
|
218
|
+
for (const taskId of predictableIds) {
|
|
219
|
+
const task = await stateManager.getTask(taskId);
|
|
220
|
+
if (task && task.taskKind === 'dreamer') {
|
|
221
|
+
return buildDreamerTaskSnapshot(task, warnings);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Fallback: scan dreamer tasks whose diagnostic_json references this candidate.
|
|
225
|
+
const allTasks = await stateManager.listTasks();
|
|
226
|
+
for (const task of allTasks) {
|
|
227
|
+
if (task.taskKind !== 'dreamer')
|
|
228
|
+
continue;
|
|
229
|
+
const parsed = safeJsonParse(task.diagnosticJson);
|
|
230
|
+
if (!parsed.ok)
|
|
231
|
+
continue;
|
|
232
|
+
const candidateId = isObject(parsed.value) ? readOwnString(parsed.value, 'candidateId') : undefined;
|
|
233
|
+
if (candidateId === candidate.candidateId) {
|
|
234
|
+
return buildDreamerTaskSnapshot(task, warnings);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
async function buildDreamerContextSnapshot(stateManager, dreamerTask, warnings) {
|
|
240
|
+
const contextRefs = [];
|
|
241
|
+
for (const depId of dreamerTask.dependencyTaskIds) {
|
|
242
|
+
const dep = await stateManager.getTask(depId);
|
|
243
|
+
if (!dep) {
|
|
244
|
+
warnings.push(`Dreamer task ${dreamerTask.taskId} dependency ${depId} not found`);
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
if (dep.resultRef)
|
|
248
|
+
contextRefs.push(dep.resultRef);
|
|
249
|
+
const depPi = hydratePITaskRecord(dep);
|
|
250
|
+
if (depPi?.outputArtifactRefs) {
|
|
251
|
+
for (const ref of depPi.outputArtifactRefs) {
|
|
252
|
+
if (ref && isNonEmptyString(ref.ref)) {
|
|
253
|
+
contextRefs.push(ref.ref);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const contextHash = contextRefs.length === 0 ? EMPTY_CONTEXT_SENTINEL : hashContextRefs(contextRefs);
|
|
259
|
+
return { contextHash, contextRefs };
|
|
260
|
+
}
|
|
261
|
+
async function findSuccessor(stateManager, dreamerTaskId) {
|
|
262
|
+
const allTasks = await stateManager.listTasks();
|
|
263
|
+
for (const task of allTasks) {
|
|
264
|
+
if (task.taskKind !== 'philosopher')
|
|
265
|
+
continue;
|
|
266
|
+
const piTask = hydratePITaskRecord(task);
|
|
267
|
+
if (!piTask)
|
|
268
|
+
continue;
|
|
269
|
+
const { parentTaskId, dependencyTaskIds: deps = [] } = piTask;
|
|
270
|
+
if (parentTaskId === dreamerTaskId || deps.includes(dreamerTaskId)) {
|
|
271
|
+
return {
|
|
272
|
+
taskId: task.taskId,
|
|
273
|
+
taskKind: task.taskKind,
|
|
274
|
+
exists: true,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
async function findReviewablePrinciple(stateManager, philosopherTaskId) {
|
|
281
|
+
const artifacts = await stateManager.piArtifactStore.listBySourceTaskId(philosopherTaskId);
|
|
282
|
+
const principleArtifact = artifacts.find((a) => a.artifactKind === 'principle');
|
|
283
|
+
if (!principleArtifact)
|
|
284
|
+
return null;
|
|
285
|
+
let principleId;
|
|
286
|
+
const parsed = safeJsonParse(principleArtifact.contentJson);
|
|
287
|
+
if (parsed.ok && isObject(parsed.value)) {
|
|
288
|
+
const { principleCandidate: candidate } = parsed.value;
|
|
289
|
+
if (isObject(candidate)) {
|
|
290
|
+
const id = readOwnString(candidate, 'principleId');
|
|
291
|
+
if (id)
|
|
292
|
+
principleId = id;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return {
|
|
296
|
+
exists: true,
|
|
297
|
+
principleId,
|
|
298
|
+
reviewable: principleArtifact.validationStatus !== 'rejected',
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
async function assembleChain(input) {
|
|
302
|
+
const { stateManager, painId, diagnosisTask, warnings } = input;
|
|
303
|
+
const diagnosisTaskSnapshot = diagnosisTask
|
|
304
|
+
? await buildDiagnosisTaskSnapshot(stateManager, diagnosisTask)
|
|
305
|
+
: null;
|
|
306
|
+
const diagnosticianArtifact = diagnosisTask
|
|
307
|
+
? await findDiagnosticianArtifact({
|
|
308
|
+
stateManager,
|
|
309
|
+
diagnosisTaskId: diagnosisTask.taskId,
|
|
310
|
+
painId,
|
|
311
|
+
warnings,
|
|
312
|
+
})
|
|
313
|
+
: null;
|
|
314
|
+
const candidate = diagnosticianArtifact
|
|
315
|
+
? await findCandidate(stateManager, diagnosticianArtifact.artifactId, warnings)
|
|
316
|
+
: null;
|
|
317
|
+
const dreamerTask = candidate
|
|
318
|
+
? await findDreamerTask(stateManager, candidate, warnings)
|
|
319
|
+
: null;
|
|
320
|
+
const dreamerContext = dreamerTask
|
|
321
|
+
? await buildDreamerContextSnapshot(stateManager, dreamerTask, warnings)
|
|
322
|
+
: null;
|
|
323
|
+
const successor = dreamerTask
|
|
324
|
+
? await findSuccessor(stateManager, dreamerTask.taskId)
|
|
325
|
+
: null;
|
|
326
|
+
const principle = successor
|
|
327
|
+
? await findReviewablePrinciple(stateManager, successor.taskId)
|
|
328
|
+
: null;
|
|
329
|
+
return {
|
|
330
|
+
painId,
|
|
331
|
+
diagnosisTask: diagnosisTaskSnapshot,
|
|
332
|
+
diagnosticianArtifact,
|
|
333
|
+
candidate,
|
|
334
|
+
dreamerTask,
|
|
335
|
+
dreamerContext,
|
|
336
|
+
successor,
|
|
337
|
+
principle,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
// ── Workspace-level auto-consumption hole ────────────────────────────────────
|
|
341
|
+
async function findConsumedCandidatesMissingDreamer(stateManager, warnings) {
|
|
342
|
+
const db = stateManager.connection.getDb();
|
|
343
|
+
const rows = db
|
|
344
|
+
.prepare(`SELECT candidate_id FROM principle_candidates WHERE status = 'consumed'`)
|
|
345
|
+
.all();
|
|
346
|
+
const allTasks = await stateManager.listTasks();
|
|
347
|
+
const dreamerTasks = allTasks.filter((t) => t.taskKind === 'dreamer');
|
|
348
|
+
const dreamerTaskIds = new Set(dreamerTasks.map((t) => t.taskId));
|
|
349
|
+
const orphans = [];
|
|
350
|
+
for (const raw of rows) {
|
|
351
|
+
const row = validateConsumedCandidateRow(raw);
|
|
352
|
+
if (!row) {
|
|
353
|
+
warnings.push('Malformed consumed candidate row: missing candidate_id');
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
const { candidateId } = row;
|
|
357
|
+
const predictableIds = [
|
|
358
|
+
`dreamer-${candidateId}-prompt`,
|
|
359
|
+
`dreamer-${candidateId}-code_tool_hook`,
|
|
360
|
+
`dreamer-${candidateId}-defer_archive`,
|
|
361
|
+
];
|
|
362
|
+
const hasDreamerByTaskId = predictableIds.some((taskId) => dreamerTaskIds.has(taskId));
|
|
363
|
+
const hasDreamerByJson = !hasDreamerByTaskId && dreamerTasks.some((dt) => {
|
|
364
|
+
const parsed = safeJsonParse(dt.diagnosticJson);
|
|
365
|
+
if (!parsed.ok)
|
|
366
|
+
return false;
|
|
367
|
+
const id = isObject(parsed.value) ? readOwnString(parsed.value, 'candidateId') : undefined;
|
|
368
|
+
return id === candidateId;
|
|
369
|
+
});
|
|
370
|
+
if (!hasDreamerByTaskId && !hasDreamerByJson) {
|
|
371
|
+
orphans.push(candidateId);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
return orphans;
|
|
375
|
+
}
|
|
376
|
+
// ── Assembler ────────────────────────────────────────────────────────────────
|
|
377
|
+
export async function assembleMainlineSnapshot(options) {
|
|
378
|
+
const stateManager = new RuntimeStateManager({ workspaceDir: options.workspaceDir, readonly: true });
|
|
379
|
+
const warnings = [];
|
|
380
|
+
try {
|
|
381
|
+
await stateManager.initialize();
|
|
382
|
+
const readiness = options.readiness ?? buildDefaultReadiness(options.workspaceDir, warnings);
|
|
383
|
+
const { painId, diagnosisTask } = await findDiagnosisTask(stateManager, options.painId, warnings);
|
|
384
|
+
const chain = await assembleChain({ stateManager, painId, diagnosisTask, warnings });
|
|
385
|
+
const consumedCandidatesMissingDreamer = await findConsumedCandidatesMissingDreamer(stateManager, warnings);
|
|
386
|
+
const snapshot = {
|
|
387
|
+
readiness,
|
|
388
|
+
chain,
|
|
389
|
+
consumedCandidatesMissingDreamer,
|
|
390
|
+
};
|
|
391
|
+
return { snapshot, warnings, resolvedPainId: painId };
|
|
392
|
+
}
|
|
393
|
+
finally {
|
|
394
|
+
await stateManager.close();
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
// Re-export the pure contract so callers can judge the assembled snapshot.
|
|
398
|
+
export { assertMainlineContract, EMPTY_CONTEXT_SENTINEL };
|
|
399
|
+
//# sourceMappingURL=mainline-snapshot-assembler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mainline-snapshot-assembler.js","sourceRoot":"","sources":["../../src/services/mainline-snapshot-assembler.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,6 +2,7 @@ import * as path from 'path';
|
|
|
2
2
|
import { InternalizationChainIntegrityReadModel } from '@principles/core/runtime-v2';
|
|
3
3
|
import type { ChainIntegrityResult } from '@principles/core/runtime-v2';
|
|
4
4
|
import { resolveWorkspaceDir } from '../resolve-workspace.js';
|
|
5
|
+
import { assembleMainlineSnapshot } from '../services/mainline-snapshot-assembler.js';
|
|
5
6
|
|
|
6
7
|
interface InternalizationIntegrityOptions {
|
|
7
8
|
workspace?: string;
|
|
@@ -47,7 +48,45 @@ export async function handleRuntimeInternalizationIntegrity(opts: Internalizatio
|
|
|
47
48
|
? path.resolve(opts.workspace)
|
|
48
49
|
: resolveWorkspaceDir();
|
|
49
50
|
|
|
50
|
-
|
|
51
|
+
let warnings: string[];
|
|
52
|
+
let snapshot;
|
|
53
|
+
try {
|
|
54
|
+
({ snapshot, warnings } = await assembleMainlineSnapshot({ workspaceDir }));
|
|
55
|
+
} catch (error: unknown) {
|
|
56
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
57
|
+
const failure: ChainIntegrityResult = {
|
|
58
|
+
overallStatus: 'error',
|
|
59
|
+
brokenLinks: [{
|
|
60
|
+
type: 'mainline_snapshot_assembly_failed',
|
|
61
|
+
severity: 'error',
|
|
62
|
+
reason: `Failed to assemble mainline snapshot: ${reason}`,
|
|
63
|
+
recommendedAction: 'Verify workspace state.db/config and rerun `pd runtime internalization integrity`.',
|
|
64
|
+
}],
|
|
65
|
+
chainSummaries: {
|
|
66
|
+
totalCandidates: 0,
|
|
67
|
+
totalDreamerTasks: 0,
|
|
68
|
+
totalPhilosopherTasks: 0,
|
|
69
|
+
totalPIArtifacts: 0,
|
|
70
|
+
chainsWithBrokenLinks: 0,
|
|
71
|
+
},
|
|
72
|
+
generatedAt: new Date().toISOString(),
|
|
73
|
+
};
|
|
74
|
+
if (opts.json) {
|
|
75
|
+
console.log(JSON.stringify(failure, null, 2));
|
|
76
|
+
} else {
|
|
77
|
+
console.error(`FAIL: ${failure.brokenLinks[0].reason}`);
|
|
78
|
+
}
|
|
79
|
+
process.exitCode = 1;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (!opts.json && warnings.length > 0) {
|
|
84
|
+
for (const warning of warnings) {
|
|
85
|
+
console.warn(`Warning: ${warning}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const model = new InternalizationChainIntegrityReadModel({ workspaceDir, mainlineSnapshot: snapshot });
|
|
51
90
|
const result = model.check();
|
|
52
91
|
|
|
53
92
|
if (opts.json) {
|