@geotechcli/core 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/dist/agents/brain.d.ts +39 -0
  2. package/dist/agents/brain.d.ts.map +1 -0
  3. package/dist/agents/brain.js +339 -0
  4. package/dist/agents/brain.js.map +1 -0
  5. package/dist/agents/bridge-tools.d.ts +2 -0
  6. package/dist/agents/bridge-tools.d.ts.map +1 -0
  7. package/dist/agents/bridge-tools.js +170 -0
  8. package/dist/agents/bridge-tools.js.map +1 -0
  9. package/dist/agents/data-tools.d.ts +2 -0
  10. package/dist/agents/data-tools.d.ts.map +1 -0
  11. package/dist/agents/data-tools.js +309 -0
  12. package/dist/agents/data-tools.js.map +1 -0
  13. package/dist/agents/filesystem-tools.d.ts +2 -0
  14. package/dist/agents/filesystem-tools.d.ts.map +1 -0
  15. package/dist/agents/filesystem-tools.js +267 -0
  16. package/dist/agents/filesystem-tools.js.map +1 -0
  17. package/dist/agents/guardrails.d.ts +17 -0
  18. package/dist/agents/guardrails.d.ts.map +1 -0
  19. package/dist/agents/guardrails.js +260 -0
  20. package/dist/agents/guardrails.js.map +1 -0
  21. package/dist/agents/orchestrator.d.ts +9 -0
  22. package/dist/agents/orchestrator.d.ts.map +1 -0
  23. package/dist/agents/orchestrator.js +136 -0
  24. package/dist/agents/orchestrator.js.map +1 -0
  25. package/dist/agents/safety.d.ts +9 -0
  26. package/dist/agents/safety.d.ts.map +1 -0
  27. package/dist/agents/safety.js +40 -0
  28. package/dist/agents/safety.js.map +1 -0
  29. package/dist/agents/sandbox.d.ts +34 -0
  30. package/dist/agents/sandbox.d.ts.map +1 -0
  31. package/dist/agents/sandbox.js +235 -0
  32. package/dist/agents/sandbox.js.map +1 -0
  33. package/dist/agents/swarm.d.ts +25 -0
  34. package/dist/agents/swarm.d.ts.map +1 -0
  35. package/dist/agents/swarm.js +434 -0
  36. package/dist/agents/swarm.js.map +1 -0
  37. package/dist/agents/tools.d.ts +37 -0
  38. package/dist/agents/tools.d.ts.map +1 -0
  39. package/dist/agents/tools.js +451 -0
  40. package/dist/agents/tools.js.map +1 -0
  41. package/dist/bridge/index.d.ts +52 -0
  42. package/dist/bridge/index.d.ts.map +1 -0
  43. package/dist/bridge/index.js +195 -0
  44. package/dist/bridge/index.js.map +1 -0
  45. package/dist/config/index.d.ts +106 -0
  46. package/dist/config/index.d.ts.map +1 -0
  47. package/dist/config/index.js +217 -0
  48. package/dist/config/index.js.map +1 -0
  49. package/dist/db/index.d.ts +4 -0
  50. package/dist/db/index.d.ts.map +1 -0
  51. package/dist/db/index.js +4 -0
  52. package/dist/db/index.js.map +1 -0
  53. package/dist/db/redis.d.ts +14 -0
  54. package/dist/db/redis.d.ts.map +1 -0
  55. package/dist/db/redis.js +204 -0
  56. package/dist/db/redis.js.map +1 -0
  57. package/dist/db/supabase.d.ts +57 -0
  58. package/dist/db/supabase.d.ts.map +1 -0
  59. package/dist/db/supabase.js +156 -0
  60. package/dist/db/supabase.js.map +1 -0
  61. package/dist/db/users.d.ts +50 -0
  62. package/dist/db/users.d.ts.map +1 -0
  63. package/dist/db/users.js +132 -0
  64. package/dist/db/users.js.map +1 -0
  65. package/dist/export/index.d.ts +51 -0
  66. package/dist/export/index.d.ts.map +1 -0
  67. package/dist/export/index.js +126 -0
  68. package/dist/export/index.js.map +1 -0
  69. package/dist/geo/bearing-capacity.d.ts +60 -0
  70. package/dist/geo/bearing-capacity.d.ts.map +1 -0
  71. package/dist/geo/bearing-capacity.js +195 -0
  72. package/dist/geo/bearing-capacity.js.map +1 -0
  73. package/dist/geo/classification.d.ts +107 -0
  74. package/dist/geo/classification.d.ts.map +1 -0
  75. package/dist/geo/classification.js +261 -0
  76. package/dist/geo/classification.js.map +1 -0
  77. package/dist/geo/index.d.ts +9 -0
  78. package/dist/geo/index.d.ts.map +1 -0
  79. package/dist/geo/index.js +9 -0
  80. package/dist/geo/index.js.map +1 -0
  81. package/dist/geo/lateral-earth-pressure.d.ts +75 -0
  82. package/dist/geo/lateral-earth-pressure.d.ts.map +1 -0
  83. package/dist/geo/lateral-earth-pressure.js +219 -0
  84. package/dist/geo/lateral-earth-pressure.js.map +1 -0
  85. package/dist/geo/liquefaction.d.ts +65 -0
  86. package/dist/geo/liquefaction.d.ts.map +1 -0
  87. package/dist/geo/liquefaction.js +163 -0
  88. package/dist/geo/liquefaction.js.map +1 -0
  89. package/dist/geo/pile-capacity.d.ts +91 -0
  90. package/dist/geo/pile-capacity.d.ts.map +1 -0
  91. package/dist/geo/pile-capacity.js +233 -0
  92. package/dist/geo/pile-capacity.js.map +1 -0
  93. package/dist/geo/settlement.d.ts +119 -0
  94. package/dist/geo/settlement.d.ts.map +1 -0
  95. package/dist/geo/settlement.js +184 -0
  96. package/dist/geo/settlement.js.map +1 -0
  97. package/dist/geo/slope-stability.d.ts +82 -0
  98. package/dist/geo/slope-stability.d.ts.map +1 -0
  99. package/dist/geo/slope-stability.js +214 -0
  100. package/dist/geo/slope-stability.js.map +1 -0
  101. package/dist/geo/tunnel/index.d.ts +2 -0
  102. package/dist/geo/tunnel/index.d.ts.map +1 -0
  103. package/dist/geo/tunnel/index.js +2 -0
  104. package/dist/geo/tunnel/index.js.map +1 -0
  105. package/dist/geo/tunnel/tbm.d.ts +135 -0
  106. package/dist/geo/tunnel/tbm.d.ts.map +1 -0
  107. package/dist/geo/tunnel/tbm.js +268 -0
  108. package/dist/geo/tunnel/tbm.js.map +1 -0
  109. package/dist/index.d.ts +20 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +33 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/ingest/ags.d.ts +42 -0
  114. package/dist/ingest/ags.d.ts.map +1 -0
  115. package/dist/ingest/ags.js +133 -0
  116. package/dist/ingest/ags.js.map +1 -0
  117. package/dist/ingest/cpt.d.ts +47 -0
  118. package/dist/ingest/cpt.d.ts.map +1 -0
  119. package/dist/ingest/cpt.js +112 -0
  120. package/dist/ingest/cpt.js.map +1 -0
  121. package/dist/ingest/index.d.ts +3 -0
  122. package/dist/ingest/index.d.ts.map +1 -0
  123. package/dist/ingest/index.js +3 -0
  124. package/dist/ingest/index.js.map +1 -0
  125. package/dist/llm/index.d.ts +5 -0
  126. package/dist/llm/index.d.ts.map +1 -0
  127. package/dist/llm/index.js +4 -0
  128. package/dist/llm/index.js.map +1 -0
  129. package/dist/llm/middleware/metering.d.ts +55 -0
  130. package/dist/llm/middleware/metering.d.ts.map +1 -0
  131. package/dist/llm/middleware/metering.js +191 -0
  132. package/dist/llm/middleware/metering.js.map +1 -0
  133. package/dist/llm/middleware/persistent-usage.d.ts +7 -0
  134. package/dist/llm/middleware/persistent-usage.d.ts.map +1 -0
  135. package/dist/llm/middleware/persistent-usage.js +108 -0
  136. package/dist/llm/middleware/persistent-usage.js.map +1 -0
  137. package/dist/llm/middleware/retry.d.ts +7 -0
  138. package/dist/llm/middleware/retry.d.ts.map +1 -0
  139. package/dist/llm/middleware/retry.js +29 -0
  140. package/dist/llm/middleware/retry.js.map +1 -0
  141. package/dist/llm/providers/anthropic.d.ts +10 -0
  142. package/dist/llm/providers/anthropic.d.ts.map +1 -0
  143. package/dist/llm/providers/anthropic.js +107 -0
  144. package/dist/llm/providers/anthropic.js.map +1 -0
  145. package/dist/llm/providers/hosted-beta.d.ts +10 -0
  146. package/dist/llm/providers/hosted-beta.d.ts.map +1 -0
  147. package/dist/llm/providers/hosted-beta.js +106 -0
  148. package/dist/llm/providers/hosted-beta.js.map +1 -0
  149. package/dist/llm/providers/huggingface.d.ts +37 -0
  150. package/dist/llm/providers/huggingface.d.ts.map +1 -0
  151. package/dist/llm/providers/huggingface.js +133 -0
  152. package/dist/llm/providers/huggingface.js.map +1 -0
  153. package/dist/llm/providers/openai-compatible.d.ts +27 -0
  154. package/dist/llm/providers/openai-compatible.d.ts.map +1 -0
  155. package/dist/llm/providers/openai-compatible.js +99 -0
  156. package/dist/llm/providers/openai-compatible.js.map +1 -0
  157. package/dist/llm/providers/zhipu.d.ts +10 -0
  158. package/dist/llm/providers/zhipu.d.ts.map +1 -0
  159. package/dist/llm/providers/zhipu.js +81 -0
  160. package/dist/llm/providers/zhipu.js.map +1 -0
  161. package/dist/llm/router.d.ts +35 -0
  162. package/dist/llm/router.d.ts.map +1 -0
  163. package/dist/llm/router.js +109 -0
  164. package/dist/llm/router.js.map +1 -0
  165. package/dist/llm/types.d.ts +63 -0
  166. package/dist/llm/types.d.ts.map +1 -0
  167. package/dist/llm/types.js +38 -0
  168. package/dist/llm/types.js.map +1 -0
  169. package/dist/meta/index.d.ts +12 -0
  170. package/dist/meta/index.d.ts.map +1 -0
  171. package/dist/meta/index.js +8 -0
  172. package/dist/meta/index.js.map +1 -0
  173. package/dist/meta/metadata.json +46 -0
  174. package/dist/report/index.d.ts +20 -0
  175. package/dist/report/index.d.ts.map +1 -0
  176. package/dist/report/index.js +58 -0
  177. package/dist/report/index.js.map +1 -0
  178. package/dist/standards/index.d.ts +23 -0
  179. package/dist/standards/index.d.ts.map +1 -0
  180. package/dist/standards/index.js +89 -0
  181. package/dist/standards/index.js.map +1 -0
  182. package/dist/storage/index.d.ts +114 -0
  183. package/dist/storage/index.d.ts.map +1 -0
  184. package/dist/storage/index.js +465 -0
  185. package/dist/storage/index.js.map +1 -0
  186. package/dist/vision/index.d.ts +80 -0
  187. package/dist/vision/index.d.ts.map +1 -0
  188. package/dist/vision/index.js +298 -0
  189. package/dist/vision/index.js.map +1 -0
  190. package/dist/vision/parse.d.ts +20 -0
  191. package/dist/vision/parse.d.ts.map +1 -0
  192. package/dist/vision/parse.js +75 -0
  193. package/dist/vision/parse.js.map +1 -0
  194. package/package.json +55 -0
