hoomanjs 1.41.0 → 1.42.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 (83) hide show
  1. package/README.md +26 -701
  2. package/dist/acp/acp-agent.js +48 -29
  3. package/dist/acp/acp-agent.js.map +1 -1
  4. package/dist/chat/app.js +29 -27
  5. package/dist/chat/app.js.map +1 -1
  6. package/dist/chat/components/BottomChrome.d.ts +4 -1
  7. package/dist/chat/components/BottomChrome.js +3 -2
  8. package/dist/chat/components/BottomChrome.js.map +1 -1
  9. package/dist/chat/components/DownloadPanel.d.ts +9 -0
  10. package/dist/chat/components/DownloadPanel.js +16 -0
  11. package/dist/chat/components/DownloadPanel.js.map +1 -0
  12. package/dist/chat/components/StatusBar.js +5 -5
  13. package/dist/chat/components/StatusBar.js.map +1 -1
  14. package/dist/cli.js +23 -23
  15. package/dist/cli.js.map +1 -1
  16. package/dist/configure/app.js +30 -2
  17. package/dist/configure/app.js.map +1 -1
  18. package/dist/core/agent/index.js +0 -6
  19. package/dist/core/agent/index.js.map +1 -1
  20. package/dist/core/agent/prompt-cache-plugin.d.ts +1 -1
  21. package/dist/core/agent/prompt-cache-plugin.js +1 -1
  22. package/dist/core/config.d.ts +60 -0
  23. package/dist/core/config.js +25 -5
  24. package/dist/core/config.js.map +1 -1
  25. package/dist/core/mcp/index.d.ts +3 -3
  26. package/dist/core/mcp/index.js +2 -2
  27. package/dist/core/mcp/index.js.map +1 -1
  28. package/dist/core/mcp/manager.d.ts +28 -0
  29. package/dist/core/mcp/manager.js +171 -2
  30. package/dist/core/mcp/manager.js.map +1 -1
  31. package/dist/core/models/anthropic.d.ts +4 -3
  32. package/dist/core/models/anthropic.js.map +1 -1
  33. package/dist/core/models/download-progress.d.ts +65 -0
  34. package/dist/core/models/download-progress.js +154 -0
  35. package/dist/core/models/download-progress.js.map +1 -0
  36. package/dist/core/models/index.js +1 -0
  37. package/dist/core/models/index.js.map +1 -1
  38. package/dist/core/models/llama-cpp/gbnf-schema.d.ts +32 -0
  39. package/dist/core/models/llama-cpp/gbnf-schema.js +272 -0
  40. package/dist/core/models/llama-cpp/gbnf-schema.js.map +1 -0
  41. package/dist/core/models/llama-cpp/index.d.ts +8 -0
  42. package/dist/core/models/llama-cpp/index.js +37 -0
  43. package/dist/core/models/llama-cpp/index.js.map +1 -0
  44. package/dist/core/models/llama-cpp/resolve-model.d.ts +28 -0
  45. package/dist/core/models/llama-cpp/resolve-model.js +307 -0
  46. package/dist/core/models/llama-cpp/resolve-model.js.map +1 -0
  47. package/dist/core/models/llama-cpp/strands-llama-cpp.d.ts +40 -0
  48. package/dist/core/models/llama-cpp/strands-llama-cpp.js +422 -0
  49. package/dist/core/models/llama-cpp/strands-llama-cpp.js.map +1 -0
  50. package/dist/core/models/minimax.d.ts +2 -1
  51. package/dist/core/models/minimax.js +49 -7
  52. package/dist/core/models/minimax.js.map +1 -1
  53. package/dist/core/models/types.d.ts +125 -7
  54. package/dist/core/models/types.js +22 -2
  55. package/dist/core/models/types.js.map +1 -1
  56. package/dist/core/prompts/environment.d.ts +10 -1
  57. package/dist/core/prompts/environment.js +15 -1
  58. package/dist/core/prompts/environment.js.map +1 -1
  59. package/dist/core/prompts/static/environment.md +2 -1
  60. package/dist/core/prompts/static/web-search.md +1 -1
  61. package/dist/core/prompts/system.d.ts +6 -0
  62. package/dist/core/prompts/system.js +7 -1
  63. package/dist/core/prompts/system.js.map +1 -1
  64. package/dist/core/skills/built-in/hooman-config/SKILL.md +21 -5
  65. package/dist/core/skills/built-in/hooman-config/providers.md +2 -0
  66. package/dist/core/skills/built-in/hooman-mcp/SKILL.md +20 -0
  67. package/dist/core/tools/ask-user.d.ts +8 -0
  68. package/dist/core/tools/ask-user.js +8 -4
  69. package/dist/core/tools/ask-user.js.map +1 -1
  70. package/dist/core/tools/time.js +1 -1
  71. package/dist/core/tools/time.js.map +1 -1
  72. package/dist/core/utils/logging.d.ts +29 -0
  73. package/dist/core/utils/logging.js +64 -0
  74. package/dist/core/utils/logging.js.map +1 -0
  75. package/dist/daemon/index.js +5 -0
  76. package/dist/daemon/index.js.map +1 -1
  77. package/dist/daemon/questions.d.ts +18 -0
  78. package/dist/daemon/questions.js +44 -0
  79. package/dist/daemon/questions.js.map +1 -0
  80. package/dist/index.d.ts +4 -2
  81. package/dist/index.js +2 -1
  82. package/dist/index.js.map +1 -1
  83. package/package.json +5 -1
