@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,108 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Persistent CLI Usage Store — file-backed, survives process restarts
3
+ //
4
+ // Stores counters in ~/.geotechcli/usage.json so the unregistered 5-call
5
+ // limit and monthly quotas are enforced across CLI sessions.
6
+ // ---------------------------------------------------------------------------
7
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, chmodSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import { homedir, platform } from 'node:os';
10
+ const CONFIG_DIR = process.env.GEOTECHCLI_CONFIG_DIR ?? join(homedir(), '.geotechcli');
11
+ const USAGE_FILE = join(CONFIG_DIR, 'usage.json');
12
+ function ensureDir() {
13
+ if (!existsSync(CONFIG_DIR)) {
14
+ mkdirSync(CONFIG_DIR, { recursive: true });
15
+ if (platform() !== 'win32') {
16
+ try {
17
+ chmodSync(CONFIG_DIR, 0o700);
18
+ }
19
+ catch { /* best effort */ }
20
+ }
21
+ }
22
+ }
23
+ function loadData() {
24
+ ensureDir();
25
+ if (!existsSync(USAGE_FILE)) {
26
+ return { records: {}, version: 1 };
27
+ }
28
+ try {
29
+ const raw = readFileSync(USAGE_FILE, 'utf-8');
30
+ const data = JSON.parse(raw);
31
+ return data;
32
+ }
33
+ catch {
34
+ return { records: {}, version: 1 };
35
+ }
36
+ }
37
+ function saveData(data) {
38
+ ensureDir();
39
+ try {
40
+ writeFileSync(USAGE_FILE, JSON.stringify(data, null, 2), 'utf-8');
41
+ if (platform() !== 'win32') {
42
+ try {
43
+ chmodSync(USAGE_FILE, 0o600);
44
+ }
45
+ catch { /* best effort */ }
46
+ }
47
+ }
48
+ catch {
49
+ // Silently fail — CLI should not crash on usage persistence failure
50
+ }
51
+ }
52
+ function isExpired(record) {
53
+ const monthMs = 30 * 24 * 60 * 60 * 1000;
54
+ return Date.now() - record.periodStart > monthMs;
55
+ }
56
+ // ---------------------------------------------------------------------------
57
+ // FileUsageStore — implements UsageStore interface
58
+ // ---------------------------------------------------------------------------
59
+ export class FileUsageStore {
60
+ async get(identifier) {
61
+ const data = loadData();
62
+ const record = data.records[identifier] ?? null;
63
+ if (!record)
64
+ return null;
65
+ // Reset if period expired
66
+ if (isExpired(record)) {
67
+ record.llmCalls = 0;
68
+ record.visionCalls = 0;
69
+ record.agentCalls = 0;
70
+ record.periodStart = Date.now();
71
+ data.records[identifier] = record;
72
+ saveData(data);
73
+ }
74
+ return record;
75
+ }
76
+ async set(identifier, record) {
77
+ const data = loadData();
78
+ data.records[identifier] = record;
79
+ saveData(data);
80
+ }
81
+ async increment(identifier, field) {
82
+ const data = loadData();
83
+ let record = data.records[identifier];
84
+ if (!record) {
85
+ record = {
86
+ identifier,
87
+ tier: 'free',
88
+ llmCalls: 0,
89
+ visionCalls: 0,
90
+ agentCalls: 0,
91
+ periodStart: Date.now(),
92
+ lastCallTimestamp: Date.now(),
93
+ };
94
+ }
95
+ if (isExpired(record)) {
96
+ record.llmCalls = 0;
97
+ record.visionCalls = 0;
98
+ record.agentCalls = 0;
99
+ record.periodStart = Date.now();
100
+ }
101
+ record[field] += 1;
102
+ record.lastCallTimestamp = Date.now();
103
+ data.records[identifier] = record;
104
+ saveData(data);
105
+ return record;
106
+ }
107
+ }
108
+ //# sourceMappingURL=persistent-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistent-usage.js","sourceRoot":"","sources":["../../../src/llm/middleware/persistent-usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface RetryOptions {
2
+ maxRetries?: number;
3
+ baseDelayMs?: number;
4
+ maxDelayMs?: number;
5
+ }
6
+ export declare function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
7
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../src/llm/middleware/retry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAQD,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,CAAC,CAAC,CA8BZ"}
@@ -0,0 +1,29 @@
1
+ const DEFAULT_OPTIONS = {
2
+ maxRetries: 3,
3
+ baseDelayMs: 1000,
4
+ maxDelayMs: 10_000,
5
+ };
6
+ export async function withRetry(fn, options) {
7
+ const opts = { ...DEFAULT_OPTIONS, ...options };
8
+ let lastError;
9
+ for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {
10
+ try {
11
+ return await fn();
12
+ }
13
+ catch (err) {
14
+ lastError = err instanceof Error ? err : new Error(String(err));
15
+ // Don't retry on auth errors or client errors (4xx except 429)
16
+ if (lastError.message.includes('(401)') || lastError.message.includes('(403)')) {
17
+ throw lastError;
18
+ }
19
+ if (attempt === opts.maxRetries) {
20
+ break;
21
+ }
22
+ // Exponential backoff with jitter
23
+ const delay = Math.min(opts.baseDelayMs * Math.pow(2, attempt) + Math.random() * 500, opts.maxDelayMs);
24
+ await new Promise((resolve) => setTimeout(resolve, delay));
25
+ }
26
+ }
27
+ throw lastError ?? new Error('Retry failed with no error captured.');
28
+ }
29
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/llm/middleware/retry.ts"],"names":[],"mappings":"AAMA,MAAM,eAAe,GAA2B;IAC9C,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,MAAM;CACnB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,EAAoB,EACpB,OAAsB;IAEtB,MAAM,IAAI,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,EAAE,CAAC;IAChD,IAAI,SAA4B,CAAC;IAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAEhE,+DAA+D;YAC/D,IAAI,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/E,MAAM,SAAS,CAAC;YAClB,CAAC;YAED,IAAI,OAAO,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChC,MAAM;YACR,CAAC;YAED,kCAAkC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAC7D,IAAI,CAAC,UAAU,CAChB,CAAC;YAEF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ProviderAdapter, CompletionRequest, CompletionResponse, LLMConfig } from '../types.js';
2
+ export declare class AnthropicAdapter implements ProviderAdapter {
3
+ readonly name: "anthropic";
4
+ readonly defaultModel = "claude-sonnet-4-20250514";
5
+ readonly defaultVisionModel = "claude-sonnet-4-20250514";
6
+ private readonly baseUrl;
7
+ constructor(baseUrl?: string);
8
+ complete(request: CompletionRequest, config: LLMConfig): Promise<CompletionResponse>;
9
+ }
10
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACV,MAAM,aAAa,CAAC;AAcrB,qBAAa,gBAAiB,YAAW,eAAe;IACtD,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;IACrC,QAAQ,CAAC,YAAY,8BAA8B;IACnD,QAAQ,CAAC,kBAAkB,8BAA8B;IAEzD,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;CAqH/B"}
@@ -0,0 +1,107 @@
1
+ export class AnthropicAdapter {
2
+ name = 'anthropic';
3
+ defaultModel = 'claude-sonnet-4-20250514';
4
+ defaultVisionModel = 'claude-sonnet-4-20250514';
5
+ baseUrl;
6
+ constructor(baseUrl) {
7
+ this.baseUrl = baseUrl ?? 'https://api.anthropic.com/v1';
8
+ }
9
+ async complete(request, config) {
10
+ if (!config.apiKey) {
11
+ throw new Error('Anthropic API key is required. Set it via config or ANTHROPIC_API_KEY env var.');
12
+ }
13
+ const model = request.model ?? config.modelId ?? this.defaultModel;
14
+ // Anthropic separates system from messages
15
+ let systemPrompt;
16
+ const messages = [];
17
+ for (const msg of request.messages) {
18
+ if (msg.role === 'system') {
19
+ systemPrompt =
20
+ typeof msg.content === 'string'
21
+ ? msg.content
22
+ : msg.content
23
+ .filter((p) => p.type === 'text')
24
+ .map((p) => p.text)
25
+ .join('\n');
26
+ continue;
27
+ }
28
+ if (typeof msg.content === 'string') {
29
+ messages.push({ role: msg.role, content: msg.content });
30
+ }
31
+ else {
32
+ // Convert to Anthropic multimodal format
33
+ const parts = msg.content.map((part) => {
34
+ if (part.type === 'text') {
35
+ return { type: 'text', text: part.text ?? '' };
36
+ }
37
+ // Anthropic expects base64 images differently
38
+ const url = part.image_url?.url ?? '';
39
+ if (url.startsWith('data:')) {
40
+ const match = url.match(/^data:(image\/\w+);base64,(.+)$/);
41
+ if (match) {
42
+ return {
43
+ type: 'image',
44
+ source: {
45
+ type: 'base64',
46
+ media_type: match[1],
47
+ data: match[2],
48
+ },
49
+ };
50
+ }
51
+ }
52
+ return {
53
+ type: 'image',
54
+ source: { type: 'url', url },
55
+ };
56
+ });
57
+ messages.push({ role: msg.role, content: parts });
58
+ }
59
+ }
60
+ const body = {
61
+ model,
62
+ messages,
63
+ max_tokens: request.maxTokens ?? 4096,
64
+ };
65
+ if (systemPrompt) {
66
+ body.system = systemPrompt;
67
+ }
68
+ if (request.temperature !== undefined) {
69
+ body.temperature = request.temperature;
70
+ }
71
+ const url = `${this.baseUrl}/messages`;
72
+ const start = Date.now();
73
+ const res = await fetch(url, {
74
+ method: 'POST',
75
+ headers: {
76
+ 'Content-Type': 'application/json',
77
+ 'x-api-key': config.apiKey,
78
+ 'anthropic-version': '2023-06-01',
79
+ },
80
+ body: JSON.stringify(body),
81
+ signal: AbortSignal.timeout(config.timeout ?? 60_000),
82
+ });
83
+ if (!res.ok) {
84
+ const errText = await res.text().catch(() => 'Unknown error');
85
+ throw new Error(`Anthropic API error (${res.status}): ${errText}`);
86
+ }
87
+ const data = (await res.json());
88
+ const latencyMs = Date.now() - start;
89
+ const text = data.content
90
+ ?.filter((c) => c.type === 'text')
91
+ .map((c) => c.text)
92
+ .join('') ?? '';
93
+ return {
94
+ text,
95
+ usage: {
96
+ promptTokens: data.usage?.input_tokens ?? 0,
97
+ completionTokens: data.usage?.output_tokens ?? 0,
98
+ totalTokens: (data.usage?.input_tokens ?? 0) +
99
+ (data.usage?.output_tokens ?? 0),
100
+ },
101
+ model: data.model ?? model,
102
+ provider: 'anthropic',
103
+ latencyMs,
104
+ };
105
+ }
106
+ }
107
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/llm/providers/anthropic.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 HostedBetaAdapter implements ProviderAdapter {
3
+ readonly name: "hosted-beta";
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=hosted-beta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted-beta.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/hosted-beta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EAEV,MAAM,aAAa,CAAC;AAmFrB,qBAAa,iBAAkB,YAAW,eAAe;IACvD,QAAQ,CAAC,IAAI,EAAG,aAAa,CAAU;IACvC,QAAQ,CAAC,YAAY,SAAqB;IAC1C,QAAQ,CAAC,kBAAkB,SAA4B;IAEvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,CAAC,EAAE,MAAM;IAOtB,QAAQ,CACZ,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,kBAAkB,CAAC;CA8D/B"}
@@ -0,0 +1,106 @@
1
+ import { DEFAULT_LLM_MODEL, DEFAULT_LLM_VISION_MODEL, GEOTECHCLI_VERSION, } from '../../meta/index.js';
2
+ function inferCallType(request) {
3
+ const hasVisionInput = request.messages.some((message) => Array.isArray(message.content) &&
4
+ message.content.some((part) => part.type === 'image_url'));
5
+ if (hasVisionInput) {
6
+ return 'vision';
7
+ }
8
+ const hasAssistantTurns = request.messages.some((message) => message.role === 'assistant');
9
+ if (hasAssistantTurns || request.messages.length > 2) {
10
+ return 'agent';
11
+ }
12
+ return 'text';
13
+ }
14
+ function readMessageContent(content) {
15
+ if (typeof content === 'string') {
16
+ return content;
17
+ }
18
+ if (!Array.isArray(content)) {
19
+ return '';
20
+ }
21
+ return content
22
+ .map((part) => (part.type === 'text' ? part.text ?? '' : ''))
23
+ .join('\n')
24
+ .trim();
25
+ }
26
+ function formatHostedBetaError(status, data, fallback) {
27
+ const message = data.error?.message?.trim() || fallback;
28
+ const detail = data.error?.detail?.trim();
29
+ const remaining = typeof data.error?.remaining === 'number'
30
+ ? ` Remaining today: ${data.error.remaining}.`
31
+ : '';
32
+ const retryAfter = typeof data.error?.retry_after_seconds === 'number'
33
+ ? ` Retry in about ${data.error.retry_after_seconds}s.`
34
+ : '';
35
+ if (status === 429) {
36
+ return `${message}${remaining}${retryAfter}`.trim();
37
+ }
38
+ return detail ? `${message} ${detail}`.trim() : message;
39
+ }
40
+ export class HostedBetaAdapter {
41
+ name = 'hosted-beta';
42
+ defaultModel = DEFAULT_LLM_MODEL;
43
+ defaultVisionModel = DEFAULT_LLM_VISION_MODEL;
44
+ baseUrl;
45
+ constructor(baseUrl) {
46
+ this.baseUrl =
47
+ baseUrl ??
48
+ process.env.GEOTECHCLI_PROXY_URL?.trim() ??
49
+ 'https://beta.geotechcli.com/api/proxy';
50
+ }
51
+ async complete(request, config) {
52
+ const callType = inferCallType(request);
53
+ const effectiveBaseUrl = config.baseUrl?.trim() ||
54
+ process.env.GEOTECHCLI_PROXY_URL?.trim() ||
55
+ this.baseUrl;
56
+ const model = request.model ??
57
+ config.modelId ??
58
+ (callType === 'vision' ? this.defaultVisionModel : this.defaultModel);
59
+ const body = {
60
+ messages: request.messages,
61
+ model,
62
+ temperature: request.temperature,
63
+ maxTokens: request.maxTokens,
64
+ jsonMode: request.jsonMode ?? false,
65
+ };
66
+ const start = Date.now();
67
+ const res = await fetch(effectiveBaseUrl, {
68
+ method: 'POST',
69
+ headers: {
70
+ 'Content-Type': 'application/json',
71
+ 'X-Geotech-Client': 'geotechcli',
72
+ 'X-Geotech-Client-Version': GEOTECHCLI_VERSION,
73
+ 'X-Geotech-Call-Type': callType,
74
+ },
75
+ body: JSON.stringify(body),
76
+ signal: AbortSignal.timeout(config.timeout ?? 60_000),
77
+ });
78
+ let data = {};
79
+ let fallbackError = 'Hosted beta AI request failed.';
80
+ try {
81
+ data = (await res.json());
82
+ }
83
+ catch {
84
+ fallbackError = await res.text().catch(() => fallbackError);
85
+ }
86
+ if (!res.ok) {
87
+ throw new Error(formatHostedBetaError(res.status, data, fallbackError));
88
+ }
89
+ const choice = data.choices?.[0];
90
+ if (!choice?.message) {
91
+ throw new Error('Hosted beta AI returned no completion choices.');
92
+ }
93
+ return {
94
+ text: readMessageContent(choice.message.content),
95
+ usage: {
96
+ promptTokens: data.usage?.prompt_tokens ?? 0,
97
+ completionTokens: data.usage?.completion_tokens ?? 0,
98
+ totalTokens: data.usage?.total_tokens ?? 0,
99
+ },
100
+ model: data.model ?? model,
101
+ provider: 'hosted-beta',
102
+ latencyMs: Date.now() - start,
103
+ };
104
+ }
105
+ }
106
+ //# sourceMappingURL=hosted-beta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted-beta.js","sourceRoot":"","sources":["../../../src/llm/providers/hosted-beta.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { ProviderAdapter, CompletionRequest, CompletionResponse, LLMConfig } from '../types.js';
2
+ /**
3
+ * Hugging Face Inference Providers adapter.
4
+ *
5
+ * Uses the OpenAI-compatible router at https://router.huggingface.co/v1
6
+ * backed by 15+ providers (Cerebras, Together, Groq, Sambanova, etc.)
7
+ *
8
+ * Users can specify ANY model from the Hugging Face Hub:
9
+ * - meta-llama/Llama-3.1-8B-Instruct
10
+ * - mistralai/Mistral-7B-Instruct-v0.3
11
+ * - Qwen/Qwen2.5-VL-7B-Instruct (vision)
12
+ * - deepseek-ai/DeepSeek-V3
13
+ * - google/gemma-2-27b-it
14
+ * - etc.
15
+ *
16
+ * Append :provider to force a specific backend:
17
+ * - meta-llama/Llama-3.1-8B-Instruct:cerebras
18
+ * - meta-llama/Llama-3.1-8B-Instruct:together
19
+ *
20
+ * Append :fastest or :cheapest for automatic routing:
21
+ * - meta-llama/Llama-3.1-8B-Instruct:fastest
22
+ * - meta-llama/Llama-3.1-8B-Instruct:cheapest
23
+ *
24
+ * Authentication: HF token (hf_xxx) from https://huggingface.co/settings/tokens
25
+ * Required permission: "Make calls to Inference Providers"
26
+ *
27
+ * In strong beta, this provider can be used directly with the user's own token.
28
+ */
29
+ export declare class HuggingFaceAdapter implements ProviderAdapter {
30
+ readonly name: "huggingface";
31
+ readonly defaultModel = "meta-llama/Llama-3.1-8B-Instruct";
32
+ readonly defaultVisionModel = "Qwen/Qwen2.5-VL-7B-Instruct";
33
+ private readonly baseUrl;
34
+ constructor(baseUrl?: string);
35
+ complete(request: CompletionRequest, config: LLMConfig): Promise<CompletionResponse>;
36
+ }
37
+ //# sourceMappingURL=huggingface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"huggingface.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/huggingface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACV,MAAM,aAAa,CAAC;AAmBrB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,kBAAmB,YAAW,eAAe;IACxD,QAAQ,CAAC,IAAI,EAAG,aAAa,CAAU;IACvC,QAAQ,CAAC,YAAY,sCAAsC;IAC3D,QAAQ,CAAC,kBAAkB,iCAAiC;IAE5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,CAAC,EAAE,MAAM;IAKtB,QAAQ,CACZ,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,kBAAkB,CAAC;CA4H/B"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Hugging Face Inference Providers adapter.
3
+ *
4
+ * Uses the OpenAI-compatible router at https://router.huggingface.co/v1
5
+ * backed by 15+ providers (Cerebras, Together, Groq, Sambanova, etc.)
6
+ *
7
+ * Users can specify ANY model from the Hugging Face Hub:
8
+ * - meta-llama/Llama-3.1-8B-Instruct
9
+ * - mistralai/Mistral-7B-Instruct-v0.3
10
+ * - Qwen/Qwen2.5-VL-7B-Instruct (vision)
11
+ * - deepseek-ai/DeepSeek-V3
12
+ * - google/gemma-2-27b-it
13
+ * - etc.
14
+ *
15
+ * Append :provider to force a specific backend:
16
+ * - meta-llama/Llama-3.1-8B-Instruct:cerebras
17
+ * - meta-llama/Llama-3.1-8B-Instruct:together
18
+ *
19
+ * Append :fastest or :cheapest for automatic routing:
20
+ * - meta-llama/Llama-3.1-8B-Instruct:fastest
21
+ * - meta-llama/Llama-3.1-8B-Instruct:cheapest
22
+ *
23
+ * Authentication: HF token (hf_xxx) from https://huggingface.co/settings/tokens
24
+ * Required permission: "Make calls to Inference Providers"
25
+ *
26
+ * In strong beta, this provider can be used directly with the user's own token.
27
+ */
28
+ export class HuggingFaceAdapter {
29
+ name = 'huggingface';
30
+ defaultModel = 'meta-llama/Llama-3.1-8B-Instruct';
31
+ defaultVisionModel = 'Qwen/Qwen2.5-VL-7B-Instruct';
32
+ baseUrl;
33
+ constructor(baseUrl) {
34
+ // router.huggingface.co auto-selects the fastest provider for any model
35
+ this.baseUrl = baseUrl ?? 'https://router.huggingface.co/v1';
36
+ }
37
+ async complete(request, config) {
38
+ if (!config.apiKey) {
39
+ throw new Error('Hugging Face token is required. Get one at https://huggingface.co/settings/tokens\n' +
40
+ 'Set it via: geotech config set llm.api_key hf_your_token');
41
+ }
42
+ if (!config.apiKey.startsWith('hf_')) {
43
+ throw new Error('Invalid Hugging Face token format. HF tokens start with "hf_".\n' +
44
+ 'Get a token at https://huggingface.co/settings/tokens');
45
+ }
46
+ const effectiveBaseUrl = config.baseUrl ?? this.baseUrl;
47
+ const model = request.model ?? config.modelId ?? this.defaultModel;
48
+ // Build messages in OpenAI-compatible format (HF supports this natively)
49
+ const messages = request.messages.map((msg) => {
50
+ if (typeof msg.content === 'string') {
51
+ return { role: msg.role, content: msg.content };
52
+ }
53
+ // Multimodal: HF supports OpenAI vision format directly
54
+ return {
55
+ role: msg.role,
56
+ content: msg.content.map((part) => {
57
+ if (part.type === 'text') {
58
+ return { type: 'text', text: part.text ?? '' };
59
+ }
60
+ return {
61
+ type: 'image_url',
62
+ image_url: {
63
+ url: part.image_url?.url ?? '',
64
+ detail: part.image_url?.detail ?? 'auto',
65
+ },
66
+ };
67
+ }),
68
+ };
69
+ });
70
+ const body = {
71
+ model,
72
+ messages,
73
+ stream: false,
74
+ };
75
+ if (request.temperature !== undefined) {
76
+ body.temperature = request.temperature;
77
+ }
78
+ if (request.maxTokens !== undefined) {
79
+ body.max_tokens = request.maxTokens;
80
+ }
81
+ if (request.jsonMode) {
82
+ body.response_format = { type: 'json_object' };
83
+ }
84
+ const url = `${effectiveBaseUrl}/chat/completions`;
85
+ const start = Date.now();
86
+ const res = await fetch(url, {
87
+ method: 'POST',
88
+ headers: {
89
+ 'Content-Type': 'application/json',
90
+ Authorization: `Bearer ${config.apiKey}`,
91
+ },
92
+ body: JSON.stringify(body),
93
+ signal: AbortSignal.timeout(config.timeout ?? 90_000),
94
+ });
95
+ if (!res.ok) {
96
+ const errText = await res.text().catch(() => 'Unknown error');
97
+ // Friendly error messages for common HF issues
98
+ if (res.status === 401 || res.status === 403) {
99
+ throw new Error('Hugging Face authentication failed. Check your token has "Make calls to Inference Providers" permission.\n' +
100
+ 'Manage tokens at: https://huggingface.co/settings/tokens');
101
+ }
102
+ if (res.status === 404) {
103
+ throw new Error(`Model "${model}" not found on Hugging Face Inference Providers.\n` +
104
+ 'Browse available models at: https://huggingface.co/models?pipeline_tag=text-generation');
105
+ }
106
+ if (res.status === 429) {
107
+ throw new Error('Hugging Face rate limit reached. Wait a moment and retry, or use a HF PRO account for higher limits.');
108
+ }
109
+ if (res.status === 503) {
110
+ throw new Error(`Model "${model}" is currently loading or unavailable. Try again in 30-60 seconds, or use a different model.`);
111
+ }
112
+ throw new Error(`Hugging Face API error (${res.status}): ${errText}`);
113
+ }
114
+ const data = (await res.json());
115
+ const latencyMs = Date.now() - start;
116
+ const choice = data.choices?.[0];
117
+ if (!choice) {
118
+ throw new Error('Hugging Face API returned no choices.');
119
+ }
120
+ return {
121
+ text: choice.message.content,
122
+ usage: {
123
+ promptTokens: data.usage?.prompt_tokens ?? 0,
124
+ completionTokens: data.usage?.completion_tokens ?? 0,
125
+ totalTokens: data.usage?.total_tokens ?? 0,
126
+ },
127
+ model: data.model ?? model,
128
+ provider: 'huggingface',
129
+ latencyMs,
130
+ };
131
+ }
132
+ }
133
+ //# sourceMappingURL=huggingface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"huggingface.js","sourceRoot":"","sources":["../../../src/llm/providers/huggingface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { ProviderAdapter, CompletionRequest, CompletionResponse, LLMConfig, LLMProvider } from '../types.js';
2
+ /**
3
+ * OpenAI-compatible adapter.
4
+ *
5
+ * Works with:
6
+ * - OpenAI proper (api.openai.com)
7
+ * - Qwen on VPS via vLLM / Ollama (any OpenAI-compatible server)
8
+ * - Together, Groq, Fireworks, Deepseek, etc.
9
+ *
10
+ * This is the adapter used when Zhipu credits expire and you swap
11
+ * to Qwen 3.5 4B on your VPS. Just change the baseUrl and modelId
12
+ * in config — zero code changes needed.
13
+ */
14
+ export declare class OpenAICompatibleAdapter implements ProviderAdapter {
15
+ readonly name: LLMProvider;
16
+ readonly defaultModel: string;
17
+ readonly defaultVisionModel: string;
18
+ private readonly baseUrl;
19
+ constructor(options?: {
20
+ name?: LLMProvider;
21
+ baseUrl?: string;
22
+ defaultModel?: string;
23
+ defaultVisionModel?: string;
24
+ });
25
+ complete(request: CompletionRequest, config: LLMConfig): Promise<CompletionResponse>;
26
+ }
27
+ //# sourceMappingURL=openai-compatible.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/openai-compatible.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,WAAW,EACZ,MAAM,aAAa,CAAC;AAmBrB;;;;;;;;;;;GAWG;AACH,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAEpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,CAAC,EAAE;QACpB,IAAI,CAAC,EAAE,WAAW,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B;IAOK,QAAQ,CACZ,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,kBAAkB,CAAC;CAyF/B"}