@@ -0,0 +1,99 @@
1
+ /**
2
+ * OpenAI-compatible adapter.
3
+ *
4
+ * Works with:
5
+ * - OpenAI proper (api.openai.com)
6
+ * - Qwen on VPS via vLLM / Ollama (any OpenAI-compatible server)
7
+ * - Together, Groq, Fireworks, Deepseek, etc.
8
+ *
9
+ * This is the adapter used when Zhipu credits expire and you swap
10
+ * to Qwen 3.5 4B on your VPS. Just change the baseUrl and modelId
11
+ * in config — zero code changes needed.
12
+ */
13
+ export class OpenAICompatibleAdapter {
14
+ name;
15
+ defaultModel;
16
+ defaultVisionModel;
17
+ baseUrl;
18
+ constructor(options) {
19
+ this.name = options?.name ?? 'openai';
20
+ this.baseUrl = options?.baseUrl ?? 'https://api.openai.com/v1';
21
+ this.defaultModel = options?.defaultModel ?? 'gpt-4o-mini';
22
+ this.defaultVisionModel = options?.defaultVisionModel ?? 'gpt-4o';
23
+ }
24
+ async complete(request, config) {
25
+ if (!config.apiKey) {
26
+ throw new Error(`API key is required for ${this.name}. Set it via config or environment variable.`);
27
+ }
28
+ const effectiveBaseUrl = config.baseUrl ?? this.baseUrl;
29
+ const model = request.model ?? config.modelId ?? this.defaultModel;
30
+ const messages = request.messages.map((msg) => {
31
+ if (typeof msg.content === 'string') {
32
+ return { role: msg.role, content: msg.content };
33
+ }
34
+ // Multimodal: pass content parts as-is (OpenAI format)
35
+ return {
36
+ role: msg.role,
37
+ content: msg.content.map((part) => {
38
+ if (part.type === 'text') {
39
+ return { type: 'text', text: part.text ?? '' };
40
+ }
41
+ return {
42
+ type: 'image_url',
43
+ image_url: {
44
+ url: part.image_url?.url ?? '',
45
+ detail: part.image_url?.detail ?? 'auto',
46
+ },
47
+ };
48
+ }),
49
+ };
50
+ });
51
+ const body = {
52
+ model,
53
+ messages,
54
+ stream: false,
55
+ };
56
+ if (request.temperature !== undefined) {
57
+ body.temperature = request.temperature;
58
+ }
59
+ if (request.maxTokens !== undefined) {
60
+ body.max_tokens = request.maxTokens;
61
+ }
62
+ if (request.jsonMode) {
63
+ body.response_format = { type: 'json_object' };
64
+ }
65
+ const url = `${effectiveBaseUrl}/chat/completions`;
66
+ const start = Date.now();
67
+ const res = await fetch(url, {
68
+ method: 'POST',
69
+ headers: {
70
+ 'Content-Type': 'application/json',
71
+ Authorization: `Bearer ${config.apiKey}`,
72
+ },
73
+ body: JSON.stringify(body),
74
+ signal: AbortSignal.timeout(config.timeout ?? 60_000),
75
+ });
76
+ if (!res.ok) {
77
+ const errText = await res.text().catch(() => 'Unknown error');
78
+ throw new Error(`${this.name} API error (${res.status}): ${errText}`);
79
+ }
80
+ const data = (await res.json());
81
+ const latencyMs = Date.now() - start;
82
+ const choice = data.choices?.[0];
83
+ if (!choice) {
84
+ throw new Error(`${this.name} API returned no choices.`);
85
+ }
86
+ return {
87
+ text: choice.message.content,
88
+ usage: {
89
+ promptTokens: data.usage?.prompt_tokens ?? 0,
90
+ completionTokens: data.usage?.completion_tokens ?? 0,
91
+ totalTokens: data.usage?.total_tokens ?? 0,
92
+ },
93
+ model: data.model ?? model,
94
+ provider: this.name,
95
+ latencyMs,
96
+ };
97
+ }
98
+ }
99
+ //# sourceMappingURL=openai-compatible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible.js","sourceRoot":"","sources":["../../../src/llm/providers/openai-compatible.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ProviderAdapter, CompletionRequest, CompletionResponse, LLMConfig } from '../types.js';
2
+ export declare class ZhipuAdapter implements ProviderAdapter {
3
+ readonly name: "zhipu";
4
+ readonly defaultModel: string;
5
+ readonly defaultVisionModel: string;
6
+ private readonly baseUrl;
7
+ constructor(baseUrl?: string);
8
+ complete(request: CompletionRequest, config: LLMConfig): Promise<CompletionResponse>;
9
+ }
10
+ //# sourceMappingURL=zhipu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zhipu.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/zhipu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACV,MAAM,aAAa,CAAC;AAuBrB,qBAAa,YAAa,YAAW,eAAe;IAClD,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,YAAY,SAAqB;IAC1C,QAAQ,CAAC,kBAAkB,SAA4B;IAEvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,CAAC,EAAE,MAAM;IAItB,QAAQ,CACZ,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,kBAAkB,CAAC;CAqF/B"}
@@ -0,0 +1,81 @@
1
+ import { DEFAULT_LLM_MODEL, DEFAULT_LLM_VISION_MODEL, } from '../../meta/index.js';
2
+ export class ZhipuAdapter {
3
+ name = 'zhipu';
4
+ defaultModel = DEFAULT_LLM_MODEL;
5
+ defaultVisionModel = DEFAULT_LLM_VISION_MODEL;
6
+ baseUrl;
7
+ constructor(baseUrl) {
8
+ this.baseUrl = baseUrl ?? 'https://api.z.ai/api/paas/v4';
9
+ }
10
+ async complete(request, config) {
11
+ if (!config.apiKey) {
12
+ throw new Error('Zhipu API key is required. Set it via `geotech config set llm.api_key <key>` or ZHIPU_API_KEY env var.');
13
+ }
14
+ const model = request.model ?? config.modelId ?? this.defaultModel;
15
+ const messages = request.messages.map((msg) => {
16
+ if (typeof msg.content === 'string') {
17
+ return { role: msg.role, content: msg.content };
18
+ }
19
+ // Vision: convert ContentPart[] to Zhipu multimodal format
20
+ const parts = msg.content.map((part) => {
21
+ if (part.type === 'text') {
22
+ return { type: 'text', text: part.text ?? '' };
23
+ }
24
+ return {
25
+ type: 'image_url',
26
+ image_url: {
27
+ url: part.image_url?.url ?? '',
28
+ },
29
+ };
30
+ });
31
+ return { role: msg.role, content: parts };
32
+ });
33
+ const body = {
34
+ model,
35
+ messages,
36
+ stream: false,
37
+ };
38
+ if (request.temperature !== undefined) {
39
+ body.temperature = request.temperature;
40
+ }
41
+ if (request.maxTokens !== undefined) {
42
+ body.max_tokens = request.maxTokens;
43
+ }
44
+ if (request.jsonMode) {
45
+ body.response_format = { type: 'json_object' };
46
+ }
47
+ const url = `${this.baseUrl}/chat/completions`;
48
+ const start = Date.now();
49
+ const res = await fetch(url, {
50
+ method: 'POST',
51
+ headers: {
52
+ 'Content-Type': 'application/json',
53
+ Authorization: `Bearer ${config.apiKey}`,
54
+ },
55
+ body: JSON.stringify(body),
56
+ signal: AbortSignal.timeout(config.timeout ?? 60_000),
57
+ });
58
+ if (!res.ok) {
59
+ const errText = await res.text().catch(() => 'Unknown error');
60
+ throw new Error(`Zhipu API error (${res.status}): ${errText}`);
61
+ }
62
+ const data = (await res.json());
63
+ const latencyMs = Date.now() - start;
64
+ const choice = data.choices?.[0];
65
+ if (!choice) {
66
+ throw new Error('Zhipu API returned no choices.');
67
+ }
68
+ return {
69
+ text: choice.message.content,
70
+ usage: {
71
+ promptTokens: data.usage?.prompt_tokens ?? 0,
72
+ completionTokens: data.usage?.completion_tokens ?? 0,
73
+ totalTokens: data.usage?.total_tokens ?? 0,
74
+ },
75
+ model: data.model ?? model,
76
+ provider: 'zhipu',
77
+ latencyMs,
78
+ };
79
+ }
80
+ }
81
+ //# sourceMappingURL=zhipu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zhipu.js","sourceRoot":"","sources":["../../../src/llm/providers/zhipu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { LLMConfig, LLMProvider, ProviderAdapter, ProviderRegistry, CompletionResponse } from './types.js';
2
+ declare class Registry implements ProviderRegistry {
3
+ private adapters;
4
+ get(name: LLMProvider): ProviderAdapter;
5
+ register(adapter: ProviderAdapter): void;
6
+ has(name: LLMProvider): boolean;
7
+ }
8
+ declare const registry: Registry;
9
+ export { registry };
10
+ export declare function generateText(prompt: string, config: LLMConfig, options?: {
11
+ systemPrompt?: string;
12
+ temperature?: number;
13
+ maxTokens?: number;
14
+ jsonMode?: boolean;
15
+ model?: string;
16
+ }): Promise<CompletionResponse>;
17
+ /**
18
+ * Multi-turn chat completion — accepts a full message array.
19
+ * Used by the agent brain for proper conversation management.
20
+ */
21
+ export declare function generateChat(messages: Array<{
22
+ role: 'system' | 'user' | 'assistant';
23
+ content: string;
24
+ }>, config: LLMConfig, options?: {
25
+ temperature?: number;
26
+ maxTokens?: number;
27
+ model?: string;
28
+ }): Promise<CompletionResponse>;
29
+ export declare function generateVision(prompt: string, imageBase64: string, mimeType: string, config: LLMConfig, options?: {
30
+ systemPrompt?: string;
31
+ temperature?: number;
32
+ maxTokens?: number;
33
+ model?: string;
34
+ }): Promise<CompletionResponse>;
35
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/llm/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,eAAe,EACf,gBAAgB,EAEhB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAWpB,cAAM,QAAS,YAAW,gBAAgB;IACxC,OAAO,CAAC,QAAQ,CAA2C;IAE3D,GAAG,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe;IAUvC,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAIxC,GAAG,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;CAGhC;AAED,QAAA,MAAM,QAAQ,UAAiB,CAAC;AA+BhC,OAAO,EAAE,QAAQ,EAAE,CAAC;AAQpB,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,OAAO,CAAC,EAAE;IACR,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,kBAAkB,CAAC,CAqB7B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAC3E,MAAM,EAAE,SAAS,EACjB,OAAO,CAAC,EAAE;IACR,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,kBAAkB,CAAC,CAY7B;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,EACjB,OAAO,CAAC,EAAE;IACR,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,kBAAkB,CAAC,CAmC7B"}
@@ -0,0 +1,109 @@
1
+ import { ZhipuAdapter } from './providers/zhipu.js';
2
+ import { OpenAICompatibleAdapter } from './providers/openai-compatible.js';
3
+ import { AnthropicAdapter } from './providers/anthropic.js';
4
+ import { HuggingFaceAdapter } from './providers/huggingface.js';
5
+ import { HostedBetaAdapter } from './providers/hosted-beta.js';
6
+ // ---------------------------------------------------------------------------
7
+ // Provider registry — singleton, adapters registered once at startup
8
+ // ---------------------------------------------------------------------------
9
+ class Registry {
10
+ adapters = new Map();
11
+ get(name) {
12
+ const adapter = this.adapters.get(name);
13
+ if (!adapter) {
14
+ throw new Error(`Unknown LLM provider: "${name}". Available: ${[...this.adapters.keys()].join(', ')}`);
15
+ }
16
+ return adapter;
17
+ }
18
+ register(adapter) {
19
+ this.adapters.set(adapter.name, adapter);
20
+ }
21
+ has(name) {
22
+ return this.adapters.has(name);
23
+ }
24
+ }
25
+ const registry = new Registry();
26
+ // Register built-in providers
27
+ registry.register(new HostedBetaAdapter());
28
+ registry.register(new ZhipuAdapter());
29
+ registry.register(new OpenAICompatibleAdapter({
30
+ name: 'openai',
31
+ baseUrl: 'https://api.openai.com/v1',
32
+ defaultModel: 'gpt-4o-mini',
33
+ defaultVisionModel: 'gpt-4o',
34
+ }));
35
+ // "openai-compatible" catch-all for Qwen VPS, Ollama, vLLM, etc.
36
+ registry.register(new OpenAICompatibleAdapter({
37
+ name: 'openai-compatible',
38
+ baseUrl: 'http://localhost:8000/v1', // default; overridden by config.baseUrl
39
+ defaultModel: 'qwen3.5-4b',
40
+ defaultVisionModel: 'qwen3.5-4b',
41
+ }));
42
+ registry.register(new AnthropicAdapter());
43
+ // Hugging Face Inference Providers — Pro tier only
44
+ // Supports any model on the Hub via router.huggingface.co
45
+ registry.register(new HuggingFaceAdapter());
46
+ export { registry };
47
+ // ---------------------------------------------------------------------------
48
+ // Main API: generateText / generateVision
49
+ // ---------------------------------------------------------------------------
50
+ const GEOTECH_SYSTEM_PROMPT = `You are a geotechnical engineering AI assistant integrated into geotechCLI. You have deep expertise in soil mechanics, rock mechanics, foundation engineering, tunnel engineering, slope stability, hydrogeology, and seismic analysis. Always provide technically accurate, concise responses suitable for professional engineers. Use standard geotechnical terminology and reference established methods (Terzaghi, Meyerhof, Bishop, Barton, Bieniawski, etc.) where applicable.`;
51
+ export async function generateText(prompt, config, options) {
52
+ const adapter = registry.get(config.provider);
53
+ const messages = [
54
+ {
55
+ role: 'system',
56
+ content: options?.systemPrompt ?? GEOTECH_SYSTEM_PROMPT,
57
+ },
58
+ { role: 'user', content: prompt },
59
+ ];
60
+ return adapter.complete({
61
+ messages,
62
+ temperature: options?.temperature,
63
+ maxTokens: options?.maxTokens,
64
+ jsonMode: options?.jsonMode,
65
+ model: options?.model,
66
+ }, config);
67
+ }
68
+ /**
69
+ * Multi-turn chat completion — accepts a full message array.
70
+ * Used by the agent brain for proper conversation management.
71
+ */
72
+ export async function generateChat(messages, config, options) {
73
+ const adapter = registry.get(config.provider);
74
+ return adapter.complete({
75
+ messages,
76
+ temperature: options?.temperature,
77
+ maxTokens: options?.maxTokens,
78
+ model: options?.model,
79
+ }, config);
80
+ }
81
+ export async function generateVision(prompt, imageBase64, mimeType, config, options) {
82
+ const adapter = registry.get(config.provider);
83
+ const visionModel = options?.model ?? config.visionModelId ?? adapter.defaultVisionModel;
84
+ const dataUri = `data:${mimeType};base64,${imageBase64}`;
85
+ const messages = [
86
+ {
87
+ role: 'system',
88
+ content: options?.systemPrompt ??
89
+ `${GEOTECH_SYSTEM_PROMPT}\nYou are analyzing a geotechnical image. Provide precise, quantitative observations.`,
90
+ },
91
+ {
92
+ role: 'user',
93
+ content: [
94
+ {
95
+ type: 'image_url',
96
+ image_url: { url: dataUri },
97
+ },
98
+ { type: 'text', text: prompt },
99
+ ],
100
+ },
101
+ ];
102
+ return adapter.complete({
103
+ messages,
104
+ temperature: options?.temperature,
105
+ maxTokens: options?.maxTokens,
106
+ model: visionModel,
107
+ }, config);
108
+ }
109
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/llm/router.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/D,8EAA8E;AAC9E,qEAAqE;AACrE,8EAA8E;AAE9E,MAAM,QAAQ;IACJ,QAAQ,GAAG,IAAI,GAAG,EAAgC,CAAC;IAE3D,GAAG,CAAC,IAAiB;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,0BAA0B,IAAI,iBAAiB,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtF,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,QAAQ,CAAC,OAAwB;QAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,GAAG,CAAC,IAAiB;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;CACF;AAED,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;AAEhC,8BAA8B;AAC9B,QAAQ,CAAC,QAAQ,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;AAC3C,QAAQ,CAAC,QAAQ,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;AAEtC,QAAQ,CAAC,QAAQ,CACf,IAAI,uBAAuB,CAAC;IAC1B,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,2BAA2B;IACpC,YAAY,EAAE,aAAa;IAC3B,kBAAkB,EAAE,QAAQ;CAC7B,CAAC,CACH,CAAC;AAEF,iEAAiE;AACjE,QAAQ,CAAC,QAAQ,CACf,IAAI,uBAAuB,CAAC;IAC1B,IAAI,EAAE,mBAAmB;IACzB,OAAO,EAAE,0BAA0B,EAAE,wCAAwC;IAC7E,YAAY,EAAE,YAAY;IAC1B,kBAAkB,EAAE,YAAY;CACjC,CAAC,CACH,CAAC;AAEF,QAAQ,CAAC,QAAQ,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAC;AAE1C,mDAAmD;AACnD,0DAA0D;AAC1D,QAAQ,CAAC,QAAQ,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;AAE5C,OAAO,EAAE,QAAQ,EAAE,CAAC;AAEpB,8EAA8E;AAC9E,0CAA0C;AAC1C,8EAA8E;AAE9E,MAAM,qBAAqB,GAAG,sdAAsd,CAAC;AAErf,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,MAAiB,EACjB,OAMC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG;QACf;YACE,IAAI,EAAE,QAAiB;YACvB,OAAO,EAAE,OAAO,EAAE,YAAY,IAAI,qBAAqB;SACxD;QACD,EAAE,IAAI,EAAE,MAAe,EAAE,OAAO,EAAE,MAAM,EAAE;KAC3C,CAAC;IAEF,OAAO,OAAO,CAAC,QAAQ,CACrB;QACE,QAAQ;QACR,WAAW,EAAE,OAAO,EAAE,WAAW;QACjC,SAAS,EAAE,OAAO,EAAE,SAAS;QAC7B,QAAQ,EAAE,OAAO,EAAE,QAAQ;QAC3B,KAAK,EAAE,OAAO,EAAE,KAAK;KACtB,EACD,MAAM,CACP,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAA2E,EAC3E,MAAiB,EACjB,OAIC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE9C,OAAO,OAAO,CAAC,QAAQ,CACrB;QACE,QAAQ;QACR,WAAW,EAAE,OAAO,EAAE,WAAW;QACjC,SAAS,EAAE,OAAO,EAAE,SAAS;QAC7B,KAAK,EAAE,OAAO,EAAE,KAAK;KACtB,EACD,MAAM,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,WAAmB,EACnB,QAAgB,EAChB,MAAiB,EACjB,OAKC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,WAAW,GACf,OAAO,EAAE,KAAK,IAAI,MAAM,CAAC,aAAa,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAEvE,MAAM,OAAO,GAAG,QAAQ,QAAQ,WAAW,WAAW,EAAE,CAAC;IAEzD,MAAM,QAAQ,GAAG;QACf;YACE,IAAI,EAAE,QAAiB;YACvB,OAAO,EACL,OAAO,EAAE,YAAY;gBACrB,GAAG,qBAAqB,uFAAuF;SAClH;QACD;YACE,IAAI,EAAE,MAAe;YACrB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,WAAoB;oBAC1B,SAAS,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;iBAC5B;gBACD,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE;aACxC;SACF;KACF,CAAC;IAEF,OAAO,OAAO,CAAC,QAAQ,CACrB;QACE,QAAQ;QACR,WAAW,EAAE,OAAO,EAAE,WAAW;QACjC,SAAS,EAAE,OAAO,EAAE,SAAS;QAC7B,KAAK,EAAE,WAAW;KACnB,EACD,MAAM,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,63 @@
1
+ export type LLMProvider = 'hosted-beta' | 'zhipu' | 'openai' | 'anthropic' | 'openai-compatible' | 'huggingface';
2
+ export interface LLMConfig {
3
+ provider: LLMProvider;
4
+ apiKey: string;
5
+ baseUrl?: string;
6
+ modelId?: string;
7
+ visionModelId?: string;
8
+ timeout?: number;
9
+ }
10
+ export interface ChatMessage {
11
+ role: 'system' | 'user' | 'assistant';
12
+ content: string | ContentPart[];
13
+ }
14
+ export interface ContentPart {
15
+ type: 'text' | 'image_url';
16
+ text?: string;
17
+ image_url?: {
18
+ url: string;
19
+ detail?: 'auto' | 'low' | 'high';
20
+ };
21
+ }
22
+ export interface CompletionRequest {
23
+ messages: ChatMessage[];
24
+ temperature?: number;
25
+ maxTokens?: number;
26
+ stream?: boolean;
27
+ jsonMode?: boolean;
28
+ model?: string;
29
+ }
30
+ export interface CompletionResponse {
31
+ text: string;
32
+ usage: TokenUsage;
33
+ model: string;
34
+ provider: LLMProvider;
35
+ latencyMs: number;
36
+ }
37
+ export interface TokenUsage {
38
+ promptTokens: number;
39
+ completionTokens: number;
40
+ totalTokens: number;
41
+ }
42
+ export interface ProviderAdapter {
43
+ readonly name: LLMProvider;
44
+ readonly defaultModel: string;
45
+ readonly defaultVisionModel: string;
46
+ complete(request: CompletionRequest, config: LLMConfig): Promise<CompletionResponse>;
47
+ }
48
+ export interface ProviderRegistry {
49
+ get(name: LLMProvider): ProviderAdapter;
50
+ register(adapter: ProviderAdapter): void;
51
+ has(name: LLMProvider): boolean;
52
+ }
53
+ export type UserTier = 'free' | 'lite_pro' | 'pro' | 'annual';
54
+ export interface TierLimits {
55
+ llmCallsPerMonth: number;
56
+ visionCallsPerMonth: number;
57
+ agentCallsPerMonth: number;
58
+ byolEnabled: boolean;
59
+ batchEnabled: boolean;
60
+ reportGeneration: boolean;
61
+ }
62
+ export declare const TIER_LIMITS: Record<UserTier, TierLimits>;
63
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/llm/types.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GACnB,aAAa,GACb,OAAO,GACP,QAAQ,GACR,WAAW,GACX,mBAAmB,GACnB,aAAa,CAAC;AAElB,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,WAAW,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;KAAE,CAAC;CAC/D;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,WAAW,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACtF;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,GAAG,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;CACjC;AAGD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE9D,MAAM,WAAW,UAAU;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,CAiCpD,CAAC"}
@@ -0,0 +1,38 @@
1
+ // ---------------------------------------------------------------------------
2
+ // LLM provider abstraction — types only, zero dependencies
3
+ // ---------------------------------------------------------------------------
4
+ export const TIER_LIMITS = {
5
+ free: {
6
+ llmCallsPerMonth: 50,
7
+ visionCallsPerMonth: 10,
8
+ agentCallsPerMonth: 5,
9
+ byolEnabled: false,
10
+ batchEnabled: false,
11
+ reportGeneration: false,
12
+ },
13
+ lite_pro: {
14
+ llmCallsPerMonth: 1000,
15
+ visionCallsPerMonth: 200,
16
+ agentCallsPerMonth: 100,
17
+ byolEnabled: false,
18
+ batchEnabled: false,
19
+ reportGeneration: true,
20
+ },
21
+ pro: {
22
+ llmCallsPerMonth: Infinity,
23
+ visionCallsPerMonth: Infinity,
24
+ agentCallsPerMonth: Infinity,
25
+ byolEnabled: true,
26
+ batchEnabled: true,
27
+ reportGeneration: true,
28
+ },
29
+ annual: {
30
+ llmCallsPerMonth: Infinity,
31
+ visionCallsPerMonth: Infinity,
32
+ agentCallsPerMonth: Infinity,
33
+ byolEnabled: true,
34
+ batchEnabled: true,
35
+ reportGeneration: true,
36
+ },
37
+ };
38
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/llm/types.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2DAA2D;AAC3D,8EAA8E;AA8E9E,MAAM,CAAC,MAAM,WAAW,GAAiC;IACvD,IAAI,EAAE;QACJ,gBAAgB,EAAE,EAAE;QACpB,mBAAmB,EAAE,EAAE;QACvB,kBAAkB,EAAE,CAAC;QACrB,WAAW,EAAE,KAAK;QAClB,YAAY,EAAE,KAAK;QACnB,gBAAgB,EAAE,KAAK;KACxB;IACD,QAAQ,EAAE;QACR,gBAAgB,EAAE,IAAI;QACtB,mBAAmB,EAAE,GAAG;QACxB,kBAAkB,EAAE,GAAG;QACvB,WAAW,EAAE,KAAK;QAClB,YAAY,EAAE,KAAK;QACnB,gBAAgB,EAAE,IAAI;KACvB;IACD,GAAG,EAAE;QACH,gBAAgB,EAAE,QAAQ;QAC1B,mBAAmB,EAAE,QAAQ;QAC7B,kBAAkB,EAAE,QAAQ;QAC5B,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,IAAI;QAClB,gBAAgB,EAAE,IAAI;KACvB;IACD,MAAM,EAAE;QACN,gBAAgB,EAAE,QAAQ;QAC1B,mBAAmB,EAAE,QAAQ;QAC7B,kBAAkB,EAAE,QAAQ;QAC5B,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,IAAI;QAClB,gBAAgB,EAAE,IAAI;KACvB;CACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare const GEOTECHCLI_VERSION: string;
2
+ export declare const DEFAULT_LLM_PROVIDER: "hosted-beta" | "zhipu" | "openai" | "anthropic" | "openai-compatible" | "huggingface";
3
+ export declare const DEFAULT_LLM_MODEL: string;
4
+ export declare const DEFAULT_LLM_VISION_MODEL: string;
5
+ export declare const SUPPORTED_PROXY_MODELS: string[];
6
+ export interface GlobalFlagDefinition {
7
+ key: string;
8
+ option: string;
9
+ description: string;
10
+ }
11
+ export declare const GLOBAL_FLAG_DEFINITIONS: GlobalFlagDefinition[];
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/meta/index.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,kBAAkB,EAAuB,MAAM,CAAC;AAE7D,eAAO,MAAM,oBAAoB,EAC7B,aAAa,GACb,OAAO,GACP,QAAQ,GACR,WAAW,GACX,mBAAmB,GACnB,aAAa,CAAC;AAElB,eAAO,MAAM,iBAAiB,EAA8B,MAAM,CAAC;AACnE,eAAO,MAAM,wBAAwB,EAAoC,MAAM,CAAC;AAChF,eAAO,MAAM,sBAAsB,EAAgC,MAAM,EAAE,CAAC;AAE5E,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,uBAAuB,EACV,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import metadata from './metadata.json' with { type: 'json' };
2
+ export const GEOTECHCLI_VERSION = metadata.version;
3
+ export const DEFAULT_LLM_PROVIDER = metadata.defaults.provider;
4
+ export const DEFAULT_LLM_MODEL = metadata.defaults.model;
5
+ export const DEFAULT_LLM_VISION_MODEL = metadata.defaults.visionModel;
6
+ export const SUPPORTED_PROXY_MODELS = [...metadata.proxyModels];
7
+ export const GLOBAL_FLAG_DEFINITIONS = metadata.globalFlags;
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/meta/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAE7D,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAiB,CAAC;AAE7D,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAMrC,CAAC;AAElB,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAe,CAAC;AACnE,MAAM,CAAC,MAAM,wBAAwB,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAqB,CAAC;AAChF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAa,CAAC;AAQ5E,MAAM,CAAC,MAAM,uBAAuB,GAClC,QAAQ,CAAC,WAAqC,CAAC"}
@@ -0,0 +1,46 @@
1
+ {
2
+ "version": "0.2.0",
3
+ "defaults": {
4
+ "provider": "hosted-beta",
5
+ "model": "glm-5.1",
6
+ "visionModel": "glm-5v-turbo"
7
+ },
8
+ "proxyModels": ["glm-5.1", "glm-5v-turbo"],
9
+ "globalFlags": [
10
+ {
11
+ "key": "json",
12
+ "option": "--json",
13
+ "description": "Output raw JSON (for piping to jq, scripts, CI)"
14
+ },
15
+ {
16
+ "key": "plot",
17
+ "option": "--plot",
18
+ "description": "Render terminal chart"
19
+ },
20
+ {
21
+ "key": "verbose",
22
+ "option": "--verbose",
23
+ "description": "Show step-by-step calculation details"
24
+ },
25
+ {
26
+ "key": "quiet",
27
+ "option": "--quiet",
28
+ "description": "Suppress all non-essential output"
29
+ },
30
+ {
31
+ "key": "dryRun",
32
+ "option": "--dry-run",
33
+ "description": "Show what would be calculated without executing"
34
+ },
35
+ {
36
+ "key": "output",
37
+ "option": "--output <file>",
38
+ "description": "Save results to file (csv, json)"
39
+ },
40
+ {
41
+ "key": "noColor",
42
+ "option": "--no-color",
43
+ "description": "Disable colored output"
44
+ }
45
+ ]
46
+ }
@@ -0,0 +1,20 @@
1
+ import type { LLMConfig } from '../llm/types.js';
2
+ export interface ReportSection {
3
+ title: string;
4
+ content: string;
5
+ }
6
+ export interface GeneratedReport {
7
+ title: string;
8
+ sections: ReportSection[];
9
+ fullMarkdown: string;
10
+ latencyMs: number;
11
+ }
12
+ export declare function generateReport(analysisData: Record<string, unknown>, options: {
13
+ type: 'borehole' | 'site-investigation' | 'tunnel-design' | 'foundation' | 'slope' | 'custom';
14
+ projectName?: string;
15
+ location?: string;
16
+ author?: string;
17
+ additionalNotes?: string;
18
+ language?: string;
19
+ }, config: LLMConfig): Promise<GeneratedReport>;
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/report/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,OAAO,EAAE;IACP,IAAI,EAAE,UAAU,GAAG,oBAAoB,GAAG,eAAe,GAAG,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC9F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,EACD,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,eAAe,CAAC,CA8D1B"}
@@ -0,0 +1,58 @@
1
+ import { generateText } from '../llm/router.js';
2
+ export async function generateReport(analysisData, options, config) {
3
+ const dataStr = JSON.stringify(analysisData, null, 2);
4
+ const prompt = `Generate a professional geotechnical engineering report based on this analysis data:
5
+
6
+ ${dataStr}
7
+
8
+ Report requirements:
9
+ - Type: ${options.type}
10
+ - Project: ${options.projectName ?? 'Unnamed Project'}
11
+ - Location: ${options.location ?? 'Not specified'}
12
+ - Language: ${options.language ?? 'English'}
13
+ ${options.additionalNotes ? `- Notes: ${options.additionalNotes}` : ''}
14
+
15
+ Structure the report in standard geotechnical format with these sections:
16
+ 1. Executive Summary
17
+ 2. Introduction & Scope
18
+ 3. Site Description & Geology
19
+ 4. Investigation / Analysis Methods
20
+ 5. Results & Interpretation
21
+ 6. Engineering Parameters
22
+ 7. Conclusions & Recommendations
23
+
24
+ Output the report as clean markdown. Include tables where appropriate. Use proper geotechnical terminology and reference applicable standards.`;
25
+ const response = await generateText(prompt, config, {
26
+ systemPrompt: `You are a senior geotechnical engineer writing professional reports. Your reports are technically precise, well-structured, and suitable for submission to clients and regulatory bodies. Use standard formatting: numbered sections, tables for parameters, clear recommendations with supporting evidence.`,
27
+ temperature: 0.3,
28
+ maxTokens: 4096,
29
+ });
30
+ // Parse sections from markdown
31
+ const sections = [];
32
+ const sectionRegex = /^#{1,3}\s+(.+)$/gm;
33
+ let lastIndex = 0;
34
+ let lastTitle = 'Preamble';
35
+ let match;
36
+ const text = response.text;
37
+ while ((match = sectionRegex.exec(text)) !== null) {
38
+ if (match.index > lastIndex) {
39
+ const content = text.slice(lastIndex, match.index).trim();
40
+ if (content) {
41
+ sections.push({ title: lastTitle, content });
42
+ }
43
+ }
44
+ lastTitle = match[1];
45
+ lastIndex = match.index + match[0].length;
46
+ }
47
+ // Last section
48
+ if (lastIndex < text.length) {
49
+ sections.push({ title: lastTitle, content: text.slice(lastIndex).trim() });
50
+ }
51
+ return {
52
+ title: `${options.type.replace(/-/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase())} Report — ${options.projectName ?? 'Unnamed'}`,
53
+ sections,
54
+ fullMarkdown: response.text,
55
+ latencyMs: response.latencyMs,
56
+ };
57
+ }
58
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/report/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAchD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,YAAqC,EACrC,OAOC,EACD,MAAiB;IAEjB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEtD,MAAM,MAAM,GAAG;;EAEf,OAAO;;;UAGC,OAAO,CAAC,IAAI;aACT,OAAO,CAAC,WAAW,IAAI,iBAAiB;cACvC,OAAO,CAAC,QAAQ,IAAI,eAAe;cACnC,OAAO,CAAC,QAAQ,IAAI,SAAS;EACzC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;+IAWyE,CAAC;IAE9I,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE;QAClD,YAAY,EAAE,8SAA8S;QAC5T,WAAW,EAAE,GAAG;QAChB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,+BAA+B;IAC/B,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,mBAAmB,CAAC;IACzC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,UAAU,CAAC;IAC3B,IAAI,KAA6B,CAAC;IAElC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAE3B,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClD,IAAI,KAAK,CAAC,KAAK,GAAG,SAAS,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,OAAO,EAAE,CAAC;gBACZ,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QACD,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,SAAS,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,CAAC;IAED,eAAe;IACf,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO;QACL,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,aAAa,OAAO,CAAC,WAAW,IAAI,SAAS,EAAE;QACjI,QAAQ;QACR,YAAY,EAAE,QAAQ,CAAC,IAAI;QAC3B,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC9B,CAAC;AACJ,CAAC"}