@tyvm/knowhow 0.0.105 → 0.0.107

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 (219) hide show
  1. package/CONFIG.md +8 -5
  2. package/package.json +3 -2
  3. package/scripts/check-model-pricing.ts +509 -0
  4. package/scripts/compare-openrouter-coverage.ts +576 -0
  5. package/src/agents/base/base.ts +169 -5
  6. package/src/agents/tools/execCommand.ts +4 -0
  7. package/src/agents/tools/executeScript/definition.ts +1 -1
  8. package/src/agents/tools/index.ts +0 -1
  9. package/src/agents/tools/list.ts +3 -43
  10. package/src/agents/tools/writeFile.ts +1 -1
  11. package/src/auth/browserLogin.ts +9 -4
  12. package/src/chat/modules/RemoteSyncModule.ts +3 -0
  13. package/src/cli.ts +31 -1
  14. package/src/clients/anthropic.ts +8 -2
  15. package/src/clients/cerebras.ts +10 -0
  16. package/src/clients/contextLimits.ts +7 -2
  17. package/src/clients/copilot.ts +23 -0
  18. package/src/clients/deepseek.ts +16 -0
  19. package/src/clients/fireworks.ts +15 -0
  20. package/src/clients/gemini.ts +59 -4
  21. package/src/clients/github.ts +16 -0
  22. package/src/clients/groq.ts +15 -0
  23. package/src/clients/http.ts +194 -6
  24. package/src/clients/index.ts +116 -4
  25. package/src/clients/llama.ts +16 -0
  26. package/src/clients/mistral.ts +16 -0
  27. package/src/clients/nvidia.ts +16 -0
  28. package/src/clients/openai.ts +53 -12
  29. package/src/clients/openrouter.ts +17 -0
  30. package/src/clients/pricing/anthropic.ts +105 -78
  31. package/src/clients/pricing/cerebras.ts +11 -0
  32. package/src/clients/pricing/copilot.ts +60 -0
  33. package/src/clients/pricing/deepseek.ts +15 -0
  34. package/src/clients/pricing/fireworks.ts +32 -0
  35. package/src/clients/pricing/github.ts +69 -0
  36. package/src/clients/pricing/google.ts +245 -206
  37. package/src/clients/pricing/groq.ts +56 -0
  38. package/src/clients/pricing/index.ts +42 -5
  39. package/src/clients/pricing/llama.ts +18 -0
  40. package/src/clients/pricing/mistral.ts +34 -0
  41. package/src/clients/pricing/models.ts +7 -236
  42. package/src/clients/pricing/nvidia.ts +102 -0
  43. package/src/clients/pricing/openai.ts +348 -171
  44. package/src/clients/pricing/openrouter.ts +36 -0
  45. package/src/clients/pricing/types.ts +83 -2
  46. package/src/clients/pricing/xai.ts +121 -65
  47. package/src/clients/types.ts +28 -1
  48. package/src/clients/xai.ts +161 -1
  49. package/src/fileSync.ts +8 -2
  50. package/src/login.ts +11 -3
  51. package/src/services/AgentSyncFs.ts +36 -12
  52. package/src/services/KnowhowClient.ts +11 -0
  53. package/src/services/LazyToolsService.ts +6 -0
  54. package/src/services/S3.ts +0 -7
  55. package/src/services/modules/index.ts +11 -2
  56. package/src/types.ts +56 -279
  57. package/src/worker.ts +174 -0
  58. package/tests/clients/AIClient.test.ts +1 -1
  59. package/tests/clients/anthropic.test.ts +202 -0
  60. package/tests/clients/pricing.test.ts +37 -0
  61. package/tests/manual/clients/completions.json +838 -226
  62. package/tests/manual/clients/completions.test.ts +46 -31
  63. package/ts_build/package.json +3 -2
  64. package/ts_build/src/agents/base/base.d.ts +18 -1
  65. package/ts_build/src/agents/base/base.js +111 -4
  66. package/ts_build/src/agents/base/base.js.map +1 -1
  67. package/ts_build/src/agents/tools/execCommand.js +3 -0
  68. package/ts_build/src/agents/tools/execCommand.js.map +1 -1
  69. package/ts_build/src/agents/tools/executeScript/definition.js +1 -1
  70. package/ts_build/src/agents/tools/executeScript/definition.js.map +1 -1
  71. package/ts_build/src/agents/tools/index.d.ts +0 -1
  72. package/ts_build/src/agents/tools/index.js +0 -1
  73. package/ts_build/src/agents/tools/index.js.map +1 -1
  74. package/ts_build/src/agents/tools/list.js +3 -38
  75. package/ts_build/src/agents/tools/list.js.map +1 -1
  76. package/ts_build/src/agents/tools/visionTool.d.ts +1 -1
  77. package/ts_build/src/agents/tools/writeFile.js +1 -1
  78. package/ts_build/src/agents/tools/writeFile.js.map +1 -1
  79. package/ts_build/src/ai.d.ts +1 -1
  80. package/ts_build/src/auth/browserLogin.d.ts +2 -1
  81. package/ts_build/src/auth/browserLogin.js +10 -3
  82. package/ts_build/src/auth/browserLogin.js.map +1 -1
  83. package/ts_build/src/chat/modules/RemoteSyncModule.js +1 -0
  84. package/ts_build/src/chat/modules/RemoteSyncModule.js.map +1 -1
  85. package/ts_build/src/cli.js +19 -0
  86. package/ts_build/src/cli.js.map +1 -1
  87. package/ts_build/src/clients/anthropic.d.ts +1 -82
  88. package/ts_build/src/clients/anthropic.js +8 -2
  89. package/ts_build/src/clients/anthropic.js.map +1 -1
  90. package/ts_build/src/clients/cerebras.d.ts +4 -0
  91. package/ts_build/src/clients/cerebras.js +14 -0
  92. package/ts_build/src/clients/cerebras.js.map +1 -0
  93. package/ts_build/src/clients/contextLimits.js +7 -2
  94. package/ts_build/src/clients/contextLimits.js.map +1 -1
  95. package/ts_build/src/clients/copilot.d.ts +4 -0
  96. package/ts_build/src/clients/copilot.js +15 -0
  97. package/ts_build/src/clients/copilot.js.map +1 -0
  98. package/ts_build/src/clients/deepseek.d.ts +4 -0
  99. package/ts_build/src/clients/deepseek.js +15 -0
  100. package/ts_build/src/clients/deepseek.js.map +1 -0
  101. package/ts_build/src/clients/fireworks.d.ts +4 -0
  102. package/ts_build/src/clients/fireworks.js +15 -0
  103. package/ts_build/src/clients/fireworks.js.map +1 -0
  104. package/ts_build/src/clients/gemini.d.ts +1 -0
  105. package/ts_build/src/clients/gemini.js +38 -2
  106. package/ts_build/src/clients/gemini.js.map +1 -1
  107. package/ts_build/src/clients/github.d.ts +4 -0
  108. package/ts_build/src/clients/github.js +15 -0
  109. package/ts_build/src/clients/github.js.map +1 -0
  110. package/ts_build/src/clients/groq.d.ts +4 -0
  111. package/ts_build/src/clients/groq.js +15 -0
  112. package/ts_build/src/clients/groq.js.map +1 -0
  113. package/ts_build/src/clients/http.d.ts +22 -1
  114. package/ts_build/src/clients/http.js +135 -7
  115. package/ts_build/src/clients/http.js.map +1 -1
  116. package/ts_build/src/clients/index.d.ts +14 -0
  117. package/ts_build/src/clients/index.js +94 -4
  118. package/ts_build/src/clients/index.js.map +1 -1
  119. package/ts_build/src/clients/llama.d.ts +4 -0
  120. package/ts_build/src/clients/llama.js +15 -0
  121. package/ts_build/src/clients/llama.js.map +1 -0
  122. package/ts_build/src/clients/mistral.d.ts +4 -0
  123. package/ts_build/src/clients/mistral.js +15 -0
  124. package/ts_build/src/clients/mistral.js.map +1 -0
  125. package/ts_build/src/clients/nvidia.d.ts +4 -0
  126. package/ts_build/src/clients/nvidia.js +15 -0
  127. package/ts_build/src/clients/nvidia.js.map +1 -0
  128. package/ts_build/src/clients/openai.d.ts +4 -206
  129. package/ts_build/src/clients/openai.js +38 -10
  130. package/ts_build/src/clients/openai.js.map +1 -1
  131. package/ts_build/src/clients/openrouter.d.ts +4 -0
  132. package/ts_build/src/clients/openrouter.js +15 -0
  133. package/ts_build/src/clients/openrouter.js.map +1 -0
  134. package/ts_build/src/clients/pricing/anthropic.d.ts +26 -78
  135. package/ts_build/src/clients/pricing/anthropic.js +75 -78
  136. package/ts_build/src/clients/pricing/anthropic.js.map +1 -1
  137. package/ts_build/src/clients/pricing/cerebras.d.ts +4 -0
  138. package/ts_build/src/clients/pricing/cerebras.js +11 -0
  139. package/ts_build/src/clients/pricing/cerebras.js.map +1 -0
  140. package/ts_build/src/clients/pricing/copilot.d.ts +5 -0
  141. package/ts_build/src/clients/pricing/copilot.js +35 -0
  142. package/ts_build/src/clients/pricing/copilot.js.map +1 -0
  143. package/ts_build/src/clients/pricing/deepseek.d.ts +5 -0
  144. package/ts_build/src/clients/pricing/deepseek.js +10 -0
  145. package/ts_build/src/clients/pricing/deepseek.js.map +1 -0
  146. package/ts_build/src/clients/pricing/fireworks.d.ts +5 -0
  147. package/ts_build/src/clients/pricing/fireworks.js +21 -0
  148. package/ts_build/src/clients/pricing/fireworks.js.map +1 -0
  149. package/ts_build/src/clients/pricing/github.d.ts +4 -0
  150. package/ts_build/src/clients/pricing/github.js +58 -0
  151. package/ts_build/src/clients/pricing/github.js.map +1 -0
  152. package/ts_build/src/clients/pricing/google.d.ts +59 -6
  153. package/ts_build/src/clients/pricing/google.js +214 -167
  154. package/ts_build/src/clients/pricing/google.js.map +1 -1
  155. package/ts_build/src/clients/pricing/groq.d.ts +5 -0
  156. package/ts_build/src/clients/pricing/groq.js +41 -0
  157. package/ts_build/src/clients/pricing/groq.js.map +1 -0
  158. package/ts_build/src/clients/pricing/index.d.ts +16 -5
  159. package/ts_build/src/clients/pricing/index.js +62 -7
  160. package/ts_build/src/clients/pricing/index.js.map +1 -1
  161. package/ts_build/src/clients/pricing/llama.d.ts +4 -0
  162. package/ts_build/src/clients/pricing/llama.js +14 -0
  163. package/ts_build/src/clients/pricing/llama.js.map +1 -0
  164. package/ts_build/src/clients/pricing/mistral.d.ts +5 -0
  165. package/ts_build/src/clients/pricing/mistral.js +23 -0
  166. package/ts_build/src/clients/pricing/mistral.js.map +1 -0
  167. package/ts_build/src/clients/pricing/models.d.ts +5 -4
  168. package/ts_build/src/clients/pricing/models.js +8 -162
  169. package/ts_build/src/clients/pricing/models.js.map +1 -1
  170. package/ts_build/src/clients/pricing/nvidia.d.ts +8 -0
  171. package/ts_build/src/clients/pricing/nvidia.js +96 -0
  172. package/ts_build/src/clients/pricing/nvidia.js.map +1 -0
  173. package/ts_build/src/clients/pricing/openai.d.ts +86 -197
  174. package/ts_build/src/clients/pricing/openai.js +295 -168
  175. package/ts_build/src/clients/pricing/openai.js.map +1 -1
  176. package/ts_build/src/clients/pricing/openrouter.d.ts +4 -0
  177. package/ts_build/src/clients/pricing/openrouter.js +29 -0
  178. package/ts_build/src/clients/pricing/openrouter.js.map +1 -0
  179. package/ts_build/src/clients/pricing/types.d.ts +27 -2
  180. package/ts_build/src/clients/pricing/types.js +46 -0
  181. package/ts_build/src/clients/pricing/types.js.map +1 -1
  182. package/ts_build/src/clients/pricing/xai.d.ts +37 -57
  183. package/ts_build/src/clients/pricing/xai.js +92 -59
  184. package/ts_build/src/clients/pricing/xai.js.map +1 -1
  185. package/ts_build/src/clients/types.d.ts +12 -1
  186. package/ts_build/src/clients/xai.d.ts +2 -62
  187. package/ts_build/src/clients/xai.js +132 -1
  188. package/ts_build/src/clients/xai.js.map +1 -1
  189. package/ts_build/src/fileSync.js +7 -2
  190. package/ts_build/src/fileSync.js.map +1 -1
  191. package/ts_build/src/login.js +8 -2
  192. package/ts_build/src/login.js.map +1 -1
  193. package/ts_build/src/services/AgentSyncFs.js +1 -0
  194. package/ts_build/src/services/AgentSyncFs.js.map +1 -1
  195. package/ts_build/src/services/KnowhowClient.d.ts +1 -0
  196. package/ts_build/src/services/KnowhowClient.js +7 -0
  197. package/ts_build/src/services/KnowhowClient.js.map +1 -1
  198. package/ts_build/src/services/LazyToolsService.d.ts +1 -0
  199. package/ts_build/src/services/LazyToolsService.js +3 -0
  200. package/ts_build/src/services/LazyToolsService.js.map +1 -1
  201. package/ts_build/src/services/S3.js +0 -7
  202. package/ts_build/src/services/S3.js.map +1 -1
  203. package/ts_build/src/services/modules/index.js +41 -1
  204. package/ts_build/src/services/modules/index.js.map +1 -1
  205. package/ts_build/src/types.d.ts +163 -124
  206. package/ts_build/src/types.js +33 -213
  207. package/ts_build/src/types.js.map +1 -1
  208. package/ts_build/src/worker.d.ts +4 -0
  209. package/ts_build/src/worker.js +140 -0
  210. package/ts_build/src/worker.js.map +1 -1
  211. package/ts_build/tests/clients/AIClient.test.js +1 -1
  212. package/ts_build/tests/clients/AIClient.test.js.map +1 -1
  213. package/ts_build/tests/clients/anthropic.test.d.ts +1 -0
  214. package/ts_build/tests/clients/anthropic.test.js +159 -0
  215. package/ts_build/tests/clients/anthropic.test.js.map +1 -0
  216. package/ts_build/tests/clients/pricing.test.js +21 -0
  217. package/ts_build/tests/clients/pricing.test.js.map +1 -1
  218. package/ts_build/tests/manual/clients/completions.test.js +27 -24
  219. package/ts_build/tests/manual/clients/completions.test.js.map +1 -1
