agent-orcha 0.0.7 → 0.0.8

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 (259) hide show
  1. package/README.md +86 -28
  2. package/dist/lib/agents/agent-executor.d.ts.map +1 -1
  3. package/dist/lib/agents/agent-executor.js +23 -7
  4. package/dist/lib/agents/agent-executor.js.map +1 -1
  5. package/dist/lib/agents/react-loop.d.ts.map +1 -1
  6. package/dist/lib/agents/react-loop.js +27 -0
  7. package/dist/lib/agents/react-loop.js.map +1 -1
  8. package/dist/lib/functions/simple-function-wrapper.js +3 -3
  9. package/dist/lib/functions/simple-function-wrapper.js.map +1 -1
  10. package/dist/lib/knowledge/knowledge-store.d.ts +1 -1
  11. package/dist/lib/knowledge/knowledge-store.d.ts.map +1 -1
  12. package/dist/lib/knowledge/knowledge-store.js +25 -4
  13. package/dist/lib/knowledge/knowledge-store.js.map +1 -1
  14. package/dist/lib/knowledge/loaders/file-loaders.d.ts +0 -1
  15. package/dist/lib/knowledge/loaders/file-loaders.d.ts.map +1 -1
  16. package/dist/lib/knowledge/loaders/file-loaders.js +7 -15
  17. package/dist/lib/knowledge/loaders/file-loaders.js.map +1 -1
  18. package/dist/lib/knowledge/sqlite-store.d.ts.map +1 -1
  19. package/dist/lib/knowledge/sqlite-store.js +19 -10
  20. package/dist/lib/knowledge/sqlite-store.js.map +1 -1
  21. package/dist/lib/knowledge/types.d.ts +13 -13
  22. package/dist/lib/llm/index.d.ts +1 -1
  23. package/dist/lib/llm/index.d.ts.map +1 -1
  24. package/dist/lib/llm/index.js +1 -1
  25. package/dist/lib/llm/index.js.map +1 -1
  26. package/dist/lib/llm/llm-config.d.ts +51 -8
  27. package/dist/lib/llm/llm-config.d.ts.map +1 -1
  28. package/dist/lib/llm/llm-config.js +161 -17
  29. package/dist/lib/llm/llm-config.js.map +1 -1
  30. package/dist/lib/llm/llm-factory.d.ts +1 -2
  31. package/dist/lib/llm/llm-factory.d.ts.map +1 -1
  32. package/dist/lib/llm/llm-factory.js +41 -8
  33. package/dist/lib/llm/llm-factory.js.map +1 -1
  34. package/dist/lib/llm/providers/openai-chat-model.d.ts +10 -0
  35. package/dist/lib/llm/providers/openai-chat-model.d.ts.map +1 -1
  36. package/dist/lib/llm/providers/openai-chat-model.js +37 -5
  37. package/dist/lib/llm/providers/openai-chat-model.js.map +1 -1
  38. package/dist/lib/llm/providers/openai-embeddings.d.ts.map +1 -1
  39. package/dist/lib/llm/providers/openai-embeddings.js +41 -10
  40. package/dist/lib/llm/providers/openai-embeddings.js.map +1 -1
  41. package/dist/lib/local-llm/binary-manager.d.ts +66 -0
  42. package/dist/lib/local-llm/binary-manager.d.ts.map +1 -0
  43. package/dist/lib/local-llm/binary-manager.js +441 -0
  44. package/dist/lib/local-llm/binary-manager.js.map +1 -0
  45. package/dist/lib/local-llm/engine-interface.d.ts +47 -0
  46. package/dist/lib/local-llm/engine-interface.d.ts.map +1 -0
  47. package/dist/lib/local-llm/engine-interface.js +2 -0
  48. package/dist/lib/local-llm/engine-interface.js.map +1 -0
  49. package/dist/lib/local-llm/engine-registry.d.ts +20 -0
  50. package/dist/lib/local-llm/engine-registry.d.ts.map +1 -0
  51. package/dist/lib/local-llm/engine-registry.js +56 -0
  52. package/dist/lib/local-llm/engine-registry.js.map +1 -0
  53. package/dist/lib/local-llm/engines/llama-cpp-engine.d.ts +31 -0
  54. package/dist/lib/local-llm/engines/llama-cpp-engine.d.ts.map +1 -0
  55. package/dist/lib/local-llm/engines/llama-cpp-engine.js +164 -0
  56. package/dist/lib/local-llm/engines/llama-cpp-engine.js.map +1 -0
  57. package/dist/lib/local-llm/engines/mlx-serve-engine.d.ts +31 -0
  58. package/dist/lib/local-llm/engines/mlx-serve-engine.d.ts.map +1 -0
  59. package/dist/lib/local-llm/engines/mlx-serve-engine.js +161 -0
  60. package/dist/lib/local-llm/engines/mlx-serve-engine.js.map +1 -0
  61. package/dist/lib/local-llm/gguf-reader.d.ts +20 -0
  62. package/dist/lib/local-llm/gguf-reader.d.ts.map +1 -0
  63. package/dist/lib/local-llm/gguf-reader.js +190 -0
  64. package/dist/lib/local-llm/gguf-reader.js.map +1 -0
  65. package/dist/lib/local-llm/index.d.ts +9 -0
  66. package/dist/lib/local-llm/index.d.ts.map +1 -0
  67. package/dist/lib/local-llm/index.js +6 -0
  68. package/dist/lib/local-llm/index.js.map +1 -0
  69. package/dist/lib/local-llm/llama-server-process.d.ts +42 -0
  70. package/dist/lib/local-llm/llama-server-process.d.ts.map +1 -0
  71. package/dist/lib/local-llm/llama-server-process.js +237 -0
  72. package/dist/lib/local-llm/llama-server-process.js.map +1 -0
  73. package/dist/lib/local-llm/mlx-binary-manager.d.ts +33 -0
  74. package/dist/lib/local-llm/mlx-binary-manager.d.ts.map +1 -0
  75. package/dist/lib/local-llm/mlx-binary-manager.js +211 -0
  76. package/dist/lib/local-llm/mlx-binary-manager.js.map +1 -0
  77. package/dist/lib/local-llm/mlx-server-process.d.ts +26 -0
  78. package/dist/lib/local-llm/mlx-server-process.d.ts.map +1 -0
  79. package/dist/lib/local-llm/mlx-server-process.js +210 -0
  80. package/dist/lib/local-llm/mlx-server-process.js.map +1 -0
  81. package/dist/lib/local-llm/model-manager.d.ts +33 -0
  82. package/dist/lib/local-llm/model-manager.d.ts.map +1 -0
  83. package/dist/lib/local-llm/model-manager.js +591 -0
  84. package/dist/lib/local-llm/model-manager.js.map +1 -0
  85. package/dist/lib/local-llm/types.d.ts +51 -0
  86. package/dist/lib/local-llm/types.d.ts.map +1 -0
  87. package/dist/lib/local-llm/types.js +2 -0
  88. package/dist/lib/local-llm/types.js.map +1 -0
  89. package/dist/lib/logger.d.ts +2 -0
  90. package/dist/lib/logger.d.ts.map +1 -1
  91. package/dist/lib/logger.js +68 -5
  92. package/dist/lib/logger.js.map +1 -1
  93. package/dist/lib/orchestrator.d.ts +9 -0
  94. package/dist/lib/orchestrator.d.ts.map +1 -1
  95. package/dist/lib/orchestrator.js +151 -3
  96. package/dist/lib/orchestrator.js.map +1 -1
  97. package/dist/lib/sandbox/cdp-client.d.ts +2 -1
  98. package/dist/lib/sandbox/cdp-client.d.ts.map +1 -1
  99. package/dist/lib/sandbox/cdp-client.js +33 -7
  100. package/dist/lib/sandbox/cdp-client.js.map +1 -1
  101. package/dist/lib/sandbox/index.d.ts +1 -0
  102. package/dist/lib/sandbox/index.d.ts.map +1 -1
  103. package/dist/lib/sandbox/index.js +1 -0
  104. package/dist/lib/sandbox/index.js.map +1 -1
  105. package/dist/lib/sandbox/page-readiness.d.ts.map +1 -1
  106. package/dist/lib/sandbox/page-readiness.js +33 -0
  107. package/dist/lib/sandbox/page-readiness.js.map +1 -1
  108. package/dist/lib/sandbox/sandbox-browser.d.ts.map +1 -1
  109. package/dist/lib/sandbox/sandbox-browser.js +14 -1
  110. package/dist/lib/sandbox/sandbox-browser.js.map +1 -1
  111. package/dist/lib/sandbox/sandbox-container.d.ts +39 -0
  112. package/dist/lib/sandbox/sandbox-container.d.ts.map +1 -0
  113. package/dist/lib/sandbox/sandbox-container.js +176 -0
  114. package/dist/lib/sandbox/sandbox-container.js.map +1 -0
  115. package/dist/lib/sandbox/sandbox-file.d.ts.map +1 -1
  116. package/dist/lib/sandbox/sandbox-file.js +5 -4
  117. package/dist/lib/sandbox/sandbox-file.js.map +1 -1
  118. package/dist/lib/sandbox/sandbox-shell.d.ts +2 -1
  119. package/dist/lib/sandbox/sandbox-shell.d.ts.map +1 -1
  120. package/dist/lib/sandbox/sandbox-shell.js +42 -24
  121. package/dist/lib/sandbox/sandbox-shell.js.map +1 -1
  122. package/dist/lib/sandbox/sandbox-web.d.ts.map +1 -1
  123. package/dist/lib/sandbox/sandbox-web.js +27 -2
  124. package/dist/lib/sandbox/sandbox-web.js.map +1 -1
  125. package/dist/lib/sandbox/vision-browser.d.ts.map +1 -1
  126. package/dist/lib/sandbox/vision-browser.js +9 -0
  127. package/dist/lib/sandbox/vision-browser.js.map +1 -1
  128. package/dist/lib/sea/app-window.d.ts +7 -0
  129. package/dist/lib/sea/app-window.d.ts.map +1 -0
  130. package/dist/lib/sea/app-window.js +95 -0
  131. package/dist/lib/sea/app-window.js.map +1 -0
  132. package/dist/lib/sea/bootstrap.d.ts +18 -0
  133. package/dist/lib/sea/bootstrap.d.ts.map +1 -0
  134. package/dist/lib/sea/bootstrap.js +103 -0
  135. package/dist/lib/sea/bootstrap.js.map +1 -0
  136. package/dist/lib/sea/sqlite-vec-shim.d.ts +3 -0
  137. package/dist/lib/sea/sqlite-vec-shim.d.ts.map +1 -0
  138. package/dist/lib/sea/sqlite-vec-shim.js +10 -0
  139. package/dist/lib/sea/sqlite-vec-shim.js.map +1 -0
  140. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts +1 -2
  141. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts.map +1 -1
  142. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js +7 -13
  143. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js.map +1 -1
  144. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.d.ts.map +1 -1
  145. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js +2 -4
  146. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js.map +1 -1
  147. package/dist/lib/tools/built-in/knowledge-search.tool.js +4 -4
  148. package/dist/lib/tools/built-in/knowledge-search.tool.js.map +1 -1
  149. package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts.map +1 -1
  150. package/dist/lib/tools/built-in/knowledge-sql.tool.js +70 -37
  151. package/dist/lib/tools/built-in/knowledge-sql.tool.js.map +1 -1
  152. package/dist/lib/tools/built-in/knowledge-tools-factory.js +2 -2
  153. package/dist/lib/tools/built-in/knowledge-tools-factory.js.map +1 -1
  154. package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts +1 -2
  155. package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts.map +1 -1
  156. package/dist/lib/tools/built-in/knowledge-traverse.tool.js +5 -11
  157. package/dist/lib/tools/built-in/knowledge-traverse.tool.js.map +1 -1
  158. package/dist/lib/tools/workspace/workspace-tools.d.ts.map +1 -1
  159. package/dist/lib/tools/workspace/workspace-tools.js +5 -4
  160. package/dist/lib/tools/workspace/workspace-tools.js.map +1 -1
  161. package/dist/lib/types/tool-factory.d.ts.map +1 -1
  162. package/dist/lib/types/tool-factory.js +9 -2
  163. package/dist/lib/types/tool-factory.js.map +1 -1
  164. package/dist/lib/utils/document-extract.d.ts +10 -0
  165. package/dist/lib/utils/document-extract.d.ts.map +1 -0
  166. package/dist/lib/utils/document-extract.js +149 -0
  167. package/dist/lib/utils/document-extract.js.map +1 -0
  168. package/dist/lib/workflows/react-workflow-executor.d.ts.map +1 -1
  169. package/dist/lib/workflows/react-workflow-executor.js +20 -14
  170. package/dist/lib/workflows/react-workflow-executor.js.map +1 -1
  171. package/dist/lib/workflows/types.d.ts +71 -45
  172. package/dist/lib/workflows/types.d.ts.map +1 -1
  173. package/dist/lib/workflows/types.js +10 -0
  174. package/dist/lib/workflows/types.js.map +1 -1
  175. package/dist/public/assets/logo.png +0 -0
  176. package/dist/public/chat.html +3 -78
  177. package/dist/public/index.html +3 -330
  178. package/dist/public/src/components/AgentComposer.js +132 -132
  179. package/dist/public/src/components/AgentsView.js +1231 -350
  180. package/dist/public/src/components/AppRoot.js +101 -39
  181. package/dist/public/src/components/GraphView.js +11 -13
  182. package/dist/public/src/components/IdeView.js +133 -98
  183. package/dist/public/src/components/KnowledgeView.js +94 -130
  184. package/dist/public/src/components/LlmView.js +15 -19
  185. package/dist/public/src/components/LocalLlmView.js +2440 -0
  186. package/dist/public/src/components/LogViewer.js +155 -0
  187. package/dist/public/src/components/McpView.js +41 -49
  188. package/dist/public/src/components/MonitorView.js +79 -126
  189. package/dist/public/src/components/NavBar.js +16 -26
  190. package/dist/public/src/components/StandaloneChat.js +136 -150
  191. package/dist/public/src/services/ApiService.js +196 -2
  192. package/dist/public/src/services/SessionStore.js +6 -3
  193. package/dist/public/src/services/StreamManager.js +183 -0
  194. package/dist/public/src/store.js +1 -1
  195. package/dist/public/src/utils/card.js +21 -0
  196. package/dist/public/src/utils/markdown.js +1 -7
  197. package/dist/public/styles.css +2777 -0
  198. package/dist/src/cli/commands/init.d.ts.map +1 -1
  199. package/dist/src/cli/commands/init.js +7 -1
  200. package/dist/src/cli/commands/init.js.map +1 -1
  201. package/dist/src/cli/commands/start.d.ts.map +1 -1
  202. package/dist/src/cli/commands/start.js +28 -5
  203. package/dist/src/cli/commands/start.js.map +1 -1
  204. package/dist/src/cli/index.js +13 -2
  205. package/dist/src/cli/index.js.map +1 -1
  206. package/dist/src/index.js +7 -1
  207. package/dist/src/index.js.map +1 -1
  208. package/dist/src/routes/agents.route.d.ts.map +1 -1
  209. package/dist/src/routes/agents.route.js +2 -0
  210. package/dist/src/routes/agents.route.js.map +1 -1
  211. package/dist/src/routes/chat.route.d.ts.map +1 -1
  212. package/dist/src/routes/chat.route.js +3 -2
  213. package/dist/src/routes/chat.route.js.map +1 -1
  214. package/dist/src/routes/llm.route.d.ts.map +1 -1
  215. package/dist/src/routes/llm.route.js +227 -7
  216. package/dist/src/routes/llm.route.js.map +1 -1
  217. package/dist/src/routes/local-llm.route.d.ts +3 -0
  218. package/dist/src/routes/local-llm.route.d.ts.map +1 -0
  219. package/dist/src/routes/local-llm.route.js +688 -0
  220. package/dist/src/routes/local-llm.route.js.map +1 -0
  221. package/dist/src/routes/logs.route.d.ts +3 -0
  222. package/dist/src/routes/logs.route.d.ts.map +1 -0
  223. package/dist/src/routes/logs.route.js +24 -0
  224. package/dist/src/routes/logs.route.js.map +1 -0
  225. package/dist/src/routes/vnc.route.d.ts +10 -1
  226. package/dist/src/routes/vnc.route.d.ts.map +1 -1
  227. package/dist/src/routes/vnc.route.js +37 -12
  228. package/dist/src/routes/vnc.route.js.map +1 -1
  229. package/dist/src/routes/workflows.route.d.ts.map +1 -1
  230. package/dist/src/routes/workflows.route.js +24 -0
  231. package/dist/src/routes/workflows.route.js.map +1 -1
  232. package/dist/src/server.d.ts.map +1 -1
  233. package/dist/src/server.js +24 -2
  234. package/dist/src/server.js.map +1 -1
  235. package/dist/templates/agents/actor.agent.yaml +34 -0
  236. package/dist/templates/agents/architect.agent.yaml +0 -1
  237. package/dist/templates/agents/chatbot.agent.yaml +0 -1
  238. package/dist/templates/agents/corporate.agent.yaml +0 -1
  239. package/dist/templates/agents/functions.agent.yaml +29 -0
  240. package/dist/templates/agents/investment-analyst.agent.yaml +0 -1
  241. package/dist/templates/agents/music-librarian.agent.yaml +3 -27
  242. package/dist/templates/agents/network-security.agent.yaml +0 -1
  243. package/dist/templates/agents/transport-security.agent.yaml +0 -1
  244. package/dist/templates/agents/web-engineer.agent.yaml +3 -4
  245. package/dist/templates/agents/web-pilot.agent.yaml +0 -1
  246. package/dist/templates/knowledge/patient-records.knowledge.yaml +20 -0
  247. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_0.pdf +0 -0
  248. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_1.pdf +0 -0
  249. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_10.pdf +0 -0
  250. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_11.pdf +0 -0
  251. package/dist/templates/knowledge/web-docs.knowledge.yaml +1 -1
  252. package/dist/templates/llm.json +73 -10
  253. package/dist/templates/skills/orcha-builder/SKILL.md +56 -3
  254. package/dist/templates/workflows/example.workflow.yaml +27 -35
  255. package/dist/templates/workflows/react-example.workflow.yaml +14 -19
  256. package/dist/templates/workflows/team-chat.workflow.yaml +47 -0
  257. package/package.json +14 -6
  258. package/dist/public/src/components/SkillsView.js +0 -137
  259. package/dist/public/src/components/WorkflowsView.js +0 -568
