@geotechcli/core 0.4.91 → 0.4.93

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 (47) hide show
  1. package/dist/agents/brain.d.ts +2 -0
  2. package/dist/agents/brain.d.ts.map +1 -1
  3. package/dist/agents/brain.js +92 -2
  4. package/dist/agents/brain.js.map +1 -1
  5. package/dist/agents/data-tools.js +1 -6
  6. package/dist/agents/data-tools.js.map +1 -1
  7. package/dist/agents/fem-tools.js +101 -3
  8. package/dist/agents/fem-tools.js.map +1 -1
  9. package/dist/agents/safety.d.ts.map +1 -1
  10. package/dist/agents/safety.js +35 -2
  11. package/dist/agents/safety.js.map +1 -1
  12. package/dist/agents/swarm-planner.js +2 -2
  13. package/dist/agents/swarm-planner.js.map +1 -1
  14. package/dist/agents/swarm.d.ts.map +1 -1
  15. package/dist/agents/swarm.js +3 -0
  16. package/dist/agents/swarm.js.map +1 -1
  17. package/dist/agents/tool-normalization.d.ts.map +1 -1
  18. package/dist/agents/tool-normalization.js +372 -0
  19. package/dist/agents/tool-normalization.js.map +1 -1
  20. package/dist/fem/engineering-evidence.d.ts +236 -0
  21. package/dist/fem/engineering-evidence.d.ts.map +1 -0
  22. package/dist/fem/engineering-evidence.js +583 -0
  23. package/dist/fem/engineering-evidence.js.map +1 -0
  24. package/dist/fem/ground-model-draft.d.ts +12 -0
  25. package/dist/fem/ground-model-draft.d.ts.map +1 -1
  26. package/dist/fem/ground-model-draft.js +60 -0
  27. package/dist/fem/ground-model-draft.js.map +1 -1
  28. package/dist/fem/index.d.ts +4 -1
  29. package/dist/fem/index.d.ts.map +1 -1
  30. package/dist/fem/index.js +4 -1
  31. package/dist/fem/index.js.map +1 -1
  32. package/dist/fem/production-readiness.d.ts +36 -0
  33. package/dist/fem/production-readiness.d.ts.map +1 -0
  34. package/dist/fem/production-readiness.js +181 -0
  35. package/dist/fem/production-readiness.js.map +1 -0
  36. package/dist/fem/routing.js +3 -3
  37. package/dist/fem/routing.js.map +1 -1
  38. package/dist/fem/scenario-validation.d.ts +53 -0
  39. package/dist/fem/scenario-validation.d.ts.map +1 -0
  40. package/dist/fem/scenario-validation.js +125 -0
  41. package/dist/fem/scenario-validation.js.map +1 -0
  42. package/dist/ingest/document-evidence-packet.d.ts +4 -4
  43. package/dist/meta/metadata.json +1 -1
  44. package/dist/workspace/resolve-root.d.ts.map +1 -1
  45. package/dist/workspace/resolve-root.js +26 -18
  46. package/dist/workspace/resolve-root.js.map +1 -1
  47. package/package.json +1 -1