@@ -121,7 +121,11 @@ export class AgentSyncFs {
121
121
  /**
122
122
  * Update metadata file with current agent state
123
123
  */
124
- private async updateMetadata(agent: BaseAgent, inProgress: boolean, result?: string): Promise<void> {
124
+ private async updateMetadata(
125
+ agent: BaseAgent,
126
+ inProgress: boolean,
127
+ result?: string
128
+ ): Promise<void> {
125
129
  if (!this.taskPath) return;
126
130
 
127
131
  try {
@@ -137,7 +141,8 @@ export class AgentSyncFs {
137
141
 
138
142
  metadata.threads = agent.getThreads();
139
143
  metadata.totalCostUsd = agent.getTotalCostUsd();
140
- metadata.agentName = agent.name;
144
+ metadata.tokenUsage = agent.getTokenUsage();
145
+ metadata.agentName = agent.name;
141
146
  metadata.inProgress = inProgress;
142
147
  metadata.lastUpdate = new Date().toISOString();
143
148
 
@@ -147,7 +152,11 @@ export class AgentSyncFs {
147
152
  await this.writeStatus("completed");
148
153
  }
149
154
 
150
- await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2), "utf8");
155
+ await fs.writeFile(
156
+ metadataPath,
157
+ JSON.stringify(metadata, null, 2),
158
+ "utf8"
159
+ );
151
160
  } catch (error) {
152
161
  console.error(`❌ Failed to update metadata:`, error);
153
162
  }
@@ -206,7 +215,9 @@ export class AgentSyncFs {
206
215
  // Check for new input/messages
207
216
  const input = await this.readInput();
208
217
  if (input && input !== this.lastInputContent && input.trim() !== "") {
209
- console.log(`📬 New message received via filesystem for task ${this.taskId}`);
218
+ console.log(
219
+ `📬 New message received via filesystem for task ${this.taskId}`
220
+ );
210
221
  this.lastInputContent = input;
211
222
 
212
223
  agent.addPendingUserMessage({
@@ -234,7 +245,7 @@ export class AgentSyncFs {
234
245
  await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
235
246
 
236
247
  const status = await this.readStatus();
237
-
248
+
238
249
  if (status === "killed") {
239
250
  console.log(`🛑 Agent task ${this.taskId} killed while paused`);
240
251
  await agent.kill();
@@ -314,7 +325,10 @@ export class AgentSyncFs {
314
325
  console.error(`❌ Error during threadUpdate sync:`, error);
315
326
  }
316
327
  };
317
- agent.agentEvents.on(agent.eventTypes.threadUpdate, this.threadUpdateHandler);
328
+ agent.agentEvents.on(
329
+ agent.eventTypes.threadUpdate,
330
+ this.threadUpdateHandler
331
+ );
318
332
 
319
333
  // Listen to completion event to finalize task (store reference for cleanup)
320
334
  this.doneHandler = (result: string) => {
@@ -323,7 +337,9 @@ export class AgentSyncFs {
323
337
  return;
324
338
  }
325
339
 
326
- console.log(`🎯 [AgentSyncFs] Done event received for task: ${this.taskId}`);
340
+ console.log(
341
+ `🎯 [AgentSyncFs] Done event received for task: ${this.taskId}`
342
+ );
327
343
 
328
344
  // Store finalization promise so callers can await it (same pattern as AgentSyncKnowhowWeb)
329
345
  this.finalizationPromise = (async () => {
@@ -332,7 +348,9 @@ export class AgentSyncFs {
332
348
  // This prevents the race where a pending "inProgress: true" metadata write
333
349
  // overwrites the finalization write.
334
350
  if (this.pendingThreadUpdatePromise) {
335
- console.log(`⏳ [AgentSyncFs] Awaiting pending thread update before finalizing...`);
351
+ console.log(
352
+ `⏳ [AgentSyncFs] Awaiting pending thread update before finalizing...`
353
+ );
336
354
  await this.pendingThreadUpdatePromise.catch(() => {
337
355
  // Ignore errors in pending update — we still want to finalize
338
356
  });
@@ -379,7 +397,7 @@ export class AgentSyncFs {
379
397
  private static async cleanupOldTasks(): Promise<void> {
380
398
  try {
381
399
  const agentsPath = AgentSyncFs.sharedBasePath;
382
-
400
+
383
401
  // Check if directory exists
384
402
  try {
385
403
  await fs.access(agentsPath);
@@ -396,7 +414,7 @@ export class AgentSyncFs {
396
414
  if (!entry.isDirectory()) continue;
397
415
 
398
416
  const taskPath = path.join(agentsPath, entry.name);
399
-
417
+
400
418
  try {
401
419
  const stats = await fs.stat(taskPath);
402
420
  const age = now - stats.mtimeMs;
@@ -449,11 +467,17 @@ export class AgentSyncFs {
449
467
  // Remove old event listeners from the agent before resetting
450
468
  if (this.agent) {
451
469
  if (this.threadUpdateHandler) {
452
- this.agent.agentEvents.removeListener(this.agent.eventTypes.threadUpdate, this.threadUpdateHandler);
470
+ this.agent.agentEvents.removeListener(
471
+ this.agent.eventTypes.threadUpdate,
472
+ this.threadUpdateHandler
473
+ );
453
474
  this.threadUpdateHandler = undefined;
454
475
  }
455
476
  if (this.doneHandler) {
456
- this.agent.agentEvents.removeListener(this.agent.eventTypes.done, this.doneHandler);
477
+ this.agent.agentEvents.removeListener(
478
+ this.agent.eventTypes.done,
479
+ this.doneHandler
480
+ );
457
481
  this.doneHandler = undefined;
458
482
  }
459
483
  this.agent = undefined;
@@ -144,6 +144,17 @@ export class KnowhowSimpleClient {
144
144
  this.setJwt(jwt);
145
145
  }
146
146
 
147
+ /**
148
+ * Reload the JWT from disk (useful after login refreshes the token).
149
+ */
150
+ refreshJwt() {
151
+ const freshJwt = loadKnowhowJwt();
152
+ if (freshJwt) {
153
+ this.setJwt(freshJwt);
154
+ this.jwtValidated = false;
155
+ }
156
+ }
157
+
147
158
  setJwt(jwt: string) {
148
159
  this.jwt = jwt;
149
160
  this.headers = {
@@ -57,6 +57,12 @@ export class LazyToolsService extends ToolsService {
57
57
  this.updateVisibleTools();
58
58
  }
59
59
 
60
+ // Override addTool (singular) to also route through allTools so that
61
+ // module-registered tools (via ModulesService.addTool) are tracked correctly.
62
+ addTool(tool: Tool) {
63
+ this.addTools([tool]);
64
+ }
65
+
60
66
  // Override getTools to return only enabled tools
61
67
  getTools() {
62
68
  return this.tools; // Returns filtered subset
@@ -1,5 +1,4 @@
1
1
  import * as fs from "fs";
2
- import * as crypto from "crypto";
3
2
  import { createWriteStream, createReadStream } from "fs";
4
3
  import { pipeline, Readable } from "stream";
5
4
  import * as util from "util";
@@ -14,17 +13,11 @@ export class S3Service {
14
13
  try {
15
14
  const fileContent = fs.readFileSync(filePath);
16
15
  const fileStats = await fs.promises.stat(filePath);
17
- const sha256Base64 = crypto
18
- .createHash("sha256")
19
- .update(fileContent)
20
- .digest("base64");
21
16
 
22
17
  const response = await fetch(presignedUrl, {
23
18
  method: "PUT",
24
19
  headers: {
25
20
  "Content-Length": String(fileStats.size),
26
- "x-amz-checksum-sha256": sha256Base64,
27
- "x-amz-sdk-checksum-algorithm": "SHA256",
28
21
  },
29
22
  body: fileContent,
30
23
  // @ts-ignore
@@ -2,7 +2,7 @@ import { getConfig, getGlobalConfig } from "../../config";
2
2
  import { KnowhowModule, ModuleContext } from "./types";
3
3
  import { ToolsService } from "../Tools";
4
4
  import { services } from "../";
5
- import { EventService } from "../EventService";
5
+ import * as path from "path";
6
6
 
7
7
  export class ModulesService {
8
8
  async loadModulesFromConfig(context?: ModuleContext) {
@@ -35,8 +35,17 @@ export class ModulesService {
35
35
  ];
36
36
 
37
37
  for (const modulePath of allModulePaths) {
38
- const importedModule = require(modulePath) as KnowhowModule;
38
+ // Resolve relative paths relative to process.cwd() so that paths like
39
+ // "../../packages/knowhow-module-load-webpage" in knowhow.json work
40
+ // regardless of where the compiled output lives.
41
+ const resolvedPath = modulePath.startsWith(".")
42
+ ? path.resolve(process.cwd(), modulePath)
43
+ : modulePath;
44
+ const rawModule = require(resolvedPath);
45
+ const importedModule = (rawModule.default || rawModule) as KnowhowModule;
46
+ console.log(`🔌 Loading module: ${modulePath} (resolved: ${resolvedPath})`);
39
47
  await importedModule.init({ config, cwd: process.cwd(), context });
48
+ console.log(`✅ Module initialized: ${modulePath} (tools: ${importedModule.tools.length}, agents: ${importedModule.agents.length}, plugins: ${importedModule.plugins.length}, clients: ${importedModule.clients.length})`);
40
49
 
41
50
  for (const agent of importedModule.agents) {
42
51
  agentService.registerAgent(agent);
package/src/types.ts CHANGED
@@ -4,7 +4,6 @@ import { WebSocket } from "ws";
4
4
  export type Hashes = {
5
5
  [file: string]: {
6
6
  [promptHash: string]: string;
7
-
8
7
  promptHash: string;
9
8
  fileHash: string;
10
9
  };
@@ -38,37 +37,25 @@ export type Config = {
38
37
  openaiBaseUrl?: string;
39
38
  promptsDir: string;
40
39
  lintCommands?: { [fileExtension: string]: string };
41
-
40
+ orgId?: string;
42
41
  syncRemote?: boolean;
43
-
44
42
  micCommand?: string;
45
43
  defaultMic?: string;
46
-
47
44
  sources: GenerationSource[];
48
45
  embedSources: EmbedSource[];
49
46
  embeddingModel: string;
50
-
51
47
  skills?: string[];
52
-
53
48
  plugins: { enabled: string[]; disabled: string[] };
54
-
55
49
  chat?: {
56
- /** Path to a custom root chat module (npm package or local file) */
57
50
  rootModule?: string;
58
- /** Path to a custom renderer (npm package or local file, can be .ts) */
59
51
  renderer?: string;
60
- /** Additional chat modules to load (npm packages or local files, can be .ts) */
61
52
  modules?: string[];
62
53
  };
63
-
64
54
  modules: string[];
65
-
66
55
  pluginPackages?: Record<string, string>;
67
-
68
56
  agents: Assistant[];
69
57
  mcps: McpConfig[];
70
58
  modelProviders: ModelProvider[];
71
-
72
59
  ycmd?: {
73
60
  enabled?: boolean;
74
61
  installPath?: string;
@@ -76,13 +63,11 @@ export type Config = {
76
63
  logLevel?: "debug" | "info" | "warning" | "error";
77
64
  completionTimeout?: number;
78
65
  };
79
-
80
66
  files?: {
81
- remotePath: string; // path in Knowhow FS, e.g. "/docs/readme.md" or "/configs/"
82
- localPath: string; // local path to write to, e.g. "./docs/readme.md" or "./configs/"
83
- direction?: "download" | "upload" | "sync"; // default: "download"
67
+ remotePath: string;
68
+ localPath: string;
69
+ direction?: "download" | "upload" | "sync";
84
70
  }[];
85
-
86
71
  worker?: {
87
72
  allowedTools?: string[];
88
73
  workerId?: string;
@@ -92,24 +77,20 @@ export type Config = {
92
77
  auth?: {
93
78
  required?: boolean;
94
79
  passkey?: {
95
- publicKey?: string; // base64-encoded public key
96
- credentialId?: string; // base64-encoded credential ID
97
- algorithm?: string; // e.g. "ES256"
80
+ publicKey?: string;
81
+ credentialId?: string;
82
+ algorithm?: string;
98
83
  };
99
84
  sessionDurationHours?: number;
100
85
  };
101
- commandAuth?: {
102
- [toolName: string]: "always" | "session" | "never";
103
- };
86
+ commandAuth?: { [toolName: string]: "always" | "session" | "never" };
104
87
  tunnel?: {
105
88
  enabled?: boolean;
106
89
  allowedPorts?: number[];
107
90
  maxConcurrentStreams?: number;
108
- portMapping?: {
109
- [containerPort: number]: number; // containerPort -> hostPort
110
- };
111
- localHost?: string; // Default: "127.0.0.1", can be "host.docker.internal" for Docker
112
- enableUrlRewriting?: boolean; // Enable URL rewriting for localhost URLs (default: true)
91
+ portMapping?: { [containerPort: number]: number };
92
+ localHost?: string;
93
+ enableUrlRewriting?: boolean;
113
94
  };
114
95
  };
115
96
  };
@@ -124,7 +105,7 @@ export type Assistant = {
124
105
 
125
106
  export type McpConfig = {
126
107
  name: string;
127
- autoConnect?: boolean; // Default: true - connect at startup. Set to false for on-demand connection
108
+ autoConnect?: boolean;
128
109
  command?: string;
129
110
  url?: string;
130
111
  args?: string[];
@@ -140,6 +121,10 @@ export type ModelProvider = {
140
121
  envKey?: string;
141
122
  headers?: { [key: string]: string };
142
123
  jwtFile?: string;
124
+ timeout?: number;
125
+ extra_body?: Record<string, any>;
126
+ /** Optional pricing map (model id → per-million-token prices) passed to HttpClient.setPrices() */
127
+ pricing?: Record<string, { input?: number; output?: number; cached_input?: number; cache_hit?: number }>;
143
128
  };
144
129
 
145
130
  export type AssistantConfig = {
@@ -153,17 +138,13 @@ export interface Embeddable<T = any> {
153
138
  metadata: T;
154
139
  }
155
140
 
156
- export type MinimalEmbedding<T = any> = Pick<
157
- Embeddable<T>,
158
- "id" | "text" | "metadata"
159
- >;
141
+ export type MinimalEmbedding<T = any> = Pick<Embeddable<T>, "id" | "text" | "metadata">;
160
142
 
161
143
  export interface EmbeddingBase<T = any> extends Embeddable<T> {
162
144
  similarity?: number;
163
145
  }
164
146
 
165
147
  export type GptQuestionEmbedding = any & EmbeddingBase;
166
-
167
148
  export type DatasourceType = "file" | "url" | "text";
168
149
 
169
150
  export interface IDatasource {
@@ -186,150 +167,55 @@ export type ChatInteraction = {
186
167
  taskId: string;
187
168
  };
188
169
 
189
- export const Models = {
190
- anthropic: {
191
- Opus4_6: "claude-opus-4-6",
192
- Sonnet4_6: "claude-sonnet-4-6",
193
- Opus4_5: "claude-opus-4-5",
194
- Opus4: "claude-opus-4",
195
- Opus4_1: "claude-opus-4-1",
196
- Sonnet4_5: "claude-sonnet-4-5",
197
- Haiku4_5: "claude-haiku-4-5",
198
- Sonnet4: "claude-sonnet-4",
199
- Sonnet3_7: "claude-3-7-sonnet",
200
- Sonnet3_5: "claude-3-5-sonnet",
201
- Opus3: "claude-3-opus",
202
- Haiku3: "claude-3-haiku",
203
- },
204
- xai: {
205
- Grok_4_20_Reasoning: "grok-4.20-0309-reasoning",
206
- Grok_4_20_NonReasoning: "grok-4.20-0309-non-reasoning",
207
- Grok4_1_Fast_Reasoning: "grok-4-1-fast-reasoning",
208
- Grok4_1_Fast_NonReasoning: "grok-4-1-fast-non-reasoning",
209
- GrokCodeFast: "grok-code-fast-1",
210
- Grok4: "grok-4-0709",
211
- Grok3Beta: "grok-3-beta",
212
- Grok3MiniBeta: "grok-3-mini-beta",
213
- Grok3FastBeta: "grok-3-fast-beta",
214
- Grok3MiniFastBeta: "grok-3-mini-fast-beta",
215
- Grok21212: "grok-2-1212",
216
- Grok2Vision1212: "grok-2-vision-1212",
217
- GrokImagineImage: "grok-imagine-image",
218
- GrokImagineVideo: "grok-imagine-video",
219
- },
220
- openai: {
221
- GPT_54: "gpt-5.4",
222
- GPT_54_Mini: "gpt-5.4-mini",
223
- GPT_54_Nano: "gpt-5.4-nano",
224
- GPT_54_Pro: "gpt-5.4-pro",
225
- GPT_53_Chat: "gpt-5.3-chat-latest",
226
- GPT_53_Codex: "gpt-5.3-codex",
227
- GPT_5_2: "gpt-5.2",
228
- GPT_5_1: "gpt-5.1",
229
- GPT_5: "gpt-5",
230
- GPT_5_Mini: "gpt-5-mini",
231
- GPT_5_Nano: "gpt-5-nano",
232
- GPT_41: "gpt-4.1-2025-04-14",
233
- GPT_41_Mini: "gpt-4.1-mini-2025-04-14",
234
- GPT_41_Nano: "gpt-4.1-nano-2025-04-14",
235
- GPT_45: "gpt-4.5-preview-2025-02-27",
236
- GPT_4o: "gpt-4o-2024-08-06",
237
- GPT_4o_Audio: "gpt-4o-audio-preview-2024-12-17",
238
- GPT_4o_Realtime: "gpt-4o-realtime-preview-2024-12-17",
239
- GPT_4o_Mini: "gpt-4o-mini-2024-07-18",
240
- GPT_4o_Mini_Audio: "gpt-4o-mini-audio-preview-2024-12-17",
241
- GPT_4o_Mini_Realtime: "gpt-4o-mini-realtime-preview-2024-12-17",
242
- o1: "o1-2024-12-17",
243
- o1_Pro: "o1-pro-2025-03-19",
244
- o3: "o3-2025-04-16",
245
- o3_Pro: "o3-pro-2025-01-31",
246
- o4_Mini: "o4-mini-2025-04-16",
247
- o3_Mini: "o3-mini-2025-01-31",
248
- o1_Mini: "o1-mini-2024-09-12",
249
- GPT_4o_Mini_Search: "gpt-4o-mini-search-preview-2025-03-11",
250
- GPT_4o_Search: "gpt-4o-search-preview-2025-03-11",
170
+ // ─── Model IDs ────────────────────────────────────────────────────────────────
171
+ // Each provider's pricing file is the single source of truth.
172
+
173
+ import { AnthropicModels, AnthropicTextModels } from "./clients/pricing/anthropic";
174
+ import {
175
+ OpenAiModels, OpenAiEmbeddingModels,
176
+ OpenAiReasoningModels, OpenAiChatModels, OpenAiEmbeddingModelsList,
177
+ OpenAiResponsesOnlyModels, OpenAiImageModels, OpenAiVideoModels,
178
+ OpenAiTTSModels, OpenAiTranscriptionModels, OpenAiRealtimeModels,
179
+ } from "./clients/pricing/openai";
180
+ import {
181
+ GoogleModels, GoogleEmbeddingModels,
182
+ GoogleTextModels, GoogleImageModels, GoogleVideoModels,
183
+ GoogleTTSModels, GoogleEmbeddingModelsList, GoogleThinkingLevelModels, GoogleThinkingBudgetModels,
184
+ } from "./clients/pricing/google";
185
+ import {
186
+ XaiModels, XaiTextModels, XaiImageModels, XaiVideoModels, XaiResponsesOnlyModels, XaiReasoningModels,
187
+ } from "./clients/pricing/xai";
251
188
 
252
- GPT_4o_Transcribe: "gpt-4o-transcribe",
253
- GPT_4o_Mini_Transcribe: "gpt-4o-mini-transcribe",
254
- GPT_Realtime_15: "gpt-realtime-1.5",
255
- GPT_Realtime_Mini: "gpt-realtime-mini",
256
- GPT_Image_15: "gpt-image-1.5",
257
- GPT_Image_1_Mini: "gpt-image-1-mini",
258
- TTS_1: "tts-1",
259
- Whisper_1: "whisper-1",
260
- DALL_E_3: "dall-e-3",
261
- DALL_E_2: "dall-e-2",
262
- Sora: "sora",
263
- Sora_2: "sora-2",
264
- Sora_2_Pro: "sora-2-pro",
265
- // Computer_Use: "computer-use-preview-2025-03-11",
266
- // Codex_Mini: "codex-mini-latest",
267
- },
268
- google: {
269
- // Gemini 3.x
270
- Gemini_31_Pro_Preview: "gemini-3.1-pro-preview",
271
- Gemini_31_Flash_Image_Preview: "gemini-3.1-flash-image-preview",
272
- Gemini_31_Flash_Lite_Preview: "gemini-3.1-flash-lite-preview",
273
- Gemini_31_Flash_Live_Preview: "gemini-3.1-flash-live-preview",
274
- Gemini_3_Flash_Preview: "gemini-3-flash-preview",
275
- Gemini_3_Pro_Image_Preview: "gemini-3-pro-image-preview",
276
- // Gemini 2.5
277
- Gemini_25_Pro: "gemini-2.5-pro",
278
- Gemini_25_Flash: "gemini-2.5-flash",
279
- Gemini_25_Flash_Lite: "gemini-2.5-flash-lite",
280
- Gemini_25_Flash_Preview: "gemini-2.5-flash-preview-05-20",
281
- Gemini_25_Pro_Preview: "gemini-2.5-pro-preview-05-06",
282
- Gemini_25_Flash_Image: "gemini-2.5-flash-image",
283
- Gemini_25_Flash_Live: "gemini-2.5-flash-live-preview",
284
- Gemini_25_Flash_Native_Audio:
285
- "gemini-2.5-flash-native-audio-preview-12-2025",
286
- Gemini_25_Pro_TTS: "gemini-2.5-pro-preview-tts",
287
- // Gemini 2.0 (deprecated)
288
- Gemini_20_Flash: "gemini-2.0-flash",
289
- Gemini_20_Flash_Preview_Image_Generation:
290
- "gemini-2.0-flash-exp-image-generation",
291
- // Gemini 1.5 (legacy)
292
- Gemini_15_Flash: "gemini-1.5-flash",
293
- Gemini_15_Flash_8B: "gemini-1.5-flash-8b",
294
- Gemini_15_Pro: "gemini-1.5-pro",
295
- // Media generation
296
- Imagen_3: "imagen-4.0-generate-001",
297
- Imagen_4_Fast: "imagen-4.0-fast-generate-001",
298
- Imagen_4_Ultra: "imagen-4.0-ultra-generate-001",
299
- Veo_2: "veo-2.0-generate-001",
300
- Veo_3: "veo-3.0-generate-001",
301
- Veo_3_Fast: "veo-3.0-fast-generate-001",
302
- Veo_3_1: "veo-3.1-generate-preview",
303
- Veo_3_1_Fast: "veo-3.1-fast-generate-preview",
304
- // Audio / Live
305
- Gemini_20_Flash_Live: "gemini-2.0-flash-live-001",
306
- Gemini_25_Flash_TTS: "gemini-2.5-flash-preview-tts",
307
- Gemini_20_Flash_TTS: "gemini-2.0-flash-preview-tts",
308
- },
189
+ export const Models = {
190
+ anthropic: AnthropicModels,
191
+ xai: XaiModels,
192
+ openai: OpenAiModels,
193
+ google: GoogleModels,
309
194
  };
310
195
 
311
196
  export const EmbeddingModels = {
312
- openai: {
313
- EmbeddingAda2: "text-embedding-ada-002",
314
- EmbeddingLarge3: "text-embedding-3-large",
315
- EmbeddingSmall3: "text-embedding-3-small",
316
- },
317
- google: {
318
- Gemini_Embedding: "gemini-embedding-exp",
319
- Gemini_Embedding_001: "gemini-embedding-001",
320
- },
197
+ openai: OpenAiEmbeddingModels,
198
+ google: GoogleEmbeddingModels,
199
+ };
200
+
201
+ // Re-export modality arrays for consumers
202
+ export {
203
+ OpenAiReasoningModels, OpenAiChatModels, OpenAiEmbeddingModelsList,
204
+ OpenAiResponsesOnlyModels, OpenAiImageModels, OpenAiVideoModels,
205
+ OpenAiTTSModels, OpenAiTranscriptionModels, OpenAiRealtimeModels,
206
+ GoogleTextModels as GoogleReasoningModels,
207
+ GoogleImageModels, GoogleVideoModels, GoogleTTSModels, GoogleEmbeddingModelsList,
208
+ GoogleThinkingLevelModels, GoogleThinkingBudgetModels,
209
+ AnthropicTextModels,
210
+ XaiTextModels, XaiImageModels, XaiVideoModels, XaiResponsesOnlyModels, XaiReasoningModels,
321
211
  };
322
212
 
323
- export function getEnabledPlugins(
324
- plugins: Config["plugins"] | undefined
325
- ): string[] {
213
+ export function getEnabledPlugins(plugins: Config["plugins"] | undefined): string[] {
326
214
  if (!plugins) return [];
327
215
  return plugins.enabled ?? [];
328
216
  }
329
217
 
330
- export function getDisabledPlugins(
331
- plugins: Config["plugins"] | undefined
332
- ): string[] {
218
+ export function getDisabledPlugins(plugins: Config["plugins"] | undefined): string[] {
333
219
  if (!plugins) return [];
334
220
  return plugins.disabled ?? [];
335
221
  }
@@ -338,112 +224,3 @@ export const Providers = Object.keys(Models).reduce((obj, key) => {
338
224
  obj[key] = key;
339
225
  return obj;
340
226
  }, {}) as { [key in keyof typeof Models]: keyof typeof Models };
341
-
342
- export const OpenAiReasoningModels = [
343
- Models.openai.o1,
344
- Models.openai.o1_Mini,
345
- Models.openai.o3_Mini,
346
- Models.openai.o3,
347
- Models.openai.o3_Pro,
348
- Models.openai.o4_Mini,
349
- Models.openai.GPT_54,
350
- Models.openai.GPT_54_Mini,
351
- Models.openai.GPT_54_Nano,
352
- Models.openai.GPT_54_Pro,
353
- Models.openai.GPT_53_Chat,
354
- Models.openai.GPT_53_Codex,
355
- Models.openai.GPT_5,
356
- Models.openai.GPT_5_Mini,
357
- Models.openai.GPT_5_Nano,
358
- Models.openai.GPT_5_1,
359
- Models.openai.GPT_5_2,
360
- ];
361
-
362
- export const OpenAiEmbeddingModels = [
363
- EmbeddingModels.openai.EmbeddingAda2,
364
- EmbeddingModels.openai.EmbeddingLarge3,
365
- EmbeddingModels.openai.EmbeddingSmall3,
366
- ];
367
-
368
- // Models that ONLY support the Responses API (not Chat Completions)
369
- export const OpenAiResponsesOnlyModels = [
370
- Models.openai.GPT_53_Codex,
371
- Models.openai.GPT_54,
372
- Models.openai.GPT_54_Mini,
373
- Models.openai.GPT_54_Nano,
374
- Models.openai.GPT_54_Pro,
375
- ];
376
-
377
- export const GoogleReasoningModels = [
378
- Models.google.Gemini_31_Pro_Preview,
379
- Models.google.Gemini_31_Flash_Lite_Preview,
380
- Models.google.Gemini_3_Flash_Preview,
381
- Models.google.Gemini_25_Pro,
382
- Models.google.Gemini_25_Flash,
383
- Models.google.Gemini_25_Flash_Lite,
384
- Models.google.Gemini_25_Flash_Preview,
385
- Models.google.Gemini_25_Pro_Preview,
386
- Models.google.Gemini_20_Flash,
387
- Models.google.Gemini_15_Flash,
388
- Models.google.Gemini_15_Flash_8B,
389
- Models.google.Gemini_15_Pro,
390
- ];
391
-
392
- export const GoogleImageModels = [
393
- Models.google.Gemini_31_Flash_Image_Preview,
394
- Models.google.Gemini_3_Pro_Image_Preview,
395
- Models.google.Gemini_25_Flash_Image,
396
- Models.google.Gemini_20_Flash_Preview_Image_Generation,
397
- Models.google.Imagen_3,
398
- Models.google.Imagen_4_Fast,
399
- Models.google.Imagen_4_Ultra,
400
- ];
401
-
402
- export const OpenAiImageModels = [
403
- Models.openai.DALL_E_3,
404
- Models.openai.DALL_E_2,
405
- Models.openai.GPT_Image_15,
406
- Models.openai.GPT_Image_1_Mini,
407
- ];
408
-
409
- export const OpenAiVideoModels = [
410
- Models.openai.Sora,
411
- Models.openai.Sora_2,
412
- Models.openai.Sora_2_Pro,
413
- ];
414
-
415
- export const OpenAiTTSModels = [Models.openai.TTS_1];
416
-
417
- export const XaiImageModels = [Models.xai.GrokImagineImage];
418
- export const OpenAiTranscriptionModels = [
419
- Models.openai.Whisper_1,
420
- Models.openai.GPT_4o_Transcribe,
421
- Models.openai.GPT_4o_Mini_Transcribe,
422
- ];
423
-
424
- export const OpenAiRealtimeModels = [
425
- Models.openai.GPT_4o_Realtime,
426
- Models.openai.GPT_4o_Mini_Realtime,
427
- Models.openai.GPT_Realtime_15,
428
- Models.openai.GPT_Realtime_Mini,
429
- ];
430
- export const XaiVideoModels = [Models.xai.GrokImagineVideo];
431
-
432
- export const GoogleTTSModels = [
433
- Models.google.Gemini_25_Flash_TTS,
434
- Models.google.Gemini_25_Pro_TTS,
435
- Models.google.Gemini_20_Flash_TTS,
436
- ];
437
-
438
- export const GoogleVideoModels = [
439
- Models.google.Veo_2,
440
- Models.google.Veo_3,
441
- Models.google.Veo_3_Fast,
442
- Models.google.Veo_3_1,
443
- Models.google.Veo_3_1_Fast,
444
- ];
445
-
446
- export const GoogleEmbeddingModels = [
447
- EmbeddingModels.google.Gemini_Embedding,
448
- EmbeddingModels.google.Gemini_Embedding_001,
449
- ];