@@ -0,0 +1,591 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { createWriteStream } from 'fs';
4
+ import { pipeline } from 'stream/promises';
5
+ import { logger } from "../logger.js";
6
+ const STATE_FILE = 'state.json';
7
+ export class ModelManager {
8
+ modelsDir;
9
+ _activeDownloads = new Map();
10
+ constructor(workspaceRoot) {
11
+ this.modelsDir = path.join(workspaceRoot, '.models');
12
+ }
13
+ getActiveDownloads() {
14
+ return [...this._activeDownloads.values()];
15
+ }
16
+ /** Find .downloading partial files that aren't currently being downloaded (interrupted by restart etc.) */
17
+ async getInterruptedDownloads() {
18
+ await this.ensureDir();
19
+ const entries = await fs.readdir(this.modelsDir);
20
+ const results = [];
21
+ for (const entry of entries) {
22
+ // GGUF partial downloads
23
+ if (entry.endsWith('.gguf.downloading')) {
24
+ const fileName = entry.replace(/\.downloading$/, '');
25
+ const isActive = [...this._activeDownloads.values()].some(d => d.fileName === fileName);
26
+ if (isActive)
27
+ continue;
28
+ const filePath = path.join(this.modelsDir, entry);
29
+ const stat = await fs.stat(filePath);
30
+ const meta = await this.readMeta(fileName);
31
+ results.push({
32
+ fileName,
33
+ repo: meta?.repo,
34
+ downloadedBytes: stat.size,
35
+ });
36
+ continue;
37
+ }
38
+ // MLX partial downloads (directories with .downloading marker)
39
+ const markerPath = path.join(this.modelsDir, entry, '.downloading');
40
+ try {
41
+ await fs.stat(markerPath);
42
+ }
43
+ catch {
44
+ continue;
45
+ }
46
+ const isActive = [...this._activeDownloads.values()].some(d => d.fileName === entry);
47
+ if (isActive)
48
+ continue;
49
+ const dirSize = await this.dirSize(path.join(this.modelsDir, entry));
50
+ const meta = await this.readMlxMeta(entry);
51
+ results.push({
52
+ fileName: entry,
53
+ repo: meta?.repo,
54
+ downloadedBytes: dirSize,
55
+ });
56
+ }
57
+ return results;
58
+ }
59
+ async deleteInterruptedDownload(fileName) {
60
+ // Check if it's an MLX directory with .downloading marker
61
+ const dirPath = path.join(this.modelsDir, fileName);
62
+ try {
63
+ const stat = await fs.stat(dirPath);
64
+ if (stat.isDirectory()) {
65
+ await fs.rm(dirPath, { recursive: true });
66
+ return;
67
+ }
68
+ }
69
+ catch { /* not a directory */ }
70
+ // GGUF partial download
71
+ const tempPath = path.join(this.modelsDir, `${fileName}.downloading`);
72
+ await fs.unlink(tempPath).catch(() => { });
73
+ await fs.unlink(this.metaPath(fileName)).catch(() => { });
74
+ }
75
+ async ensureDir() {
76
+ await fs.mkdir(this.modelsDir, { recursive: true });
77
+ }
78
+ async listModels() {
79
+ await this.ensureDir();
80
+ const entries = await fs.readdir(this.modelsDir);
81
+ const models = [];
82
+ for (const entry of entries) {
83
+ const entryPath = path.join(this.modelsDir, entry);
84
+ const stat = await fs.stat(entryPath);
85
+ // GGUF files
86
+ if (entry.endsWith('.gguf') && stat.isFile()) {
87
+ if (entry.toLowerCase().includes('mmproj'))
88
+ continue;
89
+ const meta = await this.readMeta(entry);
90
+ models.push({
91
+ id: this.fileNameToId(entry),
92
+ fileName: entry,
93
+ filePath: entryPath,
94
+ sizeBytes: stat.size,
95
+ repo: meta?.repo,
96
+ downloadedAt: meta?.downloadedAt ?? stat.birthtime.toISOString(),
97
+ type: 'gguf',
98
+ });
99
+ continue;
100
+ }
101
+ // MLX model directories (contain config.json)
102
+ if (stat.isDirectory()) {
103
+ const configPath = path.join(entryPath, 'config.json');
104
+ try {
105
+ await fs.stat(configPath);
106
+ }
107
+ catch {
108
+ continue;
109
+ }
110
+ // Skip directories with .downloading marker (incomplete)
111
+ try {
112
+ await fs.stat(path.join(entryPath, '.downloading'));
113
+ continue;
114
+ }
115
+ catch { /* no marker = complete */ }
116
+ const meta = await this.readMlxMeta(entry);
117
+ const sizeBytes = await this.dirSize(entryPath);
118
+ models.push({
119
+ id: entry,
120
+ fileName: entry,
121
+ filePath: entryPath,
122
+ sizeBytes,
123
+ repo: meta?.repo,
124
+ downloadedAt: meta?.downloadedAt ?? stat.birthtime.toISOString(),
125
+ type: 'mlx',
126
+ });
127
+ }
128
+ }
129
+ return models;
130
+ }
131
+ async getModel(id) {
132
+ const models = await this.listModels();
133
+ return models.find((m) => m.id === id) ?? null;
134
+ }
135
+ /** Auto-download an mmproj file from the same repo if needed for vision support. */
136
+ async autoDownloadMmproj(repo, onProgress) {
137
+ await this.ensureDir();
138
+ // Already have an mmproj from this repo?
139
+ const entries = await fs.readdir(this.modelsDir);
140
+ for (const entry of entries) {
141
+ if (!entry.toLowerCase().includes('mmproj') || !entry.endsWith('.gguf'))
142
+ continue;
143
+ const meta = await this.readMeta(entry);
144
+ if (meta?.repo === repo)
145
+ return null;
146
+ }
147
+ // Fetch repo file list from HuggingFace
148
+ try {
149
+ const res = await fetch(`https://huggingface.co/api/models/${repo}?blobs=true`);
150
+ if (!res.ok)
151
+ return null;
152
+ const detail = await res.json();
153
+ const mmprojFiles = (detail.siblings ?? [])
154
+ .filter((s) => s.rfilename?.endsWith('.gguf') && s.rfilename.toLowerCase().includes('mmproj'))
155
+ .map((s) => ({ fileName: s.rfilename, sizeBytes: (s.size ?? 0) }));
156
+ if (mmprojFiles.length === 0)
157
+ return null;
158
+ // Prefer F16/BF16 (smaller, good quality) over F32
159
+ const preferred = mmprojFiles.find((f) => /f16|bf16/i.test(f.fileName) && !/f32/i.test(f.fileName)) ?? mmprojFiles[0];
160
+ logger.info(`[ModelManager] Auto-downloading mmproj: ${preferred.fileName} from ${repo}`);
161
+ return this.downloadModel(repo, preferred.fileName, onProgress);
162
+ }
163
+ catch (err) {
164
+ logger.warn(`[ModelManager] Failed to auto-download mmproj: ${err}`);
165
+ return null;
166
+ }
167
+ }
168
+ async findModelFile(modelName) {
169
+ const models = await this.listModels();
170
+ const match = models.find((m) => m.id === modelName || m.fileName === modelName);
171
+ return match ? { filePath: match.filePath, type: match.type } : null;
172
+ }
173
+ /** Find a multimodal projector (mmproj) file from the same repo as the given model. */
174
+ async findMmprojForModel(modelFileName) {
175
+ const modelMeta = await this.readMeta(modelFileName);
176
+ if (!modelMeta?.repo)
177
+ return null;
178
+ await this.ensureDir();
179
+ const entries = await fs.readdir(this.modelsDir);
180
+ for (const entry of entries) {
181
+ if (!entry.toLowerCase().includes('mmproj') || !entry.endsWith('.gguf'))
182
+ continue;
183
+ const meta = await this.readMeta(entry);
184
+ if (meta?.repo === modelMeta.repo)
185
+ return path.join(this.modelsDir, entry);
186
+ }
187
+ return null;
188
+ }
189
+ async downloadModel(repo, fileName, onProgress) {
190
+ const downloadKey = `${repo}/${fileName}`;
191
+ // If already downloading, don't start again
192
+ if (this._activeDownloads.has(downloadKey)) {
193
+ throw new Error(`Already downloading ${downloadKey}`);
194
+ }
195
+ await this.ensureDir();
196
+ const url = `https://huggingface.co/${repo}/resolve/main/${fileName}`;
197
+ const tempPath = path.join(this.modelsDir, `${fileName}.downloading`);
198
+ const finalPath = path.join(this.modelsDir, fileName);
199
+ // Check for a partial download to resume
200
+ let existingBytes = 0;
201
+ try {
202
+ const stat = await fs.stat(tempPath);
203
+ existingBytes = stat.size;
204
+ }
205
+ catch { /* no partial file */ }
206
+ const resuming = existingBytes > 0;
207
+ if (resuming) {
208
+ logger.info(`[ModelManager] Resuming download of ${fileName} from ${existingBytes} bytes`);
209
+ }
210
+ else {
211
+ logger.info(`[ModelManager] Downloading ${url}`);
212
+ }
213
+ // Write meta early so interrupted downloads know which repo they belong to
214
+ await fs.writeFile(this.metaPath(fileName), JSON.stringify({ repo }, null, 2));
215
+ const initialProgress = { fileName, downloadedBytes: existingBytes, totalBytes: 0, percent: 0 };
216
+ this._activeDownloads.set(downloadKey, { repo, fileName, progress: initialProgress });
217
+ try {
218
+ const headers = {};
219
+ if (resuming) {
220
+ headers['Range'] = `bytes=${existingBytes}-`;
221
+ }
222
+ const response = await fetch(url, { redirect: 'follow', headers });
223
+ // 416 = Range Not Satisfiable — file is already complete
224
+ if (response.status === 416) {
225
+ await fs.rename(tempPath, finalPath);
226
+ const meta = { repo, downloadedAt: new Date().toISOString() };
227
+ await fs.writeFile(this.metaPath(fileName), JSON.stringify(meta, null, 2));
228
+ const stat = await fs.stat(finalPath);
229
+ return {
230
+ id: this.fileNameToId(fileName),
231
+ fileName,
232
+ filePath: finalPath,
233
+ sizeBytes: stat.size,
234
+ repo,
235
+ downloadedAt: meta.downloadedAt,
236
+ type: 'gguf',
237
+ };
238
+ }
239
+ if (!response.ok && response.status !== 206) {
240
+ throw new Error(`Download failed: ${response.status} ${response.statusText}`);
241
+ }
242
+ // 206 = Partial Content (resume), 200 = full file (server doesn't support range or fresh start)
243
+ const isPartial = response.status === 206;
244
+ const contentLength = Number(response.headers.get('content-length') ?? 0);
245
+ const totalBytes = isPartial ? existingBytes + contentLength : contentLength;
246
+ let downloadedBytes = isPartial ? existingBytes : 0;
247
+ // If server returned 200 instead of 206, start from scratch
248
+ if (!isPartial && resuming) {
249
+ existingBytes = 0;
250
+ downloadedBytes = 0;
251
+ }
252
+ const body = response.body;
253
+ if (!body)
254
+ throw new Error('No response body');
255
+ const fileStream = createWriteStream(tempPath, {
256
+ flags: isPartial ? 'a' : 'w',
257
+ });
258
+ const activeDownloads = this._activeDownloads;
259
+ const progressStream = new TransformStream({
260
+ transform(chunk, controller) {
261
+ downloadedBytes += chunk.byteLength;
262
+ const progress = {
263
+ fileName,
264
+ downloadedBytes,
265
+ totalBytes,
266
+ percent: totalBytes > 0 ? Math.round((downloadedBytes / totalBytes) * 100) : 0,
267
+ };
268
+ const entry = activeDownloads.get(downloadKey);
269
+ if (entry)
270
+ entry.progress = progress;
271
+ onProgress?.(progress);
272
+ controller.enqueue(chunk);
273
+ },
274
+ });
275
+ const readable = body.pipeThrough(progressStream);
276
+ const nodeReadable = await import('stream');
277
+ const nodeStream = nodeReadable.Readable.fromWeb(readable);
278
+ await pipeline(nodeStream, fileStream);
279
+ await fs.rename(tempPath, finalPath);
280
+ const meta = { repo, downloadedAt: new Date().toISOString() };
281
+ await fs.writeFile(this.metaPath(fileName), JSON.stringify(meta, null, 2));
282
+ const stat = await fs.stat(finalPath);
283
+ return {
284
+ id: this.fileNameToId(fileName),
285
+ fileName,
286
+ filePath: finalPath,
287
+ sizeBytes: stat.size,
288
+ repo,
289
+ downloadedAt: meta.downloadedAt,
290
+ type: 'gguf',
291
+ };
292
+ }
293
+ finally {
294
+ this._activeDownloads.delete(downloadKey);
295
+ }
296
+ }
297
+ async deleteModel(id) {
298
+ const model = await this.getModel(id);
299
+ if (!model)
300
+ throw new Error(`Model "${id}" not found`);
301
+ if (model.type === 'mlx') {
302
+ // MLX: remove the entire directory
303
+ await fs.rm(model.filePath, { recursive: true });
304
+ logger.info(`[ModelManager] Deleted MLX model directory: ${model.fileName}`);
305
+ return;
306
+ }
307
+ // GGUF: Find and delete associated mmproj files from the same repo
308
+ if (model.repo) {
309
+ const entries = await fs.readdir(this.modelsDir);
310
+ for (const entry of entries) {
311
+ if (!entry.toLowerCase().includes('mmproj') || !entry.endsWith('.gguf'))
312
+ continue;
313
+ const meta = await this.readMeta(entry);
314
+ if (meta?.repo === model.repo) {
315
+ await fs.unlink(path.join(this.modelsDir, entry)).catch(() => { });
316
+ await fs.unlink(this.metaPath(entry)).catch(() => { });
317
+ logger.info(`[ModelManager] Deleted associated mmproj: ${entry}`);
318
+ }
319
+ }
320
+ }
321
+ await fs.unlink(model.filePath);
322
+ try {
323
+ await fs.unlink(this.metaPath(model.fileName));
324
+ }
325
+ catch {
326
+ // meta file may not exist
327
+ }
328
+ }
329
+ async downloadMlxModel(repo, onProgress) {
330
+ const downloadKey = `mlx:${repo}`;
331
+ if (this._activeDownloads.has(downloadKey)) {
332
+ throw new Error(`Already downloading ${repo}`);
333
+ }
334
+ await this.ensureDir();
335
+ // Derive directory name from repo (e.g., "mlx-community/Qwen3.5-9B-4bit" → "Qwen3.5-9B-4bit")
336
+ const dirName = repo.split('/').pop();
337
+ const modelDir = path.join(this.modelsDir, dirName);
338
+ await fs.mkdir(modelDir, { recursive: true });
339
+ // Write .downloading marker
340
+ const markerPath = path.join(modelDir, '.downloading');
341
+ await fs.writeFile(markerPath, '');
342
+ // Write meta early
343
+ const metaPath = path.join(modelDir, '.meta.json');
344
+ await fs.writeFile(metaPath, JSON.stringify({ repo }, null, 2));
345
+ const initialProgress = { fileName: dirName, downloadedBytes: 0, totalBytes: 0, percent: 0 };
346
+ this._activeDownloads.set(downloadKey, { repo, fileName: dirName, progress: initialProgress });
347
+ try {
348
+ // Fetch file list from HuggingFace API
349
+ const apiRes = await fetch(`https://huggingface.co/api/models/${repo}?blobs=true`);
350
+ if (!apiRes.ok)
351
+ throw new Error(`HuggingFace API error: ${apiRes.status}`);
352
+ const detail = await apiRes.json();
353
+ const siblings = (detail.siblings ?? []);
354
+ const totalBytes = siblings.reduce((sum, s) => sum + (s.size ?? 0), 0);
355
+ let downloadedBytes = 0;
356
+ // Download each file
357
+ for (const sibling of siblings) {
358
+ const fileName = sibling.rfilename;
359
+ const filePath = path.join(modelDir, fileName);
360
+ // Create subdirectories if needed
361
+ const fileDir = path.dirname(filePath);
362
+ if (fileDir !== modelDir) {
363
+ await fs.mkdir(fileDir, { recursive: true });
364
+ }
365
+ // Skip if already downloaded (resume)
366
+ try {
367
+ const existing = await fs.stat(filePath);
368
+ if (existing.size === (sibling.size ?? 0)) {
369
+ downloadedBytes += existing.size;
370
+ const progress = {
371
+ fileName: dirName,
372
+ downloadedBytes,
373
+ totalBytes,
374
+ percent: totalBytes > 0 ? Math.round((downloadedBytes / totalBytes) * 100) : 0,
375
+ };
376
+ const entry = this._activeDownloads.get(downloadKey);
377
+ if (entry)
378
+ entry.progress = progress;
379
+ onProgress?.(progress);
380
+ continue;
381
+ }
382
+ }
383
+ catch { /* file doesn't exist */ }
384
+ const url = `https://huggingface.co/${repo}/resolve/main/${fileName}`;
385
+ const response = await fetch(url, { redirect: 'follow' });
386
+ if (!response.ok)
387
+ throw new Error(`Download failed: ${response.status} ${response.statusText} for ${fileName}`);
388
+ const body = response.body;
389
+ if (!body)
390
+ throw new Error(`No response body for ${fileName}`);
391
+ const fileStream = createWriteStream(filePath);
392
+ const activeDownloads = this._activeDownloads;
393
+ const progressStream = new TransformStream({
394
+ transform(chunk, controller) {
395
+ downloadedBytes += chunk.byteLength;
396
+ const progress = {
397
+ fileName: dirName,
398
+ downloadedBytes,
399
+ totalBytes,
400
+ percent: totalBytes > 0 ? Math.round((downloadedBytes / totalBytes) * 100) : 0,
401
+ };
402
+ const entry = activeDownloads.get(downloadKey);
403
+ if (entry)
404
+ entry.progress = progress;
405
+ onProgress?.(progress);
406
+ controller.enqueue(chunk);
407
+ },
408
+ });
409
+ const readable = body.pipeThrough(progressStream);
410
+ const nodeReadable = await import('stream');
411
+ const nodeStream = nodeReadable.Readable.fromWeb(readable);
412
+ await pipeline(nodeStream, fileStream);
413
+ }
414
+ // Remove .downloading marker
415
+ await fs.unlink(markerPath).catch(() => { });
416
+ // Update meta
417
+ const meta = { repo, downloadedAt: new Date().toISOString() };
418
+ await fs.writeFile(metaPath, JSON.stringify(meta, null, 2));
419
+ const sizeBytes = await this.dirSize(modelDir);
420
+ return {
421
+ id: dirName,
422
+ fileName: dirName,
423
+ filePath: modelDir,
424
+ sizeBytes,
425
+ repo,
426
+ downloadedAt: meta.downloadedAt,
427
+ type: 'mlx',
428
+ };
429
+ }
430
+ finally {
431
+ this._activeDownloads.delete(downloadKey);
432
+ }
433
+ }
434
+ async browseHuggingFace(query, limit = 10, format = 'gguf') {
435
+ // Strip HuggingFace URL prefixes so users can paste links directly
436
+ let cleaned = query.replace(/^https?:\/\/huggingface\.co\//, '').replace(/\/$/, '');
437
+ const searches = [];
438
+ if (format === 'mlx') {
439
+ // For MLX: search mlx-community first, then general
440
+ if (!cleaned.includes('/')) {
441
+ searches.push(`mlx-community/${cleaned}`);
442
+ }
443
+ searches.push(cleaned);
444
+ }
445
+ else {
446
+ // GGUF: existing behavior
447
+ searches.push(cleaned);
448
+ if (/^[^/]+\/[^/]+$/.test(cleaned) && !cleaned.toLowerCase().includes('gguf')) {
449
+ searches.push(cleaned.split('/')[1]);
450
+ }
451
+ }
452
+ const seen = new Set();
453
+ let models = [];
454
+ for (const q of searches) {
455
+ const filter = format === 'gguf' ? '&filter=gguf' : '&filter=mlx';
456
+ const url = `https://huggingface.co/api/models?search=${encodeURIComponent(q)}${filter}&sort=downloads&direction=-1&limit=${limit}`;
457
+ const response = await fetch(url);
458
+ if (!response.ok) {
459
+ throw new Error(`HuggingFace API error: ${response.status}`);
460
+ }
461
+ const batch = await response.json();
462
+ for (const m of batch) {
463
+ const id = m.modelId ?? m.id;
464
+ if (!seen.has(id)) {
465
+ seen.add(id);
466
+ models.push(m);
467
+ }
468
+ }
469
+ }
470
+ // Re-sort merged results: MLX prioritizes mlx-community repos, then by downloads
471
+ if (format === 'mlx') {
472
+ models.sort((a, b) => {
473
+ const aIsMlx = (a.modelId ?? a.id ?? '').startsWith('mlx-community/') ? 1 : 0;
474
+ const bIsMlx = (b.modelId ?? b.id ?? '').startsWith('mlx-community/') ? 1 : 0;
475
+ if (aIsMlx !== bIsMlx)
476
+ return bIsMlx - aIsMlx;
477
+ return (b.downloads ?? 0) - (a.downloads ?? 0);
478
+ });
479
+ }
480
+ else {
481
+ models.sort((a, b) => (b.downloads ?? 0) - (a.downloads ?? 0));
482
+ }
483
+ models = models.slice(0, limit);
484
+ const results = [];
485
+ for (const model of models) {
486
+ // Fetch detailed info (file list + pipeline_tag) for each model
487
+ let ggufFiles = [];
488
+ let pipelineTag = model.pipeline_tag ?? '';
489
+ let detailTags = [];
490
+ try {
491
+ const detailUrl = `https://huggingface.co/api/models/${model.modelId}?blobs=true`;
492
+ const detailRes = await fetch(detailUrl);
493
+ if (detailRes.ok) {
494
+ const detail = await detailRes.json();
495
+ pipelineTag = detail.pipeline_tag ?? pipelineTag;
496
+ detailTags = Array.isArray(detail.tags) ? detail.tags : [];
497
+ const siblings = detail.siblings ?? [];
498
+ if (format === 'mlx') {
499
+ // For MLX: check for safetensors files, report total repo size as single entry
500
+ const hasSafetensors = siblings.some((s) => s.rfilename?.endsWith('.safetensors'));
501
+ if (hasSafetensors) {
502
+ const totalSize = siblings.reduce((sum, s) => sum + (s.size ?? 0), 0);
503
+ ggufFiles = [{ fileName: '__mlx_repo__', sizeBytes: totalSize }];
504
+ }
505
+ }
506
+ else {
507
+ ggufFiles = siblings
508
+ .filter((s) => s.rfilename?.endsWith('.gguf'))
509
+ .map((s) => ({
510
+ fileName: s.rfilename,
511
+ sizeBytes: s.size ?? 0,
512
+ }));
513
+ }
514
+ }
515
+ }
516
+ catch {
517
+ // Skip on error
518
+ }
519
+ // Merge tags from list and detail responses
520
+ const listTags = Array.isArray(model.tags) ? model.tags : [];
521
+ const allTags = [...new Set([...listTags, ...detailTags])];
522
+ // For MLX format, skip repos without safetensors (no ggufFiles means no MLX content)
523
+ if (format === 'mlx' && ggufFiles.length === 0)
524
+ continue;
525
+ results.push({
526
+ repoId: model.modelId ?? model.id,
527
+ author: model.author ?? model.modelId?.split('/')[0] ?? '',
528
+ modelName: model.modelId?.split('/')[1] ?? model.modelId,
529
+ likes: model.likes ?? 0,
530
+ downloads: model.downloads ?? 0,
531
+ tags: allTags,
532
+ pipelineTag,
533
+ ggufFiles,
534
+ });
535
+ }
536
+ return results;
537
+ }
538
+ async getState() {
539
+ try {
540
+ const content = await fs.readFile(path.join(this.modelsDir, STATE_FILE), 'utf-8');
541
+ return JSON.parse(content);
542
+ }
543
+ catch {
544
+ return { lastActiveModel: null };
545
+ }
546
+ }
547
+ async saveState(state) {
548
+ await this.ensureDir();
549
+ await fs.writeFile(path.join(this.modelsDir, STATE_FILE), JSON.stringify(state, null, 2));
550
+ }
551
+ fileNameToId(fileName) {
552
+ return fileName.replace(/\.gguf$/, '');
553
+ }
554
+ metaPath(fileName) {
555
+ return path.join(this.modelsDir, `${fileName}.meta.json`);
556
+ }
557
+ async readMeta(fileName) {
558
+ try {
559
+ const content = await fs.readFile(this.metaPath(fileName), 'utf-8');
560
+ return JSON.parse(content);
561
+ }
562
+ catch {
563
+ return null;
564
+ }
565
+ }
566
+ async readMlxMeta(dirName) {
567
+ try {
568
+ const content = await fs.readFile(path.join(this.modelsDir, dirName, '.meta.json'), 'utf-8');
569
+ return JSON.parse(content);
570
+ }
571
+ catch {
572
+ return null;
573
+ }
574
+ }
575
+ async dirSize(dirPath) {
576
+ let total = 0;
577
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
578
+ for (const entry of entries) {
579
+ const entryPath = path.join(dirPath, entry.name);
580
+ if (entry.isDirectory()) {
581
+ total += await this.dirSize(entryPath);
582
+ }
583
+ else {
584
+ const stat = await fs.stat(entryPath);
585
+ total += stat.size;
586
+ }
587
+ }
588
+ return total;
589
+ }
590
+ }
591
+ //# sourceMappingURL=model-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-manager.js","sourceRoot":"","sources":["../../../lib/local-llm/model-manager.ts"],"names":[],"mappings":"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"}