@@ -0,0 +1,307 @@
1
+ import { existsSync } from "fs";
2
+ import { homedir } from "os";
3
+ import { basename, isAbsolute, join, sep } from "path";
4
+ import { downloadFileToCacheDir, listFiles } from "@huggingface/hub";
5
+ import { cachePath } from "../../utils/paths.js";
6
+ import { emitModelDownloadProgress } from "../download-progress.js";
7
+ /** GGUF files are cached under `~/.hooman/cache/huggingface` (HF cache layout). */
8
+ export const llamaCppCacheDir = () => join(cachePath(), "huggingface");
9
+ const SHARD_SUFFIX = /-(\d{5})-of-(\d{5})\.gguf$/i;
10
+ function expandHome(p) {
11
+ if (p === "~" || p.startsWith(`~${sep}`) || p.startsWith("~/")) {
12
+ return join(homedir(), p.slice(1));
13
+ }
14
+ return p;
15
+ }
16
+ /**
17
+ * Parse an LLM `model` value into either a local GGUF path or a Hugging Face
18
+ * repo designation. Accepted shapes (an optional `hf:` prefix is stripped):
19
+ * - `/abs/path/model.gguf`, `./rel/model.gguf`, `~/models/model.gguf`
20
+ * - `owner/repo` (the repo's GGUF file is auto-detected)
21
+ * - `owner/repo:Q8_0` (pick the variant matching a quant tag, llama.cpp style)
22
+ * - `owner/repo/path/to/file.gguf` (pin an exact file, e.g. a quant variant)
23
+ */
24
+ export function parseModelSpec(model) {
25
+ let spec = (model.startsWith("hf:") ? model.slice(3) : model).trim();
26
+ if (spec.length === 0) {
27
+ throw new Error("llama.cpp model is not configured");
28
+ }
29
+ let quant;
30
+ const quantMatch = spec.match(/^([^:]+\/[^:]+):([\w.-]+)$/);
31
+ if (quantMatch) {
32
+ spec = quantMatch[1];
33
+ quant = quantMatch[2];
34
+ }
35
+ if (spec.toLowerCase().endsWith(".gguf")) {
36
+ const expanded = expandHome(spec);
37
+ if (isAbsolute(expanded) ||
38
+ spec.startsWith("./") ||
39
+ spec.startsWith("../") ||
40
+ existsSync(expanded)) {
41
+ return { kind: "local", path: expanded };
42
+ }
43
+ }
44
+ const segments = spec.split("/").filter((s) => s.length > 0);
45
+ if (segments.length >= 3 && spec.toLowerCase().endsWith(".gguf")) {
46
+ return {
47
+ kind: "hub",
48
+ repo: segments.slice(0, 2).join("/"),
49
+ filePath: segments.slice(2).join("/"),
50
+ };
51
+ }
52
+ if (segments.length === 2) {
53
+ return { kind: "hub", repo: spec, ...(quant ? { quant } : {}) };
54
+ }
55
+ throw new Error(`Invalid llama.cpp model "${model}". Use a local .gguf path, ` +
56
+ `"owner/repo", "owner/repo:QUANT", or "owner/repo/path/to/file.gguf".`);
57
+ }
58
+ /**
59
+ * Preferred quantizations when a repo ships several GGUF variants, best
60
+ * quality/size trade-off first. Files matching none rank after all matches.
61
+ */
62
+ const QUANT_PREFERENCE = [
63
+ "q4_k_m",
64
+ "q4_k_s",
65
+ "q4_0",
66
+ "q5_k_m",
67
+ "q5_0",
68
+ "q6_k",
69
+ "q8_0",
70
+ "f16",
71
+ "bf16",
72
+ ];
73
+ function quantRank(filePath) {
74
+ const lower = filePath.toLowerCase();
75
+ const index = QUANT_PREFERENCE.findIndex((quant) => lower.includes(quant));
76
+ return index === -1 ? QUANT_PREFERENCE.length : index;
77
+ }
78
+ /**
79
+ * Auto-detect the GGUF file to use in a Hugging Face repo. Ignores `mmproj`
80
+ * projector and `mtp` (multi-token-prediction) companion files; for sharded
81
+ * models returns the first shard (its siblings are downloaded alongside it).
82
+ * With a `quant` tag (e.g. `Q8_0` from `owner/repo:Q8_0`) only files whose
83
+ * name contains that tag are considered. Otherwise, when several distinct
84
+ * GGUF variants exist, common quantizations are preferred (Q4_K_M first) and
85
+ * ties break alphabetically — pin `owner/repo/file.gguf` to override.
86
+ */
87
+ async function pickGgufFile(repo, accessToken, quant) {
88
+ let ggufFiles = [];
89
+ for await (const entry of listFiles({
90
+ repo,
91
+ recursive: true,
92
+ ...(accessToken ? { accessToken } : {}),
93
+ })) {
94
+ const lower = entry.path.toLowerCase();
95
+ if (entry.type === "file" &&
96
+ lower.endsWith(".gguf") &&
97
+ !lower.includes("mmproj") &&
98
+ !/(^|[/-])mtp([.-]|$)/.test(lower)) {
99
+ ggufFiles.push(entry.path);
100
+ }
101
+ }
102
+ if (ggufFiles.length === 0) {
103
+ throw new Error(`No .gguf file found in Hugging Face repo "${repo}".`);
104
+ }
105
+ if (quant) {
106
+ const tag = quant.toLowerCase();
107
+ const matches = ggufFiles.filter((f) => {
108
+ const name = f.toLowerCase();
109
+ // Match the tag on a word boundary (e.g. `Q8_0` should not match
110
+ // `UD-Q8_K_XL`, and `Q4_K_M` should not match `Q4_K_M-MTP`).
111
+ return new RegExp(`(^|[^a-z0-9])${tag.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}($|[^a-z0-9_])`).test(name);
112
+ });
113
+ if (matches.length === 0) {
114
+ throw new Error(`No .gguf file matching quant "${quant}" found in Hugging Face repo "${repo}".`);
115
+ }
116
+ ggufFiles = matches;
117
+ }
118
+ ggufFiles.sort((a, b) => quantRank(a) - quantRank(b) || a.localeCompare(b));
119
+ const nonShards = ggufFiles.filter((f) => !SHARD_SUFFIX.test(f));
120
+ if (nonShards.length > 0) {
121
+ return nonShards[0];
122
+ }
123
+ const firstShards = ggufFiles.filter((f) => {
124
+ const m = f.match(SHARD_SUFFIX);
125
+ return m !== null && Number(m[1]) === 1;
126
+ });
127
+ return firstShards[0] ?? ggufFiles[0];
128
+ }
129
+ /** Minimum time between "downloading" progress emissions. */
130
+ const PROGRESS_EMIT_INTERVAL_MS = 250;
131
+ /** Window over which the transfer rate (and thus the ETA) is smoothed. */
132
+ const SPEED_WINDOW_MS = 5_000;
133
+ /** Responses smaller than this are treated as API chatter, not the file. */
134
+ const MIN_DOWNLOAD_BODY_BYTES = 1024 * 1024;
135
+ /**
136
+ * Byte-counting `fetch` for {@link downloadFileToCacheDir} that reports
137
+ * download progress (percent, bytes, speed, ETA) for the file's blob GET.
138
+ * API calls made through the same fetch (`pathsInfo`, the `Range: bytes=0-0`
139
+ * download-info probe) are passed through untouched; cache hits never fetch
140
+ * the blob at all, so no events fire for already-downloaded models.
141
+ */
142
+ function createProgressReporter(base) {
143
+ let started = false;
144
+ let received = 0;
145
+ let total;
146
+ let lastEmitAt = 0;
147
+ let samples = [];
148
+ const snapshot = (status) => {
149
+ const now = Date.now();
150
+ samples.push({ at: now, received });
151
+ samples = samples.filter((s) => now - s.at <= SPEED_WINDOW_MS);
152
+ const first = samples[0];
153
+ const elapsedMs = now - first.at;
154
+ const bytesPerSecond = elapsedMs > 0
155
+ ? ((received - first.received) / elapsedMs) * 1000
156
+ : undefined;
157
+ const etaSeconds = status === "downloading" &&
158
+ total !== undefined &&
159
+ bytesPerSecond !== undefined &&
160
+ bytesPerSecond > 0
161
+ ? (total - received) / bytesPerSecond
162
+ : undefined;
163
+ return {
164
+ ...base,
165
+ status,
166
+ receivedBytes: received,
167
+ ...(total !== undefined ? { totalBytes: total } : {}),
168
+ ...(bytesPerSecond !== undefined && bytesPerSecond >= 0
169
+ ? { bytesPerSecond }
170
+ : {}),
171
+ ...(etaSeconds !== undefined ? { etaSeconds } : {}),
172
+ };
173
+ };
174
+ const countingFetch = async (input, init) => {
175
+ const response = await fetch(input, init);
176
+ const method = (init?.method ?? (input instanceof Request ? input.method : "GET")).toUpperCase();
177
+ const requestHeaders = new Headers(init?.headers ?? (input instanceof Request ? input.headers : undefined));
178
+ const contentLength = Number(response.headers.get("content-length"));
179
+ const isBlobDownload = method === "GET" &&
180
+ !requestHeaders.has("Range") &&
181
+ response.status === 200 &&
182
+ response.body !== null &&
183
+ (!Number.isFinite(contentLength) ||
184
+ contentLength >= MIN_DOWNLOAD_BODY_BYTES);
185
+ if (!isBlobDownload) {
186
+ return response;
187
+ }
188
+ started = true;
189
+ received = 0;
190
+ samples = [];
191
+ total =
192
+ Number.isFinite(contentLength) && contentLength > 0
193
+ ? contentLength
194
+ : undefined;
195
+ emitModelDownloadProgress(snapshot("downloading"));
196
+ lastEmitAt = Date.now();
197
+ const counted = response.body.pipeThrough(new TransformStream({
198
+ transform: (chunk, controller) => {
199
+ received += chunk.byteLength;
200
+ const now = Date.now();
201
+ if (now - lastEmitAt >= PROGRESS_EMIT_INTERVAL_MS) {
202
+ lastEmitAt = now;
203
+ emitModelDownloadProgress(snapshot("downloading"));
204
+ }
205
+ controller.enqueue(chunk);
206
+ },
207
+ }));
208
+ return new Response(counted, {
209
+ status: response.status,
210
+ statusText: response.statusText,
211
+ headers: response.headers,
212
+ });
213
+ };
214
+ return {
215
+ fetch: countingFetch,
216
+ done: () => {
217
+ if (started) {
218
+ emitModelDownloadProgress(snapshot("done"));
219
+ }
220
+ },
221
+ error: (message) => {
222
+ if (started) {
223
+ emitModelDownloadProgress({ ...snapshot("error"), error: message });
224
+ }
225
+ },
226
+ };
227
+ }
228
+ /** Download one file with progress reporting (cache hits stay silent). */
229
+ async function downloadFileWithProgress(options) {
230
+ const reporter = createProgressReporter({
231
+ model: options.model,
232
+ file: basename(options.filePath),
233
+ ...(options.shard ? { shard: options.shard } : {}),
234
+ });
235
+ try {
236
+ // `xet: false` forces the plain-HTTP single-stream download path instead
237
+ // of xet chunk reconstruction, so the counting fetch sees one measurable
238
+ // response. `downloadFileToCacheDir` forwards extra params to
239
+ // `downloadFile`, which honors it; the option just isn't in its public
240
+ // type, hence the cast.
241
+ const params = {
242
+ repo: options.repo,
243
+ path: options.filePath,
244
+ cacheDir: options.cacheDir,
245
+ fetch: reporter.fetch,
246
+ ...options.credentials,
247
+ xet: false,
248
+ };
249
+ const local = await downloadFileToCacheDir(params);
250
+ reporter.done();
251
+ return local;
252
+ }
253
+ catch (e) {
254
+ reporter.error(e instanceof Error ? e.message : String(e));
255
+ throw e;
256
+ }
257
+ }
258
+ /**
259
+ * Resolve a model spec to a local GGUF file path, downloading it from the
260
+ * Hugging Face Hub into the Hooman cache when needed. For sharded GGUFs all
261
+ * shards are fetched and the first shard's path is returned (llama.cpp finds
262
+ * the siblings next to it). Download progress is reported process-wide via
263
+ * `subscribeModelDownloadProgress` (see `../download-progress.ts`).
264
+ */
265
+ export async function resolveModelFile(model, hfToken) {
266
+ const parsed = parseModelSpec(model);
267
+ if (parsed.kind === "local") {
268
+ if (!existsSync(parsed.path)) {
269
+ throw new Error(`llama.cpp model file not found: ${parsed.path}`);
270
+ }
271
+ return parsed.path;
272
+ }
273
+ const accessToken = hfToken?.trim() || process.env.HF_TOKEN?.trim();
274
+ const filePath = parsed.filePath ??
275
+ (await pickGgufFile(parsed.repo, accessToken, parsed.quant));
276
+ const credentials = accessToken ? { accessToken } : {};
277
+ const cacheDir = llamaCppCacheDir();
278
+ const shardMatch = filePath.match(SHARD_SUFFIX);
279
+ if (shardMatch) {
280
+ const total = Number(shardMatch[2]);
281
+ const prefix = filePath.slice(0, -shardMatch[0].length);
282
+ let firstShardPath;
283
+ for (let i = 1; i <= total; i++) {
284
+ const shard = `${prefix}-${String(i).padStart(5, "0")}-of-${shardMatch[2]}.gguf`;
285
+ const local = await downloadFileWithProgress({
286
+ repo: parsed.repo,
287
+ filePath: shard,
288
+ cacheDir,
289
+ credentials,
290
+ model,
291
+ shard: { index: i, total },
292
+ });
293
+ if (i === 1) {
294
+ firstShardPath = local;
295
+ }
296
+ }
297
+ return firstShardPath;
298
+ }
299
+ return downloadFileWithProgress({
300
+ repo: parsed.repo,
301
+ filePath,
302
+ cacheDir,
303
+ credentials,
304
+ model,
305
+ });
306
+ }
307
+ //# sourceMappingURL=resolve-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-model.js","sourceRoot":"","sources":["../../../../src/core/models/llama-cpp/resolve-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { Model } from "@strands-agents/sdk";
2
+ import type { BaseModelConfig, Message, StreamOptions } from "@strands-agents/sdk";
3
+ import type { ModelStreamEvent } from "@strands-agents/sdk";
4
+ export interface LlamaCppModelConfig extends BaseModelConfig {
5
+ /**
6
+ * Model spec: local `.gguf` path, `owner/repo` Hugging Face repo (GGUF file
7
+ * auto-detected), or `owner/repo/path/to/file.gguf`.
8
+ */
9
+ modelId?: string;
10
+ /** Hugging Face access token for gated/private repos (falls back to `HF_TOKEN`). */
11
+ hfToken?: string;
12
+ /** GPU backend forwarded to `getLlama` (default `"auto"`). `false` = CPU only. */
13
+ gpu?: "auto" | "metal" | "cuda" | "vulkan" | false;
14
+ /** Context size in tokens (default: adapted to the model and free VRAM/RAM). */
15
+ contextSize?: number;
16
+ /**
17
+ * Thinking controls. Presence enables reasoning: the resolved chat wrapper is
18
+ * configured to allow thought segments (Qwen `thoughts: "auto"`, Gemma 4
19
+ * `reasoning: true`, Harmony `reasoningEffort` mapped from `effort`). Absence
20
+ * disables it: wrappers are told to discourage thoughts and the thought-token
21
+ * budget is forced to `0` so stray thought segments are closed immediately.
22
+ */
23
+ reasoning?: {
24
+ effort?: "minimal" | "low" | "medium" | "high";
25
+ };
26
+ /** Cap on thought-segment tokens while reasoning is enabled. */
27
+ thoughtBudgetTokens?: number;
28
+ }
29
+ /** Strands {@link Model} backed by in-process llama.cpp via `node-llama-cpp`. */
30
+ export declare class StrandsLlamaCppModel extends Model<LlamaCppModelConfig> {
31
+ private config;
32
+ private chatPromise;
33
+ private context;
34
+ constructor(config: LlamaCppModelConfig);
35
+ updateConfig(modelConfig: LlamaCppModelConfig): void;
36
+ getConfig(): LlamaCppModelConfig;
37
+ private getChat;
38
+ private initChat;
39
+ stream(messages: Message[], options?: StreamOptions): AsyncIterable<ModelStreamEvent>;
40
+ }