@@ -0,0 +1,53 @@
1
+ import type { FemObjective, FemResultEnvelope, FemResultManifest, FemValidationSummary } from './types.js';
2
+ export type FemScenarioMetric = keyof FemResultEnvelope;
3
+ export interface FemScenarioRangeExpectation {
4
+ metric: FemScenarioMetric;
5
+ min?: number;
6
+ max?: number;
7
+ equals?: number;
8
+ tolerance?: number;
9
+ required?: boolean;
10
+ }
11
+ export interface FemScenarioExpectation {
12
+ schemaVersion: 'fem-scenario-expectation.v1';
13
+ scenarioId: string;
14
+ objective: FemObjective;
15
+ backendId: FemResultManifest['backend']['id'];
16
+ validationStatus?: FemValidationSummary['status'];
17
+ envelope: FemScenarioRangeExpectation[];
18
+ requiredResultFields?: string[];
19
+ requiredReviewCodes?: string[];
20
+ }
21
+ export interface FemScenarioValidation {
22
+ schemaVersion: 'fem-scenario-validation.v1';
23
+ scenarioId: string;
24
+ status: 'accepted' | 'blocked';
25
+ blockerCodes: string[];
26
+ warnings: string[];
27
+ }
28
+ export interface FemScenarioRun {
29
+ scenarioId: string;
30
+ manifest: FemResultManifest;
31
+ expectation: FemScenarioExpectation;
32
+ }
33
+ export interface FemScenarioTrendExpectation {
34
+ id: string;
35
+ fromScenarioId: string;
36
+ toScenarioId: string;
37
+ metric: FemScenarioMetric;
38
+ relation: 'increase' | 'decrease' | 'approximately-equal';
39
+ minRatio?: number;
40
+ minDelta?: number;
41
+ tolerance?: number;
42
+ }
43
+ export interface FemScenarioSuiteValidation {
44
+ schemaVersion: 'fem-scenario-suite-validation.v1';
45
+ status: 'accepted' | 'blocked';
46
+ scenarioCount: number;
47
+ blockerCodes: string[];
48
+ warnings: string[];
49
+ scenarios: FemScenarioValidation[];
50
+ }
51
+ export declare function validateFemScenarioResult(manifest: FemResultManifest, expectation: FemScenarioExpectation): FemScenarioValidation;
52
+ export declare function validateFemScenarioSuite(runs: FemScenarioRun[], trends?: FemScenarioTrendExpectation[]): FemScenarioSuiteValidation;
53
+ //# sourceMappingURL=scenario-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario-validation.d.ts","sourceRoot":"","sources":["../../src/fem/scenario-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,iBAAiB,GAAG,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,iBAAiB,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,6BAA6B,CAAC;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,YAAY,CAAC;IACxB,SAAS,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9C,gBAAgB,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAClD,QAAQ,EAAE,2BAA2B,EAAE,CAAC;IACxC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,4BAA4B,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,WAAW,EAAE,sBAAsB,CAAC;CACrC;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,qBAAqB,CAAC;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,kCAAkC,CAAC;IAClD,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,qBAAqB,EAAE,CAAC;CACpC;AAkCD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,iBAAiB,EAC3B,WAAW,EAAE,sBAAsB,GAClC,qBAAqB,CAiDvB;AAyCD,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,cAAc,EAAE,EACtB,MAAM,GAAE,2BAA2B,EAAO,GACzC,0BAA0B,CAkB5B"}
@@ -0,0 +1,125 @@
1
+ import { validateFemResultManifest } from './validation.js';
2
+ function metricValue(manifest, metric) {
3
+ const value = manifest.envelope[metric];
4
+ return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
5
+ }
6
+ function pushRangeBlockers(blockers, manifest, scenarioId, expectation) {
7
+ const value = metricValue(manifest, expectation.metric);
8
+ const required = expectation.required !== false;
9
+ const prefix = `${scenarioId}.${String(expectation.metric)}`;
10
+ if (value == null) {
11
+ if (required)
12
+ blockers.push(`${prefix}.missing`);
13
+ return;
14
+ }
15
+ if (expectation.min != null && value < expectation.min) {
16
+ blockers.push(`${prefix}.below-min`);
17
+ }
18
+ if (expectation.max != null && value > expectation.max) {
19
+ blockers.push(`${prefix}.above-max`);
20
+ }
21
+ if (expectation.equals != null) {
22
+ const tolerance = expectation.tolerance ?? 1e-6;
23
+ if (Math.abs(value - expectation.equals) > tolerance) {
24
+ blockers.push(`${prefix}.not-equal`);
25
+ }
26
+ }
27
+ }
28
+ export function validateFemScenarioResult(manifest, expectation) {
29
+ const blockers = [];
30
+ const warnings = [];
31
+ const resultValidation = validateFemResultManifest(manifest);
32
+ const scenarioId = expectation.scenarioId;
33
+ if (resultValidation.status === 'blocked') {
34
+ blockers.push(...resultValidation.findings
35
+ .filter((finding) => finding.severity === 'blocker')
36
+ .map((finding) => `${scenarioId}.result.${finding.code}`));
37
+ }
38
+ if (manifest.analysisCase.objective !== expectation.objective) {
39
+ blockers.push(`${scenarioId}.objective-mismatch`);
40
+ }
41
+ if (manifest.backend.id !== expectation.backendId) {
42
+ blockers.push(`${scenarioId}.backend-mismatch`);
43
+ }
44
+ if (expectation.validationStatus && resultValidation.status !== expectation.validationStatus) {
45
+ blockers.push(`${scenarioId}.validation-status-mismatch`);
46
+ }
47
+ for (const rangeExpectation of expectation.envelope) {
48
+ pushRangeBlockers(blockers, manifest, scenarioId, rangeExpectation);
49
+ }
50
+ const fieldIds = new Set((manifest.resultFields ?? []).map((field) => field.id));
51
+ for (const fieldId of expectation.requiredResultFields ?? []) {
52
+ if (!fieldIds.has(fieldId)) {
53
+ blockers.push(`${scenarioId}.result-field.${fieldId}.missing`);
54
+ }
55
+ }
56
+ const findingCodes = new Set(resultValidation.findings.map((finding) => finding.code));
57
+ for (const code of expectation.requiredReviewCodes ?? []) {
58
+ if (!findingCodes.has(code)) {
59
+ blockers.push(`${scenarioId}.review-code.${code}.missing`);
60
+ }
61
+ }
62
+ if (resultValidation.status === 'ready') {
63
+ warnings.push(`${scenarioId}.no-review-gates`);
64
+ }
65
+ return {
66
+ schemaVersion: 'fem-scenario-validation.v1',
67
+ scenarioId,
68
+ status: blockers.length === 0 ? 'accepted' : 'blocked',
69
+ blockerCodes: [...new Set(blockers)],
70
+ warnings,
71
+ };
72
+ }
73
+ function pushTrendBlockers(blockers, runsById, trend) {
74
+ const from = runsById.get(trend.fromScenarioId);
75
+ const to = runsById.get(trend.toScenarioId);
76
+ if (!from || !to) {
77
+ blockers.push(`${trend.id}.scenario-missing`);
78
+ return;
79
+ }
80
+ const fromValue = metricValue(from.manifest, trend.metric);
81
+ const toValue = metricValue(to.manifest, trend.metric);
82
+ if (fromValue == null || toValue == null) {
83
+ blockers.push(`${trend.id}.metric-missing`);
84
+ return;
85
+ }
86
+ const tolerance = trend.tolerance ?? 1e-6;
87
+ const delta = toValue - fromValue;
88
+ if (trend.relation === 'increase') {
89
+ if (delta <= (trend.minDelta ?? 0)) {
90
+ blockers.push(`${trend.id}.not-increased`);
91
+ }
92
+ if (trend.minRatio != null && (fromValue <= 0 || toValue / fromValue < trend.minRatio)) {
93
+ blockers.push(`${trend.id}.ratio-too-small`);
94
+ }
95
+ }
96
+ else if (trend.relation === 'decrease') {
97
+ if (-delta <= (trend.minDelta ?? 0)) {
98
+ blockers.push(`${trend.id}.not-decreased`);
99
+ }
100
+ if (trend.minRatio != null && (toValue <= 0 || fromValue / toValue < trend.minRatio)) {
101
+ blockers.push(`${trend.id}.ratio-too-small`);
102
+ }
103
+ }
104
+ else if (Math.abs(delta) > tolerance) {
105
+ blockers.push(`${trend.id}.not-approximately-equal`);
106
+ }
107
+ }
108
+ export function validateFemScenarioSuite(runs, trends = []) {
109
+ const scenarioValidations = runs.map((run) => validateFemScenarioResult(run.manifest, run.expectation));
110
+ const blockers = scenarioValidations.flatMap((validation) => validation.blockerCodes);
111
+ const warnings = scenarioValidations.flatMap((validation) => validation.warnings);
112
+ const runsById = new Map(runs.map((run) => [run.scenarioId, run]));
113
+ for (const trend of trends) {
114
+ pushTrendBlockers(blockers, runsById, trend);
115
+ }
116
+ return {
117
+ schemaVersion: 'fem-scenario-suite-validation.v1',
118
+ status: blockers.length === 0 ? 'accepted' : 'blocked',
119
+ scenarioCount: runs.length,
120
+ blockerCodes: [...new Set(blockers)],
121
+ warnings: [...new Set(warnings)],
122
+ scenarios: scenarioValidations,
123
+ };
124
+ }
125
+ //# sourceMappingURL=scenario-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario-validation.js","sourceRoot":"","sources":["../../src/fem/scenario-validation.ts"],"names":[],"mappings":"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"}
@@ -888,19 +888,19 @@ export declare const DocumentEvidencePacketSchema: z.ZodObject<{
888
888
  }, "strip", z.ZodTypeAny, {
889
889
  text: string;
890
890
  sourcePages: number[];
891
+ scope: "page" | "table" | "figure" | "section";
891
892
  pageRange: [number, number];
892
893
  chunkId: string;
893
894
  headingAncestry: string[];
894
- scope: "page" | "table" | "figure" | "section";
895
895
  sectionType?: string | undefined;
896
896
  significance?: number | undefined;
897
897
  }, {
898
898
  text: string;
899
899
  sourcePages: number[];
900
+ scope: "page" | "table" | "figure" | "section";
900
901
  pageRange: [number, number];
901
902
  chunkId: string;
902
903
  headingAncestry: string[];
903
- scope: "page" | "table" | "figure" | "section";
904
904
  sectionType?: string | undefined;
905
905
  significance?: number | undefined;
906
906
  }>, "many">;
