@geotechcli/core 0.3.0 → 0.4.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.
- package/dist/agents/brain.d.ts +1 -0
- package/dist/agents/brain.d.ts.map +1 -1
- package/dist/agents/brain.js +45 -41
- package/dist/agents/brain.js.map +1 -1
- package/dist/agents/bridge-tools.js +15 -3
- package/dist/agents/bridge-tools.js.map +1 -1
- package/dist/agents/case-file.d.ts +52 -0
- package/dist/agents/case-file.d.ts.map +1 -0
- package/dist/agents/case-file.js +657 -0
- package/dist/agents/case-file.js.map +1 -0
- package/dist/agents/contracts.d.ts +232 -0
- package/dist/agents/contracts.d.ts.map +1 -0
- package/dist/agents/contracts.js +14 -0
- package/dist/agents/contracts.js.map +1 -0
- package/dist/agents/data-tools.js +11 -3
- package/dist/agents/data-tools.js.map +1 -1
- package/dist/agents/deliverable-tools.d.ts +2 -0
- package/dist/agents/deliverable-tools.d.ts.map +1 -0
- package/dist/agents/deliverable-tools.js +497 -0
- package/dist/agents/deliverable-tools.js.map +1 -0
- package/dist/agents/evidence.d.ts +21 -0
- package/dist/agents/evidence.d.ts.map +1 -0
- package/dist/agents/evidence.js +302 -0
- package/dist/agents/evidence.js.map +1 -0
- package/dist/agents/orchestrator.js +13 -13
- package/dist/agents/sandbox.d.ts.map +1 -1
- package/dist/agents/sandbox.js +84 -31
- package/dist/agents/sandbox.js.map +1 -1
- package/dist/agents/swarm.d.ts +2 -0
- package/dist/agents/swarm.d.ts.map +1 -1
- package/dist/agents/swarm.js +177 -152
- package/dist/agents/swarm.js.map +1 -1
- package/dist/agents/tool-normalization.d.ts +4 -0
- package/dist/agents/tool-normalization.d.ts.map +1 -0
- package/dist/agents/tool-normalization.js +92 -0
- package/dist/agents/tool-normalization.js.map +1 -0
- package/dist/bridge/index.js +87 -87
- package/dist/geo/pile-capacity.d.ts.map +1 -1
- package/dist/geo/pile-capacity.js +47 -8
- package/dist/geo/pile-capacity.js.map +1 -1
- package/dist/geo/slope-stability.d.ts.map +1 -1
- package/dist/geo/slope-stability.js +9 -6
- package/dist/geo/slope-stability.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/llm/middleware/metering.js +14 -14
- package/dist/meta/metadata.json +4 -4
- package/dist/report/casefile.d.ts +207 -0
- package/dist/report/casefile.d.ts.map +1 -0
- package/dist/report/casefile.js +438 -0
- package/dist/report/casefile.js.map +1 -0
- package/dist/report/docx.d.ts +0 -4
- package/dist/report/docx.d.ts.map +1 -1
- package/dist/report/docx.js +6 -1
- package/dist/report/docx.js.map +1 -1
- package/dist/report/index.d.ts +1 -0
- package/dist/report/index.d.ts.map +1 -1
- package/dist/report/index.js +21 -20
- package/dist/report/index.js.map +1 -1
- package/dist/report/pdf.d.ts +0 -4
- package/dist/report/pdf.d.ts.map +1 -1
- package/dist/report/pdf.js +6 -1
- package/dist/report/pdf.js.map +1 -1
- package/dist/vision/index.d.ts.map +1 -1
- package/dist/vision/index.js +270 -117
- package/dist/vision/index.js.map +1 -1
- package/dist/vision/parse.d.ts.map +1 -1
- package/dist/vision/parse.js +18 -0
- package/dist/vision/parse.js.map +1 -1
- package/package.json +58 -58
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
export type ScenarioArtifactType = 'ground-model' | 'assumptions' | 'data-quality' | 'analysis-plan' | 'results' | 'option-matrix' | 'review-checklist' | 'acceptance-status' | 'issues-and-corrections' | 'final-report';
|
|
2
|
+
export interface EvidenceReference {
|
|
3
|
+
evidenceId?: string;
|
|
4
|
+
class: string;
|
|
5
|
+
label: string;
|
|
6
|
+
source: string;
|
|
7
|
+
summary?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface GroundModelPayload {
|
|
10
|
+
summary: string;
|
|
11
|
+
strata?: Array<{
|
|
12
|
+
id?: string;
|
|
13
|
+
fromM: number;
|
|
14
|
+
toM: number;
|
|
15
|
+
material: string;
|
|
16
|
+
description?: string;
|
|
17
|
+
uscsSymbol?: string;
|
|
18
|
+
warnings?: string[];
|
|
19
|
+
evidenceRefs?: EvidenceReference[];
|
|
20
|
+
}>;
|
|
21
|
+
groundwater?: {
|
|
22
|
+
detected?: boolean;
|
|
23
|
+
depthM?: number | null;
|
|
24
|
+
note?: string;
|
|
25
|
+
};
|
|
26
|
+
missingInputs?: string[];
|
|
27
|
+
blockedInputs?: string[];
|
|
28
|
+
}
|
|
29
|
+
export interface AssumptionsPayload {
|
|
30
|
+
summary: string;
|
|
31
|
+
assumptions?: Array<{
|
|
32
|
+
assumptionId?: string;
|
|
33
|
+
category?: string;
|
|
34
|
+
statement: string;
|
|
35
|
+
impact: string;
|
|
36
|
+
basis?: string;
|
|
37
|
+
evidenceRefs?: EvidenceReference[];
|
|
38
|
+
}>;
|
|
39
|
+
criticalAssumptions?: string[];
|
|
40
|
+
}
|
|
41
|
+
export interface DataQualityPayload {
|
|
42
|
+
summary: string;
|
|
43
|
+
parseStatus?: string;
|
|
44
|
+
confidence?: number;
|
|
45
|
+
missingInputs?: string[];
|
|
46
|
+
blockedInputs?: string[];
|
|
47
|
+
checks?: Array<{
|
|
48
|
+
name: string;
|
|
49
|
+
status: string;
|
|
50
|
+
detail: string;
|
|
51
|
+
}>;
|
|
52
|
+
}
|
|
53
|
+
export interface AnalysisPlanPayload {
|
|
54
|
+
summary: string;
|
|
55
|
+
steps?: Array<{
|
|
56
|
+
label: string;
|
|
57
|
+
detail?: string;
|
|
58
|
+
}>;
|
|
59
|
+
methods?: string[];
|
|
60
|
+
}
|
|
61
|
+
export interface ResultsPayload {
|
|
62
|
+
summary: string;
|
|
63
|
+
analysesRun?: string[];
|
|
64
|
+
records?: Array<{
|
|
65
|
+
resultId?: string;
|
|
66
|
+
label: string;
|
|
67
|
+
method?: string;
|
|
68
|
+
toolName?: string;
|
|
69
|
+
interpretation?: string;
|
|
70
|
+
metrics?: Array<{
|
|
71
|
+
name: string;
|
|
72
|
+
value: number | string | null;
|
|
73
|
+
units?: string;
|
|
74
|
+
threshold?: string;
|
|
75
|
+
status?: string;
|
|
76
|
+
}>;
|
|
77
|
+
warnings?: string[];
|
|
78
|
+
evidenceRefs?: EvidenceReference[];
|
|
79
|
+
}>;
|
|
80
|
+
}
|
|
81
|
+
export interface OptionMatrixPayload {
|
|
82
|
+
summary: string;
|
|
83
|
+
preferredOptionId?: string;
|
|
84
|
+
decisionBasis?: string[];
|
|
85
|
+
rows?: Array<{
|
|
86
|
+
optionId?: string;
|
|
87
|
+
label: string;
|
|
88
|
+
category?: string;
|
|
89
|
+
safety?: string;
|
|
90
|
+
settlement?: string;
|
|
91
|
+
constructability?: string;
|
|
92
|
+
cost?: string;
|
|
93
|
+
scheduleRisk?: string;
|
|
94
|
+
rank: number;
|
|
95
|
+
rationale?: string;
|
|
96
|
+
supportingResultIds?: string[];
|
|
97
|
+
}>;
|
|
98
|
+
}
|
|
99
|
+
export interface ReviewChecklistPayload {
|
|
100
|
+
summary: string;
|
|
101
|
+
items?: Array<{
|
|
102
|
+
itemId?: string;
|
|
103
|
+
category?: string;
|
|
104
|
+
question: string;
|
|
105
|
+
status: string;
|
|
106
|
+
detail?: string;
|
|
107
|
+
}>;
|
|
108
|
+
}
|
|
109
|
+
export interface AcceptanceStatusPayload {
|
|
110
|
+
summary: string;
|
|
111
|
+
verdict?: string;
|
|
112
|
+
confidence?: number;
|
|
113
|
+
reasons?: string[];
|
|
114
|
+
}
|
|
115
|
+
export interface IssuesAndCorrectionsPayload {
|
|
116
|
+
summary: string;
|
|
117
|
+
issues?: Array<{
|
|
118
|
+
issueId?: string;
|
|
119
|
+
severity?: string;
|
|
120
|
+
issue: string;
|
|
121
|
+
correction: string;
|
|
122
|
+
affectedArtifacts?: string[];
|
|
123
|
+
}>;
|
|
124
|
+
}
|
|
125
|
+
export interface FinalReportPayload {
|
|
126
|
+
summary: string;
|
|
127
|
+
markdown?: string;
|
|
128
|
+
recommendation?: string;
|
|
129
|
+
assumptionTable?: Array<{
|
|
130
|
+
assumption: string;
|
|
131
|
+
impact: string;
|
|
132
|
+
basis?: string;
|
|
133
|
+
}>;
|
|
134
|
+
evidenceTable?: Array<{
|
|
135
|
+
evidenceId?: string;
|
|
136
|
+
class: string;
|
|
137
|
+
label: string;
|
|
138
|
+
source: string;
|
|
139
|
+
summary?: string;
|
|
140
|
+
}>;
|
|
141
|
+
}
|
|
142
|
+
export interface ScenarioArtifactPayloadMap {
|
|
143
|
+
'ground-model': GroundModelPayload;
|
|
144
|
+
assumptions: AssumptionsPayload;
|
|
145
|
+
'data-quality': DataQualityPayload;
|
|
146
|
+
'analysis-plan': AnalysisPlanPayload;
|
|
147
|
+
results: ResultsPayload;
|
|
148
|
+
'option-matrix': OptionMatrixPayload;
|
|
149
|
+
'review-checklist': ReviewChecklistPayload;
|
|
150
|
+
'acceptance-status': AcceptanceStatusPayload;
|
|
151
|
+
'issues-and-corrections': IssuesAndCorrectionsPayload;
|
|
152
|
+
'final-report': FinalReportPayload;
|
|
153
|
+
}
|
|
154
|
+
export interface ScenarioArtifact<T extends ScenarioArtifactType = ScenarioArtifactType> {
|
|
155
|
+
artifactId: string;
|
|
156
|
+
projectId: string;
|
|
157
|
+
scenarioId: string;
|
|
158
|
+
artifactType: T;
|
|
159
|
+
version: number;
|
|
160
|
+
title: string;
|
|
161
|
+
payload: ScenarioArtifactPayloadMap[T];
|
|
162
|
+
warnings?: string[];
|
|
163
|
+
assumptionsUsed?: string[];
|
|
164
|
+
evidenceRefs?: EvidenceReference[];
|
|
165
|
+
derivedFrom?: string[];
|
|
166
|
+
}
|
|
167
|
+
export interface CaseFileArtifactBundle {
|
|
168
|
+
artifacts: Partial<Record<ScenarioArtifactType, ScenarioArtifact>>;
|
|
169
|
+
}
|
|
170
|
+
export interface CaseFileReportSection {
|
|
171
|
+
title: string;
|
|
172
|
+
content: string;
|
|
173
|
+
}
|
|
174
|
+
export interface CaseFileGeneratedReport {
|
|
175
|
+
title: string;
|
|
176
|
+
summary: string;
|
|
177
|
+
sections: CaseFileReportSection[];
|
|
178
|
+
fullMarkdown: string;
|
|
179
|
+
latencyMs: number;
|
|
180
|
+
metadata: {
|
|
181
|
+
source: 'case-file';
|
|
182
|
+
projectName?: string;
|
|
183
|
+
scenarioId?: string;
|
|
184
|
+
task?: string;
|
|
185
|
+
artifactTypes: ScenarioArtifactType[];
|
|
186
|
+
missingArtifactTypes: ScenarioArtifactType[];
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
export interface CaseFileReportInput {
|
|
190
|
+
projectName?: string;
|
|
191
|
+
scenarioId?: string;
|
|
192
|
+
task?: string;
|
|
193
|
+
location?: string;
|
|
194
|
+
title?: string;
|
|
195
|
+
artifacts: Partial<Record<ScenarioArtifactType, ScenarioArtifact>>;
|
|
196
|
+
}
|
|
197
|
+
export interface GenerateStoredCaseFileReportOptions {
|
|
198
|
+
projectId: string;
|
|
199
|
+
scenarioId: string;
|
|
200
|
+
projectName?: string;
|
|
201
|
+
task?: string;
|
|
202
|
+
location?: string;
|
|
203
|
+
title?: string;
|
|
204
|
+
}
|
|
205
|
+
export declare function buildArtifactDrivenReport(input: CaseFileReportInput): CaseFileGeneratedReport;
|
|
206
|
+
export declare function generateReportFromCaseFile(input: CaseFileReportInput | GenerateStoredCaseFileReportOptions): Promise<CaseFileGeneratedReport>;
|
|
207
|
+
//# sourceMappingURL=casefile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"casefile.d.ts","sourceRoot":"","sources":["../../src/report/casefile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
import { loadLatestScenarioArtifacts, loadScenarioCaseFile, } from '../agents/case-file.js';
|
|
2
|
+
const ARTIFACT_ORDER = [
|
|
3
|
+
'ground-model',
|
|
4
|
+
'assumptions',
|
|
5
|
+
'data-quality',
|
|
6
|
+
'analysis-plan',
|
|
7
|
+
'results',
|
|
8
|
+
'option-matrix',
|
|
9
|
+
'review-checklist',
|
|
10
|
+
'acceptance-status',
|
|
11
|
+
'issues-and-corrections',
|
|
12
|
+
'final-report',
|
|
13
|
+
];
|
|
14
|
+
function escapeCell(value) {
|
|
15
|
+
return value.replace(/\|/g, '\\|').replace(/\r?\n/g, ' ');
|
|
16
|
+
}
|
|
17
|
+
function table(headers, rows) {
|
|
18
|
+
if (rows.length === 0) {
|
|
19
|
+
return '_None._';
|
|
20
|
+
}
|
|
21
|
+
const headerRow = `| ${headers.map(escapeCell).join(' | ')} |`;
|
|
22
|
+
const dividerRow = `| ${headers.map(() => '---').join(' | ')} |`;
|
|
23
|
+
const bodyRows = rows.map((row) => `| ${row.map(escapeCell).join(' | ')} |`);
|
|
24
|
+
return [headerRow, dividerRow, ...bodyRows].join('\n');
|
|
25
|
+
}
|
|
26
|
+
function bullets(values) {
|
|
27
|
+
if (!values || values.length === 0) {
|
|
28
|
+
return '_None._';
|
|
29
|
+
}
|
|
30
|
+
return values.map((value) => `- ${value}`).join('\n');
|
|
31
|
+
}
|
|
32
|
+
function renderGroundModel(payload) {
|
|
33
|
+
if (!payload) {
|
|
34
|
+
return 'No ground-model artifact was available.';
|
|
35
|
+
}
|
|
36
|
+
const strataRows = (payload.strata ?? []).map((stratum) => [
|
|
37
|
+
`${stratum.fromM}`,
|
|
38
|
+
`${stratum.toM}`,
|
|
39
|
+
stratum.material,
|
|
40
|
+
stratum.uscsSymbol ?? '-',
|
|
41
|
+
stratum.description ?? '-',
|
|
42
|
+
]);
|
|
43
|
+
const groundwater = payload.groundwater
|
|
44
|
+
? `Detected: ${payload.groundwater.detected ? 'yes' : 'no'}\nDepth: ${payload.groundwater.depthM ?? 'unknown'} m${payload.groundwater.note ? `\nNote: ${payload.groundwater.note}` : ''}`
|
|
45
|
+
: 'No groundwater information was available.';
|
|
46
|
+
const missing = payload.missingInputs && payload.missingInputs.length > 0
|
|
47
|
+
? `\n\n### Missing inputs\n${bullets(payload.missingInputs)}`
|
|
48
|
+
: '';
|
|
49
|
+
const blocked = payload.blockedInputs && payload.blockedInputs.length > 0
|
|
50
|
+
? `\n\n### Blocked inputs\n${bullets(payload.blockedInputs)}`
|
|
51
|
+
: '';
|
|
52
|
+
return [
|
|
53
|
+
payload.summary,
|
|
54
|
+
'',
|
|
55
|
+
'### Strata',
|
|
56
|
+
table(['From (m)', 'To (m)', 'Material', 'USCS', 'Description'], strataRows),
|
|
57
|
+
'',
|
|
58
|
+
'### Groundwater',
|
|
59
|
+
groundwater,
|
|
60
|
+
missing,
|
|
61
|
+
blocked,
|
|
62
|
+
].join('\n').trim();
|
|
63
|
+
}
|
|
64
|
+
function renderAssumptions(payload) {
|
|
65
|
+
if (!payload) {
|
|
66
|
+
return 'No assumptions artifact was available.';
|
|
67
|
+
}
|
|
68
|
+
const rows = (payload.assumptions ?? []).map((item) => [
|
|
69
|
+
item.category ?? '-',
|
|
70
|
+
item.statement,
|
|
71
|
+
item.impact,
|
|
72
|
+
item.basis ?? '-',
|
|
73
|
+
]);
|
|
74
|
+
return [
|
|
75
|
+
payload.summary,
|
|
76
|
+
'',
|
|
77
|
+
'### Assumptions',
|
|
78
|
+
table(['Category', 'Statement', 'Impact', 'Basis'], rows),
|
|
79
|
+
'',
|
|
80
|
+
'### Critical assumptions',
|
|
81
|
+
bullets(payload.criticalAssumptions),
|
|
82
|
+
].join('\n').trim();
|
|
83
|
+
}
|
|
84
|
+
function renderDataQuality(payload) {
|
|
85
|
+
if (!payload) {
|
|
86
|
+
return 'No data-quality artifact was available.';
|
|
87
|
+
}
|
|
88
|
+
const checks = (payload.checks ?? []).map((check) => [
|
|
89
|
+
check.name,
|
|
90
|
+
check.status.toUpperCase(),
|
|
91
|
+
check.detail,
|
|
92
|
+
]);
|
|
93
|
+
return [
|
|
94
|
+
payload.summary,
|
|
95
|
+
'',
|
|
96
|
+
`Parse status: ${payload.parseStatus ? payload.parseStatus.toUpperCase() : 'UNKNOWN'}`,
|
|
97
|
+
`Confidence: ${payload.confidence == null ? 'unknown' : `${payload.confidence}%`}`,
|
|
98
|
+
'',
|
|
99
|
+
'### Missing inputs',
|
|
100
|
+
bullets(payload.missingInputs),
|
|
101
|
+
'',
|
|
102
|
+
'### Blocked inputs',
|
|
103
|
+
bullets(payload.blockedInputs),
|
|
104
|
+
'',
|
|
105
|
+
'### Checks',
|
|
106
|
+
table(['Check', 'Status', 'Detail'], checks),
|
|
107
|
+
].join('\n').trim();
|
|
108
|
+
}
|
|
109
|
+
function renderAnalysisPlan(payload) {
|
|
110
|
+
if (!payload) {
|
|
111
|
+
return 'No analysis-plan artifact was available.';
|
|
112
|
+
}
|
|
113
|
+
const rows = (payload.steps ?? []).map((step) => [step.label, step.detail ?? '-']);
|
|
114
|
+
return [
|
|
115
|
+
payload.summary,
|
|
116
|
+
'',
|
|
117
|
+
'### Methods',
|
|
118
|
+
bullets(payload.methods),
|
|
119
|
+
'',
|
|
120
|
+
'### Steps',
|
|
121
|
+
table(['Step', 'Detail'], rows),
|
|
122
|
+
].join('\n').trim();
|
|
123
|
+
}
|
|
124
|
+
function renderResults(payload) {
|
|
125
|
+
if (!payload) {
|
|
126
|
+
return 'No results artifact was available.';
|
|
127
|
+
}
|
|
128
|
+
const records = (payload.records ?? []).map((record) => {
|
|
129
|
+
const metrics = table(['Metric', 'Value', 'Units', 'Threshold', 'Status'], (record.metrics ?? []).map((metric) => [
|
|
130
|
+
metric.name,
|
|
131
|
+
metric.value == null ? '-' : String(metric.value),
|
|
132
|
+
metric.units ?? '-',
|
|
133
|
+
metric.threshold ?? '-',
|
|
134
|
+
metric.status ? metric.status.toUpperCase() : '-',
|
|
135
|
+
]));
|
|
136
|
+
return [
|
|
137
|
+
`### ${record.label}`,
|
|
138
|
+
record.method ? `Method: ${record.method}` : undefined,
|
|
139
|
+
record.toolName ? `Tool: ${record.toolName}` : undefined,
|
|
140
|
+
'',
|
|
141
|
+
metrics,
|
|
142
|
+
'',
|
|
143
|
+
record.interpretation ?? '_No interpretation was recorded._',
|
|
144
|
+
record.warnings && record.warnings.length > 0 ? `\nWarnings:\n${bullets(record.warnings)}` : '',
|
|
145
|
+
].filter((value) => Boolean(value)).join('\n');
|
|
146
|
+
});
|
|
147
|
+
return [
|
|
148
|
+
payload.summary,
|
|
149
|
+
'',
|
|
150
|
+
'### Analyses run',
|
|
151
|
+
bullets(payload.analysesRun),
|
|
152
|
+
'',
|
|
153
|
+
records.length > 0 ? records.join('\n\n') : '_No calculation records were stored._',
|
|
154
|
+
].join('\n').trim();
|
|
155
|
+
}
|
|
156
|
+
function renderOptionMatrix(payload) {
|
|
157
|
+
if (!payload) {
|
|
158
|
+
return 'No option-matrix artifact was available.';
|
|
159
|
+
}
|
|
160
|
+
const rows = (payload.rows ?? [])
|
|
161
|
+
.slice()
|
|
162
|
+
.sort((left, right) => left.rank - right.rank)
|
|
163
|
+
.map((row) => [
|
|
164
|
+
String(row.rank),
|
|
165
|
+
row.label,
|
|
166
|
+
row.category ?? '-',
|
|
167
|
+
row.safety ?? '-',
|
|
168
|
+
row.settlement ?? '-',
|
|
169
|
+
row.constructability ?? '-',
|
|
170
|
+
row.cost ?? '-',
|
|
171
|
+
row.scheduleRisk ?? '-',
|
|
172
|
+
row.rationale ?? '-',
|
|
173
|
+
]);
|
|
174
|
+
return [
|
|
175
|
+
payload.summary,
|
|
176
|
+
'',
|
|
177
|
+
`Preferred option: ${payload.preferredOptionId ?? 'Not selected'}`,
|
|
178
|
+
'',
|
|
179
|
+
'### Decision basis',
|
|
180
|
+
bullets(payload.decisionBasis),
|
|
181
|
+
'',
|
|
182
|
+
'### Ranked options',
|
|
183
|
+
table(['Rank', 'Option', 'Category', 'Safety', 'Settlement', 'Constructability', 'Cost', 'Schedule risk', 'Rationale'], rows),
|
|
184
|
+
].join('\n').trim();
|
|
185
|
+
}
|
|
186
|
+
function renderReviewChecklist(payload) {
|
|
187
|
+
if (!payload) {
|
|
188
|
+
return 'No review-checklist artifact was available.';
|
|
189
|
+
}
|
|
190
|
+
const rows = (payload.items ?? []).map((item) => [
|
|
191
|
+
item.category ?? '-',
|
|
192
|
+
item.question,
|
|
193
|
+
item.status.toUpperCase(),
|
|
194
|
+
item.detail ?? '-',
|
|
195
|
+
]);
|
|
196
|
+
return [
|
|
197
|
+
payload.summary,
|
|
198
|
+
'',
|
|
199
|
+
'### Review checklist',
|
|
200
|
+
table(['Category', 'Question', 'Status', 'Detail'], rows),
|
|
201
|
+
].join('\n').trim();
|
|
202
|
+
}
|
|
203
|
+
function renderAcceptanceStatus(payload) {
|
|
204
|
+
if (!payload) {
|
|
205
|
+
return 'No acceptance-status artifact was available.';
|
|
206
|
+
}
|
|
207
|
+
return [
|
|
208
|
+
payload.summary,
|
|
209
|
+
'',
|
|
210
|
+
`Verdict: ${payload.verdict ?? 'UNKNOWN'}`,
|
|
211
|
+
`Confidence: ${payload.confidence == null ? 'unknown' : `${payload.confidence}%`}`,
|
|
212
|
+
'',
|
|
213
|
+
'### Reasons',
|
|
214
|
+
bullets(payload.reasons),
|
|
215
|
+
].join('\n').trim();
|
|
216
|
+
}
|
|
217
|
+
function renderIssuesAndCorrections(payload) {
|
|
218
|
+
if (!payload) {
|
|
219
|
+
return 'No issues-and-corrections artifact was available.';
|
|
220
|
+
}
|
|
221
|
+
const rows = (payload.issues ?? []).map((issue) => [
|
|
222
|
+
issue.severity ?? '-',
|
|
223
|
+
issue.issue,
|
|
224
|
+
issue.correction,
|
|
225
|
+
(issue.affectedArtifacts ?? []).join(', ') || '-',
|
|
226
|
+
]);
|
|
227
|
+
return [
|
|
228
|
+
payload.summary,
|
|
229
|
+
'',
|
|
230
|
+
'### Issues and corrections',
|
|
231
|
+
table(['Severity', 'Issue', 'Correction', 'Affected artifacts'], rows),
|
|
232
|
+
].join('\n').trim();
|
|
233
|
+
}
|
|
234
|
+
function compareText(left, right) {
|
|
235
|
+
return left.localeCompare(right, 'en');
|
|
236
|
+
}
|
|
237
|
+
function collectEvidenceRows(artifacts) {
|
|
238
|
+
const seen = new Set();
|
|
239
|
+
const rows = [];
|
|
240
|
+
for (const artifactType of ARTIFACT_ORDER) {
|
|
241
|
+
const artifact = artifacts[artifactType];
|
|
242
|
+
const references = [];
|
|
243
|
+
if (artifact?.evidenceRefs) {
|
|
244
|
+
references.push(...artifact.evidenceRefs);
|
|
245
|
+
}
|
|
246
|
+
const payload = artifact?.payload;
|
|
247
|
+
if (artifactType === 'ground-model') {
|
|
248
|
+
const groundModel = payload;
|
|
249
|
+
for (const stratum of groundModel?.strata ?? []) {
|
|
250
|
+
if (stratum.evidenceRefs) {
|
|
251
|
+
references.push(...stratum.evidenceRefs);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
else if (artifactType === 'assumptions') {
|
|
256
|
+
const assumptions = payload;
|
|
257
|
+
for (const assumption of assumptions?.assumptions ?? []) {
|
|
258
|
+
if (assumption.evidenceRefs) {
|
|
259
|
+
references.push(...assumption.evidenceRefs);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
else if (artifactType === 'results') {
|
|
264
|
+
const results = payload;
|
|
265
|
+
for (const record of results?.records ?? []) {
|
|
266
|
+
if (record.evidenceRefs) {
|
|
267
|
+
references.push(...record.evidenceRefs);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
for (const reference of references) {
|
|
272
|
+
const key = `${artifactType}::${reference.class}::${reference.label}::${reference.source}`;
|
|
273
|
+
if (seen.has(key)) {
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
seen.add(key);
|
|
277
|
+
rows.push({
|
|
278
|
+
artifactType,
|
|
279
|
+
class: reference.class,
|
|
280
|
+
label: reference.label,
|
|
281
|
+
source: reference.source,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
const artifactOrder = new Map(ARTIFACT_ORDER.map((artifactType, index) => [artifactType, index]));
|
|
286
|
+
return rows.sort((left, right) => ((artifactOrder.get(left.artifactType) ?? Number.MAX_SAFE_INTEGER)
|
|
287
|
+
- (artifactOrder.get(right.artifactType) ?? Number.MAX_SAFE_INTEGER)
|
|
288
|
+
|| compareText(left.class, right.class)
|
|
289
|
+
|| compareText(left.label, right.label)
|
|
290
|
+
|| compareText(left.source, right.source)));
|
|
291
|
+
}
|
|
292
|
+
function renderEvidenceRecords(artifacts) {
|
|
293
|
+
const rows = collectEvidenceRows(artifacts).map((row) => [
|
|
294
|
+
row.artifactType,
|
|
295
|
+
row.class,
|
|
296
|
+
row.label,
|
|
297
|
+
row.source,
|
|
298
|
+
]);
|
|
299
|
+
return [
|
|
300
|
+
'### Evidence records',
|
|
301
|
+
table(['Artifact', 'Class', 'Label', 'Source'], rows),
|
|
302
|
+
].join('\n').trim();
|
|
303
|
+
}
|
|
304
|
+
function renderEvidenceTable(payload) {
|
|
305
|
+
if (!payload) {
|
|
306
|
+
return 'No final-report artifact was available.';
|
|
307
|
+
}
|
|
308
|
+
const rows = (payload.evidenceTable ?? [])
|
|
309
|
+
.slice()
|
|
310
|
+
.sort((left, right) => (compareText(left.class, right.class)
|
|
311
|
+
|| compareText(left.label, right.label)
|
|
312
|
+
|| compareText(left.source, right.source)))
|
|
313
|
+
.map((item) => [item.class, item.label, item.source]);
|
|
314
|
+
return [
|
|
315
|
+
'### Evidence table',
|
|
316
|
+
table(['Class', 'Label', 'Source'], rows),
|
|
317
|
+
].join('\n').trim();
|
|
318
|
+
}
|
|
319
|
+
function renderFinalReport(payload) {
|
|
320
|
+
if (!payload) {
|
|
321
|
+
return 'No final-report artifact was available.';
|
|
322
|
+
}
|
|
323
|
+
const body = payload.markdown?.trim() || payload.summary;
|
|
324
|
+
const extras = [];
|
|
325
|
+
const assumptionTable = payload.assumptionTable ?? [];
|
|
326
|
+
if (payload.recommendation) {
|
|
327
|
+
extras.push(`Recommendation: ${payload.recommendation}`);
|
|
328
|
+
}
|
|
329
|
+
if (assumptionTable.length > 0) {
|
|
330
|
+
extras.push([
|
|
331
|
+
'### Assumption table',
|
|
332
|
+
table(['Assumption', 'Impact', 'Basis'], assumptionTable.map((item) => [item.assumption, item.impact, item.basis ?? '-'])),
|
|
333
|
+
].join('\n'));
|
|
334
|
+
}
|
|
335
|
+
if ((payload.evidenceTable ?? []).length > 0) {
|
|
336
|
+
extras.push(renderEvidenceTable(payload));
|
|
337
|
+
}
|
|
338
|
+
return [body, ...extras].join('\n\n').trim();
|
|
339
|
+
}
|
|
340
|
+
function pickSummary(input) {
|
|
341
|
+
const finalReport = input.artifacts['final-report']?.payload;
|
|
342
|
+
if (finalReport?.summary)
|
|
343
|
+
return finalReport.summary;
|
|
344
|
+
const acceptance = input.artifacts['acceptance-status']?.payload;
|
|
345
|
+
if (acceptance?.summary)
|
|
346
|
+
return acceptance.summary;
|
|
347
|
+
const optionMatrix = input.artifacts['option-matrix']?.payload;
|
|
348
|
+
if (optionMatrix?.summary)
|
|
349
|
+
return optionMatrix.summary;
|
|
350
|
+
const results = input.artifacts.results?.payload;
|
|
351
|
+
if (results?.summary)
|
|
352
|
+
return results.summary;
|
|
353
|
+
const groundModel = input.artifacts['ground-model']?.payload;
|
|
354
|
+
if (groundModel?.summary)
|
|
355
|
+
return groundModel.summary;
|
|
356
|
+
const dataQuality = input.artifacts['data-quality']?.payload;
|
|
357
|
+
if (dataQuality?.summary)
|
|
358
|
+
return dataQuality.summary;
|
|
359
|
+
return input.task
|
|
360
|
+
? `Case-file report for ${input.task}.`
|
|
361
|
+
: 'Case-file report assembled from typed artifacts.';
|
|
362
|
+
}
|
|
363
|
+
function buildSection(title, content) {
|
|
364
|
+
return { title, content };
|
|
365
|
+
}
|
|
366
|
+
export function buildArtifactDrivenReport(input) {
|
|
367
|
+
const artifactTypes = ARTIFACT_ORDER.filter((artifactType) => Boolean(input.artifacts[artifactType]));
|
|
368
|
+
const missingArtifactTypes = ARTIFACT_ORDER.filter((artifactType) => !input.artifacts[artifactType]);
|
|
369
|
+
const summary = pickSummary(input);
|
|
370
|
+
const title = input.title
|
|
371
|
+
?? `${input.projectName ?? 'geotechCLI Project'}${input.scenarioId ? ` / ${input.scenarioId}` : ''} Report`;
|
|
372
|
+
const sections = [
|
|
373
|
+
buildSection('Executive Summary', summary),
|
|
374
|
+
buildSection('Project and Scenario', [
|
|
375
|
+
input.projectName ? `Project: ${input.projectName}` : 'Project: not specified',
|
|
376
|
+
input.scenarioId ? `Scenario: ${input.scenarioId}` : 'Scenario: not specified',
|
|
377
|
+
input.location ? `Location: ${input.location}` : 'Location: not specified',
|
|
378
|
+
input.task ? `Task: ${input.task}` : 'Task: not specified',
|
|
379
|
+
].join('\n')),
|
|
380
|
+
buildSection('Ground Model', renderGroundModel(input.artifacts['ground-model']?.payload)),
|
|
381
|
+
buildSection('Assumptions', renderAssumptions(input.artifacts.assumptions?.payload)),
|
|
382
|
+
buildSection('Data Quality', renderDataQuality(input.artifacts['data-quality']?.payload)),
|
|
383
|
+
buildSection('Analysis Plan', renderAnalysisPlan(input.artifacts['analysis-plan']?.payload)),
|
|
384
|
+
buildSection('Results', renderResults(input.artifacts.results?.payload)),
|
|
385
|
+
buildSection('Evidence Records', renderEvidenceRecords(input.artifacts)),
|
|
386
|
+
buildSection('Option Matrix', renderOptionMatrix(input.artifacts['option-matrix']?.payload)),
|
|
387
|
+
buildSection('Review Checklist', renderReviewChecklist(input.artifacts['review-checklist']?.payload)),
|
|
388
|
+
buildSection('Acceptance Status', renderAcceptanceStatus(input.artifacts['acceptance-status']?.payload)),
|
|
389
|
+
buildSection('Issues and Corrections', renderIssuesAndCorrections(input.artifacts['issues-and-corrections']?.payload)),
|
|
390
|
+
buildSection('Final Report', renderFinalReport(input.artifacts['final-report']?.payload)),
|
|
391
|
+
buildSection('Missing Artifacts', missingArtifactTypes.length > 0 ? bullets(missingArtifactTypes) : '_None._'),
|
|
392
|
+
];
|
|
393
|
+
const markdownLines = [
|
|
394
|
+
`# ${title}`,
|
|
395
|
+
'',
|
|
396
|
+
`> ${summary}`,
|
|
397
|
+
'',
|
|
398
|
+
];
|
|
399
|
+
for (const section of sections) {
|
|
400
|
+
markdownLines.push(`## ${section.title}`);
|
|
401
|
+
markdownLines.push(section.content);
|
|
402
|
+
markdownLines.push('');
|
|
403
|
+
}
|
|
404
|
+
return {
|
|
405
|
+
title,
|
|
406
|
+
summary,
|
|
407
|
+
sections,
|
|
408
|
+
fullMarkdown: markdownLines.join('\n').trim(),
|
|
409
|
+
latencyMs: 1,
|
|
410
|
+
metadata: {
|
|
411
|
+
source: 'case-file',
|
|
412
|
+
projectName: input.projectName,
|
|
413
|
+
scenarioId: input.scenarioId,
|
|
414
|
+
task: input.task,
|
|
415
|
+
artifactTypes,
|
|
416
|
+
missingArtifactTypes,
|
|
417
|
+
},
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
export async function generateReportFromCaseFile(input) {
|
|
421
|
+
if ('artifacts' in input) {
|
|
422
|
+
return buildArtifactDrivenReport(input);
|
|
423
|
+
}
|
|
424
|
+
const caseFile = loadScenarioCaseFile(input.projectId, input.scenarioId);
|
|
425
|
+
if (!caseFile) {
|
|
426
|
+
throw new Error(`Case file "${input.scenarioId}" was not found in project "${input.projectId}".`);
|
|
427
|
+
}
|
|
428
|
+
const artifacts = loadLatestScenarioArtifacts(input.projectId, input.scenarioId);
|
|
429
|
+
return buildArtifactDrivenReport({
|
|
430
|
+
projectName: input.projectName ?? input.projectId,
|
|
431
|
+
scenarioId: input.scenarioId,
|
|
432
|
+
task: input.task ?? caseFile.title,
|
|
433
|
+
location: input.location,
|
|
434
|
+
title: input.title ?? `${caseFile.title} Report`,
|
|
435
|
+
artifacts,
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
//# sourceMappingURL=casefile.js.map
|