@@ -1217,10 +1217,10 @@ export declare const DocumentEvidencePacketSchema: z.ZodObject<{
1217
1217
  contentChunks: {
1218
1218
  text: string;
1219
1219
  sourcePages: number[];
1220
+ scope: "page" | "table" | "figure" | "section";
1220
1221
  pageRange: [number, number];
1221
1222
  chunkId: string;
1222
1223
  headingAncestry: string[];
1223
- scope: "page" | "table" | "figure" | "section";
1224
1224
  sectionType?: string | undefined;
1225
1225
  significance?: number | undefined;
1226
1226
  }[];
@@ -1443,10 +1443,10 @@ export declare const DocumentEvidencePacketSchema: z.ZodObject<{
1443
1443
  contentChunks: {
1444
1444
  text: string;
1445
1445
  sourcePages: number[];
1446
+ scope: "page" | "table" | "figure" | "section";
1446
1447
  pageRange: [number, number];
1447
1448
  chunkId: string;
1448
1449
  headingAncestry: string[];
1449
- scope: "page" | "table" | "figure" | "section";
1450
1450
  sectionType?: string | undefined;
1451
1451
  significance?: number | undefined;
1452
1452
  }[];
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.4.91",
2
+ "version": "0.4.93",
3
3
  "defaults": {
4
4
  "provider": "hosted-beta",
5
5
  "model": "glm-5.1",
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-root.d.ts","sourceRoot":"","sources":["../../src/workspace/resolve-root.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,uBAAuB,GAC/B,wBAAwB,GACxB,sBAAsB,GACtB,UAAU,GACV,KAAK,CAAC;AAEV,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,uBAAuB,CAAC;IACpC,UAAU,EAAE,UAAU,GAAG,UAAU,CAAC;IACpC,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,EAAE,qBAAqB,CAAC;CACnC;AAED,MAAM,WAAW,2BAA2B;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAcD,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,2BAAgC,GAAG,aAAa,CAyC7F"}
1
+ {"version":3,"file":"resolve-root.d.ts","sourceRoot":"","sources":["../../src/workspace/resolve-root.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,uBAAuB,GAC/B,wBAAwB,GACxB,sBAAsB,GACtB,UAAU,GACV,KAAK,CAAC;AAEV,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,uBAAuB,CAAC;IACpC,UAAU,EAAE,UAAU,GAAG,UAAU,CAAC;IACpC,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,EAAE,qBAAqB,CAAC;CACnC;AAED,MAAM,WAAW,2BAA2B;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA+BD,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,2BAAgC,GAAG,aAAa,CA8B7F"}
@@ -1,11 +1,29 @@
1
1
  import { existsSync } from 'node:fs';
2
- import { dirname, join, resolve } from 'node:path';
3
- function findAncestorContaining(startPath, relativeMarker) {
2
+ import { tmpdir } from 'node:os';
3
+ import { dirname, isAbsolute, join, relative, resolve } from 'node:path';
4
+ function isWithinOrSamePath(candidate, parent) {
5
+ const relation = relative(parent, candidate);
6
+ return relation === '' || (!relation.startsWith('..') && !isAbsolute(relation));
7
+ }
8
+ function findNearestWorkspaceMarker(startPath) {
4
9
  let current = resolve(startPath);
10
+ const tempRoot = resolve(tmpdir());
11
+ const stopAt = isWithinOrSamePath(current, tempRoot) ? tempRoot : undefined;
5
12
  for (;;) {
6
- if (existsSync(join(current, relativeMarker))) {
7
- return current;
13
+ if (existsSync(join(current, '.geotech', 'project.json'))) {
14
+ return {
15
+ path: current,
16
+ detectedBy: 'geotech_project_file',
17
+ };
18
+ }
19
+ if (existsSync(join(current, '.git'))) {
20
+ return {
21
+ path: current,
22
+ detectedBy: 'git_root',
23
+ };
8
24
  }
25
+ if (stopAt && current === stopAt)
26
+ return undefined;
9
27
  const parent = dirname(current);
10
28
  if (parent === current)
11
29
  return undefined;
@@ -23,21 +41,11 @@ export function resolveWorkspaceRoot(options = {}) {
23
41
  };
24
42
  }
25
43
  const cwd = resolve(options.cwd ?? process.cwd());
26
- const geotechRoot = findAncestorContaining(cwd, join('.geotech', 'project.json'));
27
- if (geotechRoot) {
28
- return {
29
- path: geotechRoot,
30
- detectedBy: 'geotech_project_file',
31
- trustLevel: 'inferred',
32
- readScope: 'root_only',
33
- writeScope: 'geotech_output_only',
34
- };
35
- }
36
- const gitRoot = findAncestorContaining(cwd, '.git');
37
- if (gitRoot) {
44
+ const nearestMarker = findNearestWorkspaceMarker(cwd);
45
+ if (nearestMarker) {
38
46
  return {
39
- path: gitRoot,
40
- detectedBy: 'git_root',
47
+ path: nearestMarker.path,
48
+ detectedBy: nearestMarker.detectedBy,
41
49
  trustLevel: 'inferred',
42
50
  readScope: 'root_only',
43
51
  writeScope: 'geotech_output_only',
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-root.js","sourceRoot":"","sources":["../../src/workspace/resolve-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBnD,SAAS,sBAAsB,CAAC,SAAiB,EAAE,cAAsB;IACvE,IAAI,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACjC,SAAS,CAAC;QACR,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,SAAS,CAAC;QACzC,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,UAAuC,EAAE;IAC5E,IAAI,OAAO,CAAC,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC;QAClC,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;YACpC,UAAU,EAAE,wBAAwB;YACpC,UAAU,EAAE,UAAU;YACtB,SAAS,EAAE,WAAW;YACtB,UAAU,EAAE,qBAAqB;SAClC,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;IAClF,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,UAAU,EAAE,sBAAsB;YAClC,UAAU,EAAE,UAAU;YACtB,SAAS,EAAE,WAAW;YACtB,UAAU,EAAE,qBAAqB;SAClC,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACpD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO;YACL,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,UAAU;YACtB,UAAU,EAAE,UAAU;YACtB,SAAS,EAAE,WAAW;YACtB,UAAU,EAAE,qBAAqB;SAClC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,GAAG;QACT,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,UAAU;QACtB,SAAS,EAAE,WAAW;QACtB,UAAU,EAAE,qBAAqB;KAClC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"resolve-root.js","sourceRoot":"","sources":["../../src/workspace/resolve-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBzE,SAAS,kBAAkB,CAAC,SAAiB,EAAE,MAAc;IAC3D,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC7C,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,0BAA0B,CAAC,SAAiB;IACnD,IAAI,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,SAAS,CAAC;QACR,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YAC1D,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE,sBAAsB;aACnC,CAAC;QACJ,CAAC;QACD,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YACtC,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE,UAAU;aACvB,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,IAAI,OAAO,KAAK,MAAM;YAAE,OAAO,SAAS,CAAC;QACnD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,SAAS,CAAC;QACzC,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,UAAuC,EAAE;IAC5E,IAAI,OAAO,CAAC,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC;QAClC,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;YACpC,UAAU,EAAE,wBAAwB;YACpC,UAAU,EAAE,UAAU;YACtB,SAAS,EAAE,WAAW;YACtB,UAAU,EAAE,qBAAqB;SAClC,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC;IACtD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO;YACL,IAAI,EAAE,aAAa,CAAC,IAAI;YACxB,UAAU,EAAE,aAAa,CAAC,UAAU;YACpC,UAAU,EAAE,UAAU;YACtB,SAAS,EAAE,WAAW;YACtB,UAAU,EAAE,qBAAqB;SAClC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,GAAG;QACT,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,UAAU;QACtB,SAAS,EAAE,WAAW;QACtB,UAAU,EAAE,qBAAqB;KAClC,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geotechcli/core",
3
- "version": "0.4.91",
3
+ "version": "0.4.93",
4
4
  "description": "Shared computation and LLM engine for geotechCLI",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",