@workglow/cactus 0.3.4 → 0.3.5
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.
- package/dist/ai/common/Cactus_ModelInfo.browser.d.ts.map +1 -1
- package/dist/ai/common/Cactus_ModelInfo.d.ts.map +1 -1
- package/dist/ai/common/Cactus_Runtime.browser.d.ts +6 -0
- package/dist/ai/common/Cactus_Runtime.browser.d.ts.map +1 -1
- package/dist/ai/common/Cactus_Runtime.d.ts +6 -0
- package/dist/ai/common/Cactus_Runtime.d.ts.map +1 -1
- package/dist/ai-runtime.browser.js +67 -7
- package/dist/ai-runtime.browser.js.map +5 -5
- package/dist/ai-runtime.js +112 -9
- package/dist/ai-runtime.js.map +5 -5
- package/dist/ai.browser.js +66 -7
- package/dist/ai.browser.js.map +5 -5
- package/dist/ai.js +111 -9
- package/dist/ai.js.map +5 -5
- package/package.json +11 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cactus_ModelInfo.browser.d.ts","sourceRoot":"","sources":["../../../src/ai/common/Cactus_ModelInfo.browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAE7F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAC5C,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"Cactus_ModelInfo.browser.d.ts","sourceRoot":"","sources":["../../../src/ai/common/Cactus_ModelInfo.browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAE7F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAC5C,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,CAwBlB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cactus_ModelInfo.d.ts","sourceRoot":"","sources":["../../../src/ai/common/Cactus_ModelInfo.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAE7F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAC5C,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"Cactus_ModelInfo.d.ts","sourceRoot":"","sources":["../../../src/ai/common/Cactus_ModelInfo.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAE7F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAC5C,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,CAwBlB,CAAC"}
|
|
@@ -3,9 +3,14 @@
|
|
|
3
3
|
* Copyright 2026 Steven Roussey <sroussey@gmail.com>
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
+
import { type CactusCatalogEntry } from "./Cactus_ModelCatalog";
|
|
6
7
|
import type { CactusModelConfig } from "./Cactus_ModelSchema";
|
|
7
8
|
type NeedleSdkModule = typeof import("needle-rs");
|
|
8
9
|
type NeedleEngine = NonNullable<ReturnType<NeedleSdkModule["NeedleWasm"]["load"]>>;
|
|
10
|
+
export interface CactusModelCacheInfo {
|
|
11
|
+
readonly allCached: boolean;
|
|
12
|
+
readonly file_sizes: Record<string, number> | null;
|
|
13
|
+
}
|
|
9
14
|
/** Lazily load needle-rs and run its WASM `init()` exactly once. */
|
|
10
15
|
export declare function loadSdk(): Promise<NeedleSdkModule>;
|
|
11
16
|
export declare function getCactusSdk(): NeedleSdkModule;
|
|
@@ -20,6 +25,7 @@ export declare function isModelLoaded(model_id: string): boolean;
|
|
|
20
25
|
export declare function markModelCached(model_id: string): void;
|
|
21
26
|
/** Returns true if the model's assets have been downloaded or the engine is currently loaded. */
|
|
22
27
|
export declare function isModelCached(model_id: string): boolean;
|
|
28
|
+
export declare function getCactusModelCacheInfo(_model: CactusModelConfig, entry: CactusCatalogEntry, detail: string | undefined, signal: AbortSignal | undefined): Promise<CactusModelCacheInfo>;
|
|
23
29
|
/** @internal Exported for tests. */
|
|
24
30
|
export declare const cactusSessions: Map<string, Record<string, never>>;
|
|
25
31
|
export declare function deleteCactusSession(id: string): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cactus_Runtime.browser.d.ts","sourceRoot":"","sources":["../../../src/ai/common/Cactus_Runtime.browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"Cactus_Runtime.browser.d.ts","sourceRoot":"","sources":["../../../src/ai/common/Cactus_Runtime.browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,KAAK,eAAe,GAAG,cAAc,WAAW,CAAC,CAAC;AAGlD,KAAK,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAEnF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CACpD;AAKD,oEAAoE;AACpE,wBAAsB,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC,CAkBxD;AAED,wBAAgB,YAAY,IAAI,eAAe,CAG9C;AAwCD,wBAAsB,eAAe,CACnC,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CAMrB;AAMD,oCAAoC;AACpC,eAAO,MAAM,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAa,CAAC;AAClE,oCAAoC;AACpC,eAAO,MAAM,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAa,CAAC;AAMhE,wBAAsB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAwCrF;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEtD;AAED,iGAAiG;AACjG,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,WAAW,GAAG,SAAS,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CAgD/B;AAMD,oCAAoC;AACpC,eAAO,MAAM,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAa,CAAC;AAE5E,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEtE;AAiCD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhF;AAED,uCAAuC;AACvC,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ5D"}
|
|
@@ -3,9 +3,14 @@
|
|
|
3
3
|
* Copyright 2026 Steven Roussey <sroussey@gmail.com>
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
+
import { type CactusCatalogEntry } from "./Cactus_ModelCatalog";
|
|
6
7
|
import type { CactusModelConfig } from "./Cactus_ModelSchema";
|
|
7
8
|
type NeedleSdkModule = typeof import("needle-rs");
|
|
8
9
|
type NeedleEngine = NonNullable<ReturnType<NeedleSdkModule["NeedleWasm"]["load"]>>;
|
|
10
|
+
export interface CactusModelCacheInfo {
|
|
11
|
+
readonly allCached: boolean;
|
|
12
|
+
readonly file_sizes: Record<string, number> | null;
|
|
13
|
+
}
|
|
9
14
|
/** Lazily load needle-rs and run its WASM `init()` exactly once. */
|
|
10
15
|
export declare function loadSdk(): Promise<NeedleSdkModule>;
|
|
11
16
|
export declare function getCactusSdk(): NeedleSdkModule;
|
|
@@ -20,6 +25,7 @@ export declare function isModelLoaded(model_id: string): boolean;
|
|
|
20
25
|
export declare function markModelCached(model_id: string): void;
|
|
21
26
|
/** Returns true if the model's assets have been downloaded or the engine is currently loaded. */
|
|
22
27
|
export declare function isModelCached(model_id: string): boolean;
|
|
28
|
+
export declare function getCactusModelCacheInfo(model: CactusModelConfig, entry: CactusCatalogEntry, detail: string | undefined, signal: AbortSignal | undefined): Promise<CactusModelCacheInfo>;
|
|
23
29
|
/** @internal Exported for tests. */
|
|
24
30
|
export declare const cactusSessions: Map<string, Record<string, never>>;
|
|
25
31
|
export declare function deleteCactusSession(id: string): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cactus_Runtime.d.ts","sourceRoot":"","sources":["../../../src/ai/common/Cactus_Runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"Cactus_Runtime.d.ts","sourceRoot":"","sources":["../../../src/ai/common/Cactus_Runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,KAAK,eAAe,GAAG,cAAc,WAAW,CAAC,CAAC;AAGlD,KAAK,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAEnF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CACpD;AAKD,oEAAoE;AACpE,wBAAsB,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC,CAkBxD;AAED,wBAAgB,YAAY,IAAI,eAAe,CAG9C;AAqID,wBAAsB,eAAe,CACnC,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CASrB;AAMD,oCAAoC;AACpC,eAAO,MAAM,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAa,CAAC;AAClE,oCAAoC;AACpC,eAAO,MAAM,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAa,CAAC;AAMhE,wBAAsB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAwCrF;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEtD;AAED,iGAAiG;AACjG,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,WAAW,GAAG,SAAS,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CAoD/B;AAMD,oCAAoC;AACpC,eAAO,MAAM,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAa,CAAC;AAE5E,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEtE;AAyCD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhF;AAED,uCAAuC;AACvC,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ5D"}
|
|
@@ -60,6 +60,23 @@ function getCactusSdk() {
|
|
|
60
60
|
throw new Error("Cactus SDK not loaded; call loadSdk() first");
|
|
61
61
|
return _sdk;
|
|
62
62
|
}
|
|
63
|
+
function assetFilenames(entry) {
|
|
64
|
+
return [entry.assets.weights, entry.assets.vocab, entry.assets.config];
|
|
65
|
+
}
|
|
66
|
+
async function getRemoteAssetSize(url, signal) {
|
|
67
|
+
try {
|
|
68
|
+
const response = await fetch(url, { method: "HEAD", signal });
|
|
69
|
+
if (!response.ok)
|
|
70
|
+
return;
|
|
71
|
+
const contentLength = response.headers.get("content-length");
|
|
72
|
+
if (!contentLength)
|
|
73
|
+
return;
|
|
74
|
+
const size = Number(contentLength);
|
|
75
|
+
return Number.isFinite(size) ? size : undefined;
|
|
76
|
+
} catch {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
63
80
|
async function fetchAssetBytesBrowser(url) {
|
|
64
81
|
const cachesApi = globalThis.caches;
|
|
65
82
|
const cache = await cachesApi.open(CACTUS_CACHE_NAME);
|
|
@@ -131,6 +148,47 @@ function markModelCached(model_id) {
|
|
|
131
148
|
function isModelCached(model_id) {
|
|
132
149
|
return cactusEngines.has(model_id) || cactusCachedModelIds.has(model_id);
|
|
133
150
|
}
|
|
151
|
+
async function getCactusModelCacheInfo(_model, entry, detail, signal) {
|
|
152
|
+
const cachesApi = globalThis.caches;
|
|
153
|
+
const cache = await cachesApi.open(CACTUS_CACHE_NAME);
|
|
154
|
+
const filenames = assetFilenames(entry);
|
|
155
|
+
const cacheHits = await Promise.all(filenames.map(async (filename) => {
|
|
156
|
+
const url = cactusAssetUrl(entry, filename);
|
|
157
|
+
const hit = await cache.match(url);
|
|
158
|
+
return { filename, url, hit };
|
|
159
|
+
}));
|
|
160
|
+
const allCached = cacheHits.every(({ hit }) => Boolean(hit));
|
|
161
|
+
if (detail === "files") {
|
|
162
|
+
return {
|
|
163
|
+
allCached,
|
|
164
|
+
file_sizes: Object.fromEntries(filenames.map((filename) => [filename, 0]))
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
if (detail !== "files_with_metadata") {
|
|
168
|
+
return { allCached, file_sizes: null };
|
|
169
|
+
}
|
|
170
|
+
const file_sizes = {};
|
|
171
|
+
await Promise.all(cacheHits.map(async ({ filename, url, hit }) => {
|
|
172
|
+
if (hit) {
|
|
173
|
+
const contentLength = hit.headers.get("content-length");
|
|
174
|
+
const contentLengthSize = contentLength ? Number(contentLength) : undefined;
|
|
175
|
+
if (contentLengthSize !== undefined && Number.isFinite(contentLengthSize)) {
|
|
176
|
+
file_sizes[filename] = contentLengthSize;
|
|
177
|
+
} else {
|
|
178
|
+
file_sizes[filename] = (await hit.clone().arrayBuffer()).byteLength;
|
|
179
|
+
}
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const remoteSize = await getRemoteAssetSize(url, signal);
|
|
183
|
+
if (remoteSize !== undefined) {
|
|
184
|
+
file_sizes[filename] = remoteSize;
|
|
185
|
+
}
|
|
186
|
+
}));
|
|
187
|
+
return {
|
|
188
|
+
allCached,
|
|
189
|
+
file_sizes: Object.keys(file_sizes).length > 0 ? file_sizes : null
|
|
190
|
+
};
|
|
191
|
+
}
|
|
134
192
|
var cactusSessions = new Map;
|
|
135
193
|
async function deleteCactusSession(id) {
|
|
136
194
|
return cactusSessions.delete(id);
|
|
@@ -257,7 +315,7 @@ var Cactus_DownloadRemove = async (input, model, _signal, emit) => {
|
|
|
257
315
|
};
|
|
258
316
|
|
|
259
317
|
// src/ai/common/Cactus_ModelInfo.browser.ts
|
|
260
|
-
var Cactus_ModelInfo = async (input, model,
|
|
318
|
+
var Cactus_ModelInfo = async (input, model, signal, emit) => {
|
|
261
319
|
if (!model)
|
|
262
320
|
throw new Error("Model config is required for ModelInfoTask.");
|
|
263
321
|
const model_id = model.provider_config.model_id;
|
|
@@ -265,7 +323,8 @@ var Cactus_ModelInfo = async (input, model, _signal, emit) => {
|
|
|
265
323
|
if (!entry)
|
|
266
324
|
throw new Error(`Unknown Cactus model_id: ${model_id}`);
|
|
267
325
|
const is_loaded = isModelLoaded(model_id);
|
|
268
|
-
const
|
|
326
|
+
const cacheInfo = await getCactusModelCacheInfo(model, entry, input.detail, signal);
|
|
327
|
+
const is_cached = is_loaded || isModelCached(model_id) || cacheInfo.allCached;
|
|
269
328
|
emit({
|
|
270
329
|
type: "finish",
|
|
271
330
|
data: {
|
|
@@ -276,7 +335,7 @@ var Cactus_ModelInfo = async (input, model, _signal, emit) => {
|
|
|
276
335
|
supports_node: true,
|
|
277
336
|
is_cached,
|
|
278
337
|
is_loaded,
|
|
279
|
-
file_sizes:
|
|
338
|
+
file_sizes: cacheInfo.file_sizes
|
|
280
339
|
}
|
|
281
340
|
});
|
|
282
341
|
};
|
|
@@ -304,7 +363,7 @@ var Cactus_ModelSearch = async (input, _model, _signal, emit) => {
|
|
|
304
363
|
|
|
305
364
|
// src/ai/common/Cactus_ToolCalling.browser.ts
|
|
306
365
|
import { extractMessageText } from "@workglow/ai/provider-utils";
|
|
307
|
-
import { filterValidToolCalls } from "@workglow/ai/worker";
|
|
366
|
+
import { filterValidToolCalls, sanitizeToolArgs } from "@workglow/ai/worker";
|
|
308
367
|
function buildToolsJson(tools) {
|
|
309
368
|
return JSON.stringify(tools.map((t) => ({
|
|
310
369
|
name: t.name,
|
|
@@ -332,7 +391,7 @@ function parseToolCalls(raw) {
|
|
|
332
391
|
return obj.map((o, i) => ({
|
|
333
392
|
id: `call_${i}`,
|
|
334
393
|
name: String(o.name ?? ""),
|
|
335
|
-
input: o.arguments ?? o.params ?? {}
|
|
394
|
+
input: sanitizeToolArgs(o.arguments ?? o.params ?? {})
|
|
336
395
|
}));
|
|
337
396
|
}
|
|
338
397
|
if (obj && typeof obj === "object" && typeof obj.name === "string") {
|
|
@@ -340,7 +399,7 @@ function parseToolCalls(raw) {
|
|
|
340
399
|
{
|
|
341
400
|
id: "call_0",
|
|
342
401
|
name: obj.name,
|
|
343
|
-
input: obj.arguments ?? obj.params ?? {}
|
|
402
|
+
input: sanitizeToolArgs(obj.arguments ?? obj.params ?? {})
|
|
344
403
|
}
|
|
345
404
|
];
|
|
346
405
|
}
|
|
@@ -428,6 +487,7 @@ export {
|
|
|
428
487
|
isModelCached,
|
|
429
488
|
getOrLoadEngine,
|
|
430
489
|
getCactusSdk,
|
|
490
|
+
getCactusModelCacheInfo,
|
|
431
491
|
fetchAssetBytes,
|
|
432
492
|
disposeCactusResources,
|
|
433
493
|
deleteCactusSession,
|
|
@@ -436,4 +496,4 @@ export {
|
|
|
436
496
|
cactusConfigJson
|
|
437
497
|
};
|
|
438
498
|
|
|
439
|
-
//# debugId=
|
|
499
|
+
//# debugId=50314F7F9017421A64756E2164756E21
|
|
@@ -4,21 +4,21 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport const LOCAL_CACTUS = \"LOCAL_CACTUS\";\nexport const CACTUS_NEEDLE_26M = \"needle-26m\";\nexport const CACTUS_DEFAULT_HF_REPO = \"Abdalrahman/needle-rs-safetensors\";\nexport const CACTUS_DEFAULT_REVISION = \"main\";\n\n/** Browser Cache Storage name used by `fetchAssetBytes` and `removeCachedAssets`. */\nexport const CACTUS_CACHE_NAME = \"cactus-models-v1\";\n\n/** Node/Bun on-disk cache root. */\nexport const CACTUS_DEFAULT_MODELS_DIR = \"~/.cache/cactus-models\";\n",
|
|
6
6
|
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { Capability } from \"@workglow/ai/worker\";\nimport {\n CACTUS_DEFAULT_HF_REPO,\n CACTUS_DEFAULT_REVISION,\n CACTUS_NEEDLE_26M,\n} from \"./Cactus_Constants\";\n\nexport interface CactusCatalogEntry {\n readonly model_id: string;\n readonly title: string;\n readonly description: string;\n readonly hf_repo: string;\n readonly revision: string;\n readonly assets: {\n readonly weights: string;\n readonly vocab: string;\n readonly config: string;\n };\n readonly capabilities: readonly Capability[];\n}\n\nexport const CACTUS_CATALOG: readonly CactusCatalogEntry[] = [\n {\n model_id: CACTUS_NEEDLE_26M,\n title: \"Needle 26M\",\n description:\n \"Specialized 26M-parameter tool-routing transformer. INT4 SafeTensors, 22 MB. Runs via WASM in browser and Node/Bun.\",\n hf_repo: CACTUS_DEFAULT_HF_REPO,\n revision: CACTUS_DEFAULT_REVISION,\n assets: {\n weights: \"needle.safetensors\",\n vocab: \"vocab.txt\",\n config: \"config.json\",\n },\n capabilities: [\"tool-use\"],\n },\n] as const;\n\nexport function getCactusCatalogEntry(model_id: string): CactusCatalogEntry | undefined {\n return CACTUS_CATALOG.find((e) => e.model_id === model_id);\n}\n\nexport function cactusAssetUrl(entry: CactusCatalogEntry, filename: string): string {\n return `https://huggingface.co/${entry.hf_repo}/resolve/${entry.revision}/${filename}`;\n}\n",
|
|
7
|
-
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Browser-safe variant of Cactus_Runtime — Node built-ins (`node:fs/promises`, `node:path`)\n * are excluded so browser bundlers do not need to resolve them.\n * Asset persistence uses the browser Cache Storage API exclusively.\n */\n\nimport { CACTUS_CACHE_NAME } from \"./Cactus_Constants\";\nimport {\n cactusAssetUrl,\n getCactusCatalogEntry,\n type CactusCatalogEntry,\n} from \"./Cactus_ModelCatalog\";\nimport type { CactusModelConfig } from \"./Cactus_ModelSchema\";\n\ntype NeedleSdkModule = typeof import(\"needle-rs\");\n// `NeedleWasm` has a private constructor so `InstanceType<...>` cannot be used.\n// Recover the instance type from the static `load` method's non-undefined return.\ntype NeedleEngine = NonNullable<ReturnType<NeedleSdkModule[\"NeedleWasm\"][\"load\"]>>;\n\nlet _sdk: NeedleSdkModule | undefined;\nlet _sdkInitPromise: Promise<NeedleSdkModule> | undefined;\n\n/** Lazily load needle-rs and run its WASM `init()` exactly once. */\nexport async function loadSdk(): Promise<NeedleSdkModule> {\n _sdkInitPromise ??= import(\"needle-rs\")\n .then(async (mod) => {\n const init = (mod as unknown as { default?: () => Promise<unknown> }).default;\n if (typeof init === \"function\") {\n await init();\n }\n _sdk = mod;\n return mod;\n })\n .catch((err: unknown) => {\n _sdkInitPromise = undefined;\n _sdk = undefined;\n throw new Error(\n `needle-rs is required for LOCAL_CACTUS tasks. Install it with: bun add needle-rs (cause: ${String(err)})`\n );\n });\n return _sdkInitPromise;\n}\n\nexport function getCactusSdk(): NeedleSdkModule {\n if (!_sdk) throw new Error(\"Cactus SDK not loaded; call loadSdk() first\");\n return _sdk;\n}\n\n// ============================================================================\n// Asset fetch + cache (browser-only: Cache Storage API)\n// ============================================================================\n\nasync function fetchAssetBytesBrowser(url: string): Promise<Uint8Array> {\n const cachesApi = (globalThis as unknown as { caches: CacheStorage }).caches;\n const cache = await cachesApi.open(CACTUS_CACHE_NAME);\n const hit = await cache.match(url);\n if (hit) {\n return new Uint8Array(await hit.arrayBuffer());\n }\n const resp = await fetch(url);\n if (!resp.ok) throw new Error(`Cactus asset fetch failed (${resp.status}) for ${url}`);\n // Clone first — Response bodies can only be consumed once.\n await cache.put(url, resp.clone());\n return new Uint8Array(await resp.arrayBuffer());\n}\n\nexport async function fetchAssetBytes(\n model: CactusModelConfig,\n filename: string\n): Promise<Uint8Array> {\n const model_id = model.provider_config.model_id;\n const entry = getCactusCatalogEntry(model_id);\n if (!entry) throw new Error(`Unknown Cactus model_id: ${model_id}`);\n const url = cactusAssetUrl(entry, filename);\n return fetchAssetBytesBrowser(url);\n}\n\n// ============================================================================\n// Engine cache (in-memory, per worker/process)\n// ============================================================================\n\n/** @internal Exported for tests. */\nexport const cactusEngines: Map<string, NeedleEngine> = new Map();\n/** @internal Exported for tests. */\nexport const cactusConfigJson: Map<string, unknown> = new Map();\n/** Tracks models whose assets have been persisted (downloaded) but not necessarily loaded. */\nconst cactusCachedModelIds: Set<string> = new Set();\n\nconst cactusEngineLoadsInFlight = new Map<string, Promise<NeedleEngine>>();\n\nexport async function getOrLoadEngine(model: CactusModelConfig): Promise<NeedleEngine> {\n const model_id = model.provider_config.model_id;\n const cached = cactusEngines.get(model_id);\n if (cached) return cached;\n\n const inFlight = cactusEngineLoadsInFlight.get(model_id);\n if (inFlight) return inFlight;\n\n const loadPromise = (async (): Promise<NeedleEngine> => {\n const sdk = await loadSdk();\n const entry = getCactusCatalogEntry(model_id);\n if (!entry) throw new Error(`Unknown Cactus model_id: ${model_id}`);\n\n const [weightsBytes, vocabBytes, configBytes] = await Promise.all([\n fetchAssetBytes(model, entry.assets.weights),\n fetchAssetBytes(model, entry.assets.vocab),\n fetchAssetBytes(model, entry.assets.config),\n ]);\n\n try {\n const text = new TextDecoder().decode(configBytes);\n cactusConfigJson.set(model_id, JSON.parse(text));\n } catch {\n cactusConfigJson.set(model_id, null);\n }\n\n // needle-rs `NeedleWasm.load(weights_bytes: Uint8Array, vocab_text: string)` — vocab is a string.\n const vocabText = new TextDecoder().decode(vocabBytes);\n const engine = sdk.NeedleWasm.load(weightsBytes, vocabText);\n if (!engine) {\n throw new Error(`needle-rs NeedleWasm.load returned undefined for model ${model_id}`);\n }\n cactusEngines.set(model_id, engine);\n return engine;\n })().finally(() => {\n cactusEngineLoadsInFlight.delete(model_id);\n });\n\n cactusEngineLoadsInFlight.set(model_id, loadPromise);\n return loadPromise;\n}\n\nexport function isModelLoaded(model_id: string): boolean {\n return cactusEngines.has(model_id);\n}\n\n/** Mark a model_id as having its assets persisted in Cache Storage. */\nexport function markModelCached(model_id: string): void {\n cactusCachedModelIds.add(model_id);\n}\n\n/** Returns true if the model's assets have been downloaded or the engine is currently loaded. */\nexport function isModelCached(model_id: string): boolean {\n return cactusEngines.has(model_id) || cactusCachedModelIds.has(model_id);\n}\n\n// ============================================================================\n// Sessions (no-op — needle-rs is stateless across calls)\n// ============================================================================\n\n/** @internal Exported for tests. */\nexport const cactusSessions: Map<string, Record<string, never>> = new Map();\n\nexport async function deleteCactusSession(id: string): Promise<boolean> {\n return cactusSessions.delete(id);\n}\n\n// ============================================================================\n// Eviction\n// ============================================================================\n\nasync function removeBrowserCacheEntries(entry: CactusCatalogEntry): Promise<void> {\n const cachesApi = (globalThis as unknown as { caches: CacheStorage }).caches;\n const cache = await cachesApi.open(CACTUS_CACHE_NAME);\n for (const filename of [entry.assets.weights, entry.assets.vocab, entry.assets.config]) {\n const url = cactusAssetUrl(entry, filename);\n try {\n await cache.delete(url);\n } catch {\n /* ignore */\n }\n }\n}\n\nfunction disposeCactusEngine(model_id: string): void {\n const engine = cactusEngines.get(model_id);\n if (engine) {\n try {\n (engine as unknown as { free?: () => void }).free?.();\n } catch {\n /* best effort */\n }\n }\n cactusEngines.delete(model_id);\n cactusConfigJson.delete(model_id);\n cactusCachedModelIds.delete(model_id);\n}\n\nexport async function removeCachedAssets(model: CactusModelConfig): Promise<void> {\n const model_id = model.provider_config.model_id;\n const entry = getCactusCatalogEntry(model_id);\n if (!entry) return;\n await removeBrowserCacheEntries(entry);\n disposeCactusEngine(model_id);\n}\n\n/** Best-effort cleanup on shutdown. */\nexport async function disposeCactusResources(): Promise<void> {\n for (const id of Array.from(cactusEngines.keys())) {\n disposeCactusEngine(id);\n }\n cactusEngines.clear();\n cactusConfigJson.clear();\n cactusCachedModelIds.clear();\n cactusSessions.clear();\n}\n",
|
|
7
|
+
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Browser-safe variant of Cactus_Runtime — Node built-ins (`node:fs/promises`, `node:path`)\n * are excluded so browser bundlers do not need to resolve them.\n * Asset persistence uses the browser Cache Storage API exclusively.\n */\n\nimport { CACTUS_CACHE_NAME } from \"./Cactus_Constants\";\nimport {\n cactusAssetUrl,\n getCactusCatalogEntry,\n type CactusCatalogEntry,\n} from \"./Cactus_ModelCatalog\";\nimport type { CactusModelConfig } from \"./Cactus_ModelSchema\";\n\ntype NeedleSdkModule = typeof import(\"needle-rs\");\n// `NeedleWasm` has a private constructor so `InstanceType<...>` cannot be used.\n// Recover the instance type from the static `load` method's non-undefined return.\ntype NeedleEngine = NonNullable<ReturnType<NeedleSdkModule[\"NeedleWasm\"][\"load\"]>>;\n\nexport interface CactusModelCacheInfo {\n readonly allCached: boolean;\n readonly file_sizes: Record<string, number> | null;\n}\n\nlet _sdk: NeedleSdkModule | undefined;\nlet _sdkInitPromise: Promise<NeedleSdkModule> | undefined;\n\n/** Lazily load needle-rs and run its WASM `init()` exactly once. */\nexport async function loadSdk(): Promise<NeedleSdkModule> {\n _sdkInitPromise ??= import(\"needle-rs\")\n .then(async (mod) => {\n const init = (mod as unknown as { default?: () => Promise<unknown> }).default;\n if (typeof init === \"function\") {\n await init();\n }\n _sdk = mod;\n return mod;\n })\n .catch((err: unknown) => {\n _sdkInitPromise = undefined;\n _sdk = undefined;\n throw new Error(\n `needle-rs is required for LOCAL_CACTUS tasks. Install it with: bun add needle-rs (cause: ${String(err)})`\n );\n });\n return _sdkInitPromise;\n}\n\nexport function getCactusSdk(): NeedleSdkModule {\n if (!_sdk) throw new Error(\"Cactus SDK not loaded; call loadSdk() first\");\n return _sdk;\n}\n\n// ============================================================================\n// Asset fetch + cache (browser-only: Cache Storage API)\n// ============================================================================\n\nfunction assetFilenames(entry: CactusCatalogEntry): string[] {\n return [entry.assets.weights, entry.assets.vocab, entry.assets.config];\n}\n\nasync function getRemoteAssetSize(\n url: string,\n signal: AbortSignal | undefined\n): Promise<number | undefined> {\n try {\n const response = await fetch(url, { method: \"HEAD\", signal });\n if (!response.ok) return undefined;\n const contentLength = response.headers.get(\"content-length\");\n if (!contentLength) return undefined;\n const size = Number(contentLength);\n return Number.isFinite(size) ? size : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function fetchAssetBytesBrowser(url: string): Promise<Uint8Array> {\n const cachesApi = (globalThis as unknown as { caches: CacheStorage }).caches;\n const cache = await cachesApi.open(CACTUS_CACHE_NAME);\n const hit = await cache.match(url);\n if (hit) {\n return new Uint8Array(await hit.arrayBuffer());\n }\n const resp = await fetch(url);\n if (!resp.ok) throw new Error(`Cactus asset fetch failed (${resp.status}) for ${url}`);\n // Clone first — Response bodies can only be consumed once.\n await cache.put(url, resp.clone());\n return new Uint8Array(await resp.arrayBuffer());\n}\n\nexport async function fetchAssetBytes(\n model: CactusModelConfig,\n filename: string\n): Promise<Uint8Array> {\n const model_id = model.provider_config.model_id;\n const entry = getCactusCatalogEntry(model_id);\n if (!entry) throw new Error(`Unknown Cactus model_id: ${model_id}`);\n const url = cactusAssetUrl(entry, filename);\n return fetchAssetBytesBrowser(url);\n}\n\n// ============================================================================\n// Engine cache (in-memory, per worker/process)\n// ============================================================================\n\n/** @internal Exported for tests. */\nexport const cactusEngines: Map<string, NeedleEngine> = new Map();\n/** @internal Exported for tests. */\nexport const cactusConfigJson: Map<string, unknown> = new Map();\n/** Tracks models whose assets have been persisted (downloaded) but not necessarily loaded. */\nconst cactusCachedModelIds: Set<string> = new Set();\n\nconst cactusEngineLoadsInFlight = new Map<string, Promise<NeedleEngine>>();\n\nexport async function getOrLoadEngine(model: CactusModelConfig): Promise<NeedleEngine> {\n const model_id = model.provider_config.model_id;\n const cached = cactusEngines.get(model_id);\n if (cached) return cached;\n\n const inFlight = cactusEngineLoadsInFlight.get(model_id);\n if (inFlight) return inFlight;\n\n const loadPromise = (async (): Promise<NeedleEngine> => {\n const sdk = await loadSdk();\n const entry = getCactusCatalogEntry(model_id);\n if (!entry) throw new Error(`Unknown Cactus model_id: ${model_id}`);\n\n const [weightsBytes, vocabBytes, configBytes] = await Promise.all([\n fetchAssetBytes(model, entry.assets.weights),\n fetchAssetBytes(model, entry.assets.vocab),\n fetchAssetBytes(model, entry.assets.config),\n ]);\n\n try {\n const text = new TextDecoder().decode(configBytes);\n cactusConfigJson.set(model_id, JSON.parse(text));\n } catch {\n cactusConfigJson.set(model_id, null);\n }\n\n // needle-rs `NeedleWasm.load(weights_bytes: Uint8Array, vocab_text: string)` — vocab is a string.\n const vocabText = new TextDecoder().decode(vocabBytes);\n const engine = sdk.NeedleWasm.load(weightsBytes, vocabText);\n if (!engine) {\n throw new Error(`needle-rs NeedleWasm.load returned undefined for model ${model_id}`);\n }\n cactusEngines.set(model_id, engine);\n return engine;\n })().finally(() => {\n cactusEngineLoadsInFlight.delete(model_id);\n });\n\n cactusEngineLoadsInFlight.set(model_id, loadPromise);\n return loadPromise;\n}\n\nexport function isModelLoaded(model_id: string): boolean {\n return cactusEngines.has(model_id);\n}\n\n/** Mark a model_id as having its assets persisted in Cache Storage. */\nexport function markModelCached(model_id: string): void {\n cactusCachedModelIds.add(model_id);\n}\n\n/** Returns true if the model's assets have been downloaded or the engine is currently loaded. */\nexport function isModelCached(model_id: string): boolean {\n return cactusEngines.has(model_id) || cactusCachedModelIds.has(model_id);\n}\n\nexport async function getCactusModelCacheInfo(\n _model: CactusModelConfig,\n entry: CactusCatalogEntry,\n detail: string | undefined,\n signal: AbortSignal | undefined\n): Promise<CactusModelCacheInfo> {\n const cachesApi = (globalThis as unknown as { caches: CacheStorage }).caches;\n const cache = await cachesApi.open(CACTUS_CACHE_NAME);\n const filenames = assetFilenames(entry);\n const cacheHits = await Promise.all(\n filenames.map(async (filename) => {\n const url = cactusAssetUrl(entry, filename);\n const hit = await cache.match(url);\n return { filename, url, hit };\n })\n );\n const allCached = cacheHits.every(({ hit }) => Boolean(hit));\n\n if (detail === \"files\") {\n return {\n allCached,\n file_sizes: Object.fromEntries(filenames.map((filename) => [filename, 0])),\n };\n }\n\n if (detail !== \"files_with_metadata\") {\n return { allCached, file_sizes: null };\n }\n\n const file_sizes: Record<string, number> = {};\n await Promise.all(\n cacheHits.map(async ({ filename, url, hit }) => {\n if (hit) {\n const contentLength = hit.headers.get(\"content-length\");\n const contentLengthSize = contentLength ? Number(contentLength) : undefined;\n if (contentLengthSize !== undefined && Number.isFinite(contentLengthSize)) {\n file_sizes[filename] = contentLengthSize;\n } else {\n file_sizes[filename] = (await hit.clone().arrayBuffer()).byteLength;\n }\n return;\n }\n const remoteSize = await getRemoteAssetSize(url, signal);\n if (remoteSize !== undefined) {\n file_sizes[filename] = remoteSize;\n }\n })\n );\n\n return {\n allCached,\n file_sizes: Object.keys(file_sizes).length > 0 ? file_sizes : null,\n };\n}\n\n// ============================================================================\n// Sessions (no-op — needle-rs is stateless across calls)\n// ============================================================================\n\n/** @internal Exported for tests. */\nexport const cactusSessions: Map<string, Record<string, never>> = new Map();\n\nexport async function deleteCactusSession(id: string): Promise<boolean> {\n return cactusSessions.delete(id);\n}\n\n// ============================================================================\n// Eviction\n// ============================================================================\n\nasync function removeBrowserCacheEntries(entry: CactusCatalogEntry): Promise<void> {\n const cachesApi = (globalThis as unknown as { caches: CacheStorage }).caches;\n const cache = await cachesApi.open(CACTUS_CACHE_NAME);\n for (const filename of [entry.assets.weights, entry.assets.vocab, entry.assets.config]) {\n const url = cactusAssetUrl(entry, filename);\n try {\n await cache.delete(url);\n } catch {\n /* ignore */\n }\n }\n}\n\nfunction disposeCactusEngine(model_id: string): void {\n const engine = cactusEngines.get(model_id);\n if (engine) {\n try {\n (engine as unknown as { free?: () => void }).free?.();\n } catch {\n /* best effort */\n }\n }\n cactusEngines.delete(model_id);\n cactusConfigJson.delete(model_id);\n cactusCachedModelIds.delete(model_id);\n}\n\nexport async function removeCachedAssets(model: CactusModelConfig): Promise<void> {\n const model_id = model.provider_config.model_id;\n const entry = getCactusCatalogEntry(model_id);\n if (!entry) return;\n await removeBrowserCacheEntries(entry);\n disposeCactusEngine(model_id);\n}\n\n/** Best-effort cleanup on shutdown. */\nexport async function disposeCactusResources(): Promise<void> {\n for (const id of Array.from(cactusEngines.keys())) {\n disposeCactusEngine(id);\n }\n cactusEngines.clear();\n cactusConfigJson.clear();\n cactusCachedModelIds.clear();\n cactusSessions.clear();\n}\n",
|
|
8
8
|
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRegisterOptions } from \"@workglow/ai\";\nimport { registerProviderInline } from \"@workglow/ai/provider-utils\";\nimport { CactusQueuedProvider } from \"./CactusQueuedProvider.browser\";\nimport { CACTUS_PREVIEW_TASKS, CACTUS_RUN_FNS } from \"./common/Cactus_JobRunFns.browser\";\n\nexport async function registerCactusInline(options?: AiProviderRegisterOptions): Promise<void> {\n await registerProviderInline(\n new CactusQueuedProvider(CACTUS_RUN_FNS, CACTUS_PREVIEW_TASKS),\n \"Cactus\",\n options\n );\n}\n",
|
|
9
9
|
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderPreviewRunFn,\n AiProviderRunFnRegistration,\n Capability,\n ModelConfig,\n ModelRecord,\n} from \"@workglow/ai\";\nimport { QueuedAiProvider } from \"@workglow/ai\";\nimport { cactusWorkerRunFnSpecs, inferCactusCapabilities } from \"./common/Cactus_Capabilities\";\nimport { LOCAL_CACTUS } from \"./common/Cactus_Constants\";\nimport type { CactusModelConfig } from \"./common/Cactus_ModelSchema\";\nimport { deleteCactusSession } from \"./common/Cactus_Runtime.browser\";\n\n/** Browser main-thread registration (inline or worker-backed); creates the default job queue. */\nexport class CactusQueuedProvider extends QueuedAiProvider<CactusModelConfig> {\n readonly name = LOCAL_CACTUS;\n readonly displayName = \"Cactus (Needle)\";\n readonly isLocal = true;\n readonly supportsBrowser = true;\n\n constructor(\n promiseRunFns?: readonly AiProviderRunFnRegistration<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any,\n CactusModelConfig\n >[],\n previewTasks?: Record<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n AiProviderPreviewRunFn<any, any, CactusModelConfig>\n >\n ) {\n super(promiseRunFns, previewTasks);\n }\n\n override inferCapabilities(model: ModelRecord): readonly Capability[] {\n return inferCactusCapabilities(model);\n }\n\n protected override workerRunFnSpecs(): readonly { serves: readonly Capability[] }[] {\n return cactusWorkerRunFnSpecs();\n }\n\n override createSession(_model: ModelConfig): string {\n return crypto.randomUUID();\n }\n\n override async disposeSession(sessionId: string): Promise<void> {\n await deleteCactusSession(sessionId);\n }\n}\n",
|
|
10
10
|
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { Capability } from \"@workglow/ai/worker\";\n\nexport const CACTUS_TOOL_USE = [\"tool-use\"] as const satisfies Capability[];\nexport const CACTUS_MODEL_DOWNLOAD = [\"model.download\"] as const satisfies Capability[];\nexport const CACTUS_MODEL_DOWNLOAD_REMOVE = [\n \"model.download-remove\",\n] as const satisfies Capability[];\nexport const CACTUS_MODEL_SEARCH = [\"model.search\"] as const satisfies Capability[];\nexport const CACTUS_MODEL_INFO = [\"model.info\"] as const satisfies Capability[];\n\nexport const CACTUS_CAPABILITY_SETS = [\n CACTUS_TOOL_USE,\n CACTUS_MODEL_DOWNLOAD,\n CACTUS_MODEL_DOWNLOAD_REMOVE,\n CACTUS_MODEL_SEARCH,\n CACTUS_MODEL_INFO,\n] as const;\n",
|
|
11
11
|
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { Capability, ModelRecord } from \"@workglow/ai/worker\";\nimport { CACTUS_CAPABILITY_SETS } from \"./Cactus_CapabilitySets\";\n\nexport const CACTUS_RUN_FN_SPECS = CACTUS_CAPABILITY_SETS.map((serves) => ({ serves }));\n\nexport function cactusWorkerRunFnSpecs(): readonly {\n readonly serves: readonly Capability[];\n}[] {\n return CACTUS_RUN_FN_SPECS;\n}\n\ntype CapabilityHints = Pick<ModelRecord, \"model_id\" | \"provider_config\" | \"capabilities\">;\n\n/**\n * needle-rs ships a single model architecture; capability inference is constant.\n */\nexport function inferCactusCapabilities(_model: CapabilityHints): readonly Capability[] {\n return [\"tool-use\", \"model.download\", \"model.download-remove\", \"model.search\", \"model.info\"];\n}\n",
|
|
12
12
|
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n ModelDownloadTaskRunInput,\n ModelDownloadTaskRunOutput,\n} from \"@workglow/ai\";\nimport { getCactusCatalogEntry } from \"./Cactus_ModelCatalog\";\nimport type { CactusModelConfig } from \"./Cactus_ModelSchema\";\nimport { fetchAssetBytes, markModelCached } from \"./Cactus_Runtime.browser\";\n\nexport const Cactus_Download: AiProviderRunFn<\n ModelDownloadTaskRunInput,\n ModelDownloadTaskRunOutput,\n CactusModelConfig\n> = async (input, model, _signal, emit) => {\n if (!model) throw new Error(\"Model config is required for ModelDownloadTask.\");\n const model_id = model.provider_config.model_id;\n const entry = getCactusCatalogEntry(model_id);\n if (!entry) throw new Error(`Unknown Cactus model_id: ${model_id}`);\n\n const assets = [entry.assets.weights, entry.assets.vocab, entry.assets.config];\n for (let i = 0; i < assets.length; i++) {\n emit({\n type: \"phase\",\n message: `Downloading ${assets[i]}`,\n progress: Math.round(((i + 0.5) / assets.length) * 99),\n });\n await fetchAssetBytes(model, assets[i]);\n }\n markModelCached(model_id);\n emit({ type: \"finish\", data: { model: input.model! } });\n};\n",
|
|
13
13
|
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n ModelDownloadRemoveTaskRunInput,\n ModelDownloadRemoveTaskRunOutput,\n} from \"@workglow/ai\";\nimport type { CactusModelConfig } from \"./Cactus_ModelSchema\";\nimport { removeCachedAssets } from \"./Cactus_Runtime.browser\";\n\nexport const Cactus_DownloadRemove: AiProviderRunFn<\n ModelDownloadRemoveTaskRunInput,\n ModelDownloadRemoveTaskRunOutput,\n CactusModelConfig\n> = async (input, model, _signal, emit) => {\n if (!model) throw new Error(\"Model config is required for ModelDownloadRemoveTask.\");\n await removeCachedAssets(model);\n emit({ type: \"finish\", data: { model: input.model } });\n};\n",
|
|
14
|
-
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRunFn, ModelInfoTaskInput, ModelInfoTaskOutput } from \"@workglow/ai\";\nimport { getCactusCatalogEntry } from \"./Cactus_ModelCatalog\";\nimport type { CactusModelConfig } from \"./Cactus_ModelSchema\";\nimport { isModelCached, isModelLoaded } from \"./Cactus_Runtime.browser\";\n\nexport const Cactus_ModelInfo: AiProviderRunFn<\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n CactusModelConfig\n> = async (input, model,
|
|
14
|
+
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRunFn, ModelInfoTaskInput, ModelInfoTaskOutput } from \"@workglow/ai\";\nimport { getCactusCatalogEntry } from \"./Cactus_ModelCatalog\";\nimport type { CactusModelConfig } from \"./Cactus_ModelSchema\";\nimport { getCactusModelCacheInfo, isModelCached, isModelLoaded } from \"./Cactus_Runtime.browser\";\n\nexport const Cactus_ModelInfo: AiProviderRunFn<\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n CactusModelConfig\n> = async (input, model, signal, emit) => {\n if (!model) throw new Error(\"Model config is required for ModelInfoTask.\");\n const model_id = model.provider_config.model_id;\n const entry = getCactusCatalogEntry(model_id);\n if (!entry) throw new Error(`Unknown Cactus model_id: ${model_id}`);\n\n const is_loaded = isModelLoaded(model_id);\n const cacheInfo = await getCactusModelCacheInfo(model, entry, input.detail, signal);\n const is_cached = is_loaded || isModelCached(model_id) || cacheInfo.allCached;\n\n emit({\n type: \"finish\",\n data: {\n model: input.model,\n is_local: true,\n is_remote: false,\n supports_browser: true,\n supports_node: true,\n is_cached,\n is_loaded,\n file_sizes: cacheInfo.file_sizes,\n },\n });\n};\n",
|
|
15
15
|
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n ModelSearchResultItem,\n ModelSearchTaskInput,\n ModelSearchTaskOutput,\n} from \"@workglow/ai\";\nimport { LOCAL_CACTUS } from \"./Cactus_Constants\";\nimport { CACTUS_CATALOG } from \"./Cactus_ModelCatalog\";\n\nexport const Cactus_ModelSearch: AiProviderRunFn<\n ModelSearchTaskInput,\n ModelSearchTaskOutput\n> = async (input, _model, _signal, emit) => {\n const query = (input.query ?? \"\").trim().toLowerCase();\n const results: ModelSearchResultItem[] = CACTUS_CATALOG.filter(\n (e) =>\n !query || e.model_id.toLowerCase().includes(query) || e.title.toLowerCase().includes(query)\n ).map((e) => ({\n id: e.model_id,\n label: e.title,\n description: e.description,\n record: {\n model_id: e.model_id,\n title: e.title,\n description: e.description,\n provider: LOCAL_CACTUS,\n provider_config: { model_id: e.model_id },\n capabilities: [...e.capabilities],\n metadata: {},\n },\n raw: e,\n }));\n emit({ type: \"finish\", data: { results } });\n};\n",
|
|
16
|
-
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n ToolCalls,\n ToolDefinition,\n} from \"@workglow/ai\";\nimport { extractMessageText } from \"@workglow/ai/provider-utils\";\nimport { filterValidToolCalls } from \"@workglow/ai/worker\";\nimport type { CactusModelConfig } from \"./Cactus_ModelSchema\";\nimport { getOrLoadEngine } from \"./Cactus_Runtime.browser\";\n\nfunction buildToolsJson(tools: ReadonlyArray<ToolDefinition>): string {\n return JSON.stringify(\n tools.map((t) => ({\n name: t.name,\n ...(t.description ? { description: t.description } : {}),\n ...(t.inputSchema ? { parameters: t.inputSchema } : {}),\n }))\n );\n}\n\nfunction promptText(input: ToolCallingTaskInput): string {\n if (typeof input.prompt === \"string\") return input.prompt;\n if (input.prompt) return extractMessageText(input.prompt);\n if (input.messages && input.messages.length > 0) {\n const last = input.messages[input.messages.length - 1];\n return extractMessageText(last.content);\n }\n return \"\";\n}\n\nfunction parseToolCalls(raw: string): ToolCalls {\n if (!raw) return [];\n try {\n const obj = JSON.parse(raw);\n if (Array.isArray(obj)) {\n return obj.map((o, i) => ({\n id: `call_${i}`,\n name: String(o.name ?? \"\"),\n input: (o.arguments ?? o.params ?? {}) as Record<string, unknown>,\n }));\n }\n if (obj && typeof obj === \"object\" && typeof obj.name === \"string\") {\n return [\n {\n id: \"call_0\",\n name: obj.name,\n input: (obj.arguments ?? obj.params ?? {}) as Record<string, unknown>,\n },\n ];\n }\n } catch {\n /* fall through */\n }\n return [];\n}\n\nexport const Cactus_ToolCalling: AiProviderRunFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n CactusModelConfig\n> = async (input, model, signal, emit) => {\n if (!model) throw new Error(\"Model config is required for ToolCallingTask.\");\n if (signal.aborted) throw signal.reason ?? new Error(\"The operation was aborted\");\n\n const engine = await getOrLoadEngine(model);\n const query = promptText(input);\n const toolsJson = buildToolsJson(input.tools);\n\n let raw = \"\";\n const engineWithStream = engine as unknown as {\n run_stream?: (q: string, t: string, cb: (chunk: string) => void) => Promise<string>;\n run: (q: string, t: string) => Promise<string> | string;\n };\n\n if (typeof engineWithStream.run_stream === \"function\") {\n raw = await engineWithStream.run_stream(query, toolsJson, (chunk) => {\n emit({ type: \"text-delta\", port: \"text\", textDelta: chunk });\n });\n } else {\n const out = await engineWithStream.run(query, toolsJson);\n raw = typeof out === \"string\" ? out : String(out);\n }\n\n const parsed: ToolCalls = parseToolCalls(raw);\n const validToolCalls = filterValidToolCalls(parsed, input.tools);\n if (validToolCalls.length > 0) {\n emit({ type: \"object-delta\", port: \"toolCalls\", objectDelta: [...validToolCalls] });\n }\n emit({ type: \"finish\", data: { text: raw, toolCalls: validToolCalls } });\n};\n",
|
|
16
|
+
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n ToolCalls,\n ToolDefinition,\n} from \"@workglow/ai\";\nimport { extractMessageText } from \"@workglow/ai/provider-utils\";\nimport { filterValidToolCalls, sanitizeToolArgs } from \"@workglow/ai/worker\";\nimport type { CactusModelConfig } from \"./Cactus_ModelSchema\";\nimport { getOrLoadEngine } from \"./Cactus_Runtime.browser\";\n\nfunction buildToolsJson(tools: ReadonlyArray<ToolDefinition>): string {\n return JSON.stringify(\n tools.map((t) => ({\n name: t.name,\n ...(t.description ? { description: t.description } : {}),\n ...(t.inputSchema ? { parameters: t.inputSchema } : {}),\n }))\n );\n}\n\nfunction promptText(input: ToolCallingTaskInput): string {\n if (typeof input.prompt === \"string\") return input.prompt;\n if (input.prompt) return extractMessageText(input.prompt);\n if (input.messages && input.messages.length > 0) {\n const last = input.messages[input.messages.length - 1];\n return extractMessageText(last.content);\n }\n return \"\";\n}\n\nfunction parseToolCalls(raw: string): ToolCalls {\n if (!raw) return [];\n try {\n const obj = JSON.parse(raw);\n if (Array.isArray(obj)) {\n return obj.map((o, i) => ({\n id: `call_${i}`,\n name: String(o.name ?? \"\"),\n input: sanitizeToolArgs(o.arguments ?? o.params ?? {}) as Record<string, unknown>,\n }));\n }\n if (obj && typeof obj === \"object\" && typeof obj.name === \"string\") {\n return [\n {\n id: \"call_0\",\n name: obj.name,\n input: sanitizeToolArgs(obj.arguments ?? obj.params ?? {}) as Record<string, unknown>,\n },\n ];\n }\n } catch {\n /* fall through */\n }\n return [];\n}\n\nexport const Cactus_ToolCalling: AiProviderRunFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n CactusModelConfig\n> = async (input, model, signal, emit) => {\n if (!model) throw new Error(\"Model config is required for ToolCallingTask.\");\n if (signal.aborted) throw signal.reason ?? new Error(\"The operation was aborted\");\n\n const engine = await getOrLoadEngine(model);\n const query = promptText(input);\n const toolsJson = buildToolsJson(input.tools);\n\n let raw = \"\";\n const engineWithStream = engine as unknown as {\n run_stream?: (q: string, t: string, cb: (chunk: string) => void) => Promise<string>;\n run: (q: string, t: string) => Promise<string> | string;\n };\n\n if (typeof engineWithStream.run_stream === \"function\") {\n raw = await engineWithStream.run_stream(query, toolsJson, (chunk) => {\n emit({ type: \"text-delta\", port: \"text\", textDelta: chunk });\n });\n } else {\n const out = await engineWithStream.run(query, toolsJson);\n raw = typeof out === \"string\" ? out : String(out);\n }\n\n const parsed: ToolCalls = parseToolCalls(raw);\n const validToolCalls = filterValidToolCalls(parsed, input.tools);\n if (validToolCalls.length > 0) {\n emit({ type: \"object-delta\", port: \"toolCalls\", objectDelta: [...validToolCalls] });\n }\n emit({ type: \"finish\", data: { text: raw, toolCalls: validToolCalls } });\n};\n",
|
|
17
17
|
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRunFnRegistration } from \"@workglow/ai\";\nimport {\n CACTUS_MODEL_DOWNLOAD,\n CACTUS_MODEL_DOWNLOAD_REMOVE,\n CACTUS_MODEL_INFO,\n CACTUS_MODEL_SEARCH,\n CACTUS_TOOL_USE,\n} from \"./Cactus_CapabilitySets\";\nimport { Cactus_Download } from \"./Cactus_Download.browser\";\nimport { Cactus_DownloadRemove } from \"./Cactus_DownloadRemove.browser\";\nimport { Cactus_ModelInfo } from \"./Cactus_ModelInfo.browser\";\nimport type { CactusModelConfig } from \"./Cactus_ModelSchema\";\nimport { Cactus_ModelSearch } from \"./Cactus_ModelSearch\";\nimport { Cactus_ToolCalling } from \"./Cactus_ToolCalling.browser\";\n\nexport {\n cactusConfigJson,\n cactusEngines,\n deleteCactusSession,\n disposeCactusResources,\n getOrLoadEngine,\n loadSdk,\n removeCachedAssets,\n} from \"./Cactus_Runtime.browser\";\n\nexport const CACTUS_RUN_FNS: readonly AiProviderRunFnRegistration<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any,\n CactusModelConfig\n>[] = [\n { serves: CACTUS_TOOL_USE, runFn: Cactus_ToolCalling },\n { serves: CACTUS_MODEL_DOWNLOAD, runFn: Cactus_Download },\n { serves: CACTUS_MODEL_DOWNLOAD_REMOVE, runFn: Cactus_DownloadRemove },\n { serves: CACTUS_MODEL_SEARCH, runFn: Cactus_ModelSearch },\n { serves: CACTUS_MODEL_INFO, runFn: Cactus_ModelInfo },\n];\n\n/** No preview-only tasks for Cactus today. */\nexport const CACTUS_PREVIEW_TASKS = {} as const;\n",
|
|
18
18
|
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { registerProviderWorker } from \"@workglow/ai/provider-utils\";\nimport { CactusProvider } from \"./CactusProvider.browser\";\nimport { CACTUS_PREVIEW_TASKS, CACTUS_RUN_FNS } from \"./common/Cactus_JobRunFns.browser\";\n\nexport async function registerCactusWorker(): Promise<void> {\n await registerProviderWorker(\n (ws) => new CactusProvider(CACTUS_RUN_FNS, CACTUS_PREVIEW_TASKS).registerOnWorkerServer(ws),\n \"Cactus\"\n );\n}\n",
|
|
19
19
|
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderPreviewRunFn,\n AiProviderRunFnRegistration,\n Capability,\n ModelConfig,\n ModelRecord,\n} from \"@workglow/ai/worker\";\nimport { AiProvider } from \"@workglow/ai/worker\";\nimport { cactusWorkerRunFnSpecs, inferCactusCapabilities } from \"./common/Cactus_Capabilities\";\nimport { LOCAL_CACTUS } from \"./common/Cactus_Constants\";\nimport type { CactusModelConfig } from \"./common/Cactus_ModelSchema\";\nimport { deleteCactusSession } from \"./common/Cactus_Runtime.browser\";\n\n/** Browser worker-server registration for Cactus. */\nexport class CactusProvider extends AiProvider<CactusModelConfig> {\n readonly name = LOCAL_CACTUS;\n readonly displayName = \"Cactus (Needle)\";\n readonly isLocal = true;\n readonly supportsBrowser = true;\n\n constructor(\n promiseRunFns?: readonly AiProviderRunFnRegistration<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any,\n CactusModelConfig\n >[],\n previewTasks?: Record<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n AiProviderPreviewRunFn<any, any, CactusModelConfig>\n >\n ) {\n super(promiseRunFns, previewTasks);\n }\n\n override inferCapabilities(model: ModelRecord): readonly Capability[] {\n return inferCactusCapabilities(model);\n }\n\n protected override workerRunFnSpecs(): readonly { serves: readonly Capability[] }[] {\n return cactusWorkerRunFnSpecs();\n }\n\n override createSession(_model: ModelConfig): string {\n return crypto.randomUUID();\n }\n\n override async disposeSession(sessionId: string): Promise<void> {\n await deleteCactusSession(sessionId);\n }\n}\n"
|
|
20
20
|
],
|
|
21
|
-
"mappings": "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",
|
|
22
|
-
"debugId": "
|
|
21
|
+
"mappings": "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",
|
|
22
|
+
"debugId": "50314F7F9017421A64756E2164756E21",
|
|
23
23
|
"names": []
|
|
24
24
|
}
|
package/dist/ai-runtime.js
CHANGED
|
@@ -65,6 +65,63 @@ function hasBrowserCacheStorage() {
|
|
|
65
65
|
function modelsDirOf(model) {
|
|
66
66
|
return model.provider_config.models_dir ?? CACTUS_DEFAULT_MODELS_DIR;
|
|
67
67
|
}
|
|
68
|
+
function resolveModelDir(models_dir, model_id) {
|
|
69
|
+
return models_dir.startsWith("~/") ? path.join(process.env.HOME ?? process.env.USERPROFILE ?? ".", models_dir.slice(2), model_id) : path.resolve(models_dir, model_id);
|
|
70
|
+
}
|
|
71
|
+
function assetFilenames(entry) {
|
|
72
|
+
return [entry.assets.weights, entry.assets.vocab, entry.assets.config];
|
|
73
|
+
}
|
|
74
|
+
async function getRemoteAssetSize(url, signal) {
|
|
75
|
+
try {
|
|
76
|
+
const response = await fetch(url, { method: "HEAD", signal });
|
|
77
|
+
if (!response.ok)
|
|
78
|
+
return;
|
|
79
|
+
const contentLength = response.headers.get("content-length");
|
|
80
|
+
if (!contentLength)
|
|
81
|
+
return;
|
|
82
|
+
const size = Number(contentLength);
|
|
83
|
+
return Number.isFinite(size) ? size : undefined;
|
|
84
|
+
} catch {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async function getNodeAssetCacheInfo(model, entry, detail, signal) {
|
|
89
|
+
const filenames = assetFilenames(entry);
|
|
90
|
+
const resolvedDir = resolveModelDir(modelsDirOf(model), entry.model_id);
|
|
91
|
+
const stats = await Promise.all(filenames.map(async (filename) => {
|
|
92
|
+
try {
|
|
93
|
+
const stat = await fs.stat(path.join(resolvedDir, filename));
|
|
94
|
+
return { filename, size: stat.size, cached: true };
|
|
95
|
+
} catch {
|
|
96
|
+
return { filename, size: undefined, cached: false };
|
|
97
|
+
}
|
|
98
|
+
}));
|
|
99
|
+
const allCached = stats.every((stat) => stat.cached);
|
|
100
|
+
if (detail === "files") {
|
|
101
|
+
return {
|
|
102
|
+
allCached,
|
|
103
|
+
file_sizes: Object.fromEntries(filenames.map((filename) => [filename, 0]))
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (detail !== "files_with_metadata") {
|
|
107
|
+
return { allCached, file_sizes: null };
|
|
108
|
+
}
|
|
109
|
+
const file_sizes = {};
|
|
110
|
+
await Promise.all(stats.map(async (stat) => {
|
|
111
|
+
if (stat.size !== undefined) {
|
|
112
|
+
file_sizes[stat.filename] = stat.size;
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const remoteSize = await getRemoteAssetSize(cactusAssetUrl(entry, stat.filename), signal);
|
|
116
|
+
if (remoteSize !== undefined) {
|
|
117
|
+
file_sizes[stat.filename] = remoteSize;
|
|
118
|
+
}
|
|
119
|
+
}));
|
|
120
|
+
return {
|
|
121
|
+
allCached,
|
|
122
|
+
file_sizes: Object.keys(file_sizes).length > 0 ? file_sizes : null
|
|
123
|
+
};
|
|
124
|
+
}
|
|
68
125
|
async function fetchAssetBytesBrowser(url) {
|
|
69
126
|
const cachesApi = globalThis.caches;
|
|
70
127
|
const cache = await cachesApi.open(CACTUS_CACHE_NAME);
|
|
@@ -79,7 +136,7 @@ async function fetchAssetBytesBrowser(url) {
|
|
|
79
136
|
return new Uint8Array(await resp.arrayBuffer());
|
|
80
137
|
}
|
|
81
138
|
async function fetchAssetBytesNode(url, models_dir, model_id, filename) {
|
|
82
|
-
const resolvedDir =
|
|
139
|
+
const resolvedDir = resolveModelDir(models_dir, model_id);
|
|
83
140
|
const filePath = path.join(resolvedDir, filename);
|
|
84
141
|
try {
|
|
85
142
|
const buf = await fs.readFile(filePath);
|
|
@@ -156,6 +213,50 @@ function markModelCached(model_id) {
|
|
|
156
213
|
function isModelCached(model_id) {
|
|
157
214
|
return cactusEngines.has(model_id) || cactusCachedModelIds.has(model_id);
|
|
158
215
|
}
|
|
216
|
+
async function getCactusModelCacheInfo(model, entry, detail, signal) {
|
|
217
|
+
if (hasBrowserCacheStorage()) {
|
|
218
|
+
const cachesApi = globalThis.caches;
|
|
219
|
+
const cache = await cachesApi.open(CACTUS_CACHE_NAME);
|
|
220
|
+
const filenames = assetFilenames(entry);
|
|
221
|
+
const cacheHits = await Promise.all(filenames.map(async (filename) => {
|
|
222
|
+
const url = cactusAssetUrl(entry, filename);
|
|
223
|
+
const hit = await cache.match(url);
|
|
224
|
+
return { filename, url, hit };
|
|
225
|
+
}));
|
|
226
|
+
const allCached = cacheHits.every(({ hit }) => Boolean(hit));
|
|
227
|
+
if (detail === "files") {
|
|
228
|
+
return {
|
|
229
|
+
allCached,
|
|
230
|
+
file_sizes: Object.fromEntries(filenames.map((filename) => [filename, 0]))
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
if (detail !== "files_with_metadata") {
|
|
234
|
+
return { allCached, file_sizes: null };
|
|
235
|
+
}
|
|
236
|
+
const file_sizes = {};
|
|
237
|
+
await Promise.all(cacheHits.map(async ({ filename, url, hit }) => {
|
|
238
|
+
if (hit) {
|
|
239
|
+
const contentLength = hit.headers.get("content-length");
|
|
240
|
+
const contentLengthSize = contentLength ? Number(contentLength) : undefined;
|
|
241
|
+
if (contentLengthSize !== undefined && Number.isFinite(contentLengthSize)) {
|
|
242
|
+
file_sizes[filename] = contentLengthSize;
|
|
243
|
+
} else {
|
|
244
|
+
file_sizes[filename] = (await hit.clone().arrayBuffer()).byteLength;
|
|
245
|
+
}
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
const remoteSize = await getRemoteAssetSize(url, signal);
|
|
249
|
+
if (remoteSize !== undefined) {
|
|
250
|
+
file_sizes[filename] = remoteSize;
|
|
251
|
+
}
|
|
252
|
+
}));
|
|
253
|
+
return {
|
|
254
|
+
allCached,
|
|
255
|
+
file_sizes: Object.keys(file_sizes).length > 0 ? file_sizes : null
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
return getNodeAssetCacheInfo(model, entry, detail, signal);
|
|
259
|
+
}
|
|
159
260
|
var cactusSessions = new Map;
|
|
160
261
|
async function deleteCactusSession(id) {
|
|
161
262
|
return cactusSessions.delete(id);
|
|
@@ -176,7 +277,7 @@ async function removeNodeCacheDir(model, model_id) {
|
|
|
176
277
|
if (hasBrowserCacheStorage())
|
|
177
278
|
return;
|
|
178
279
|
const models_dir = modelsDirOf(model);
|
|
179
|
-
const resolvedDir =
|
|
280
|
+
const resolvedDir = resolveModelDir(models_dir, model_id);
|
|
180
281
|
await fs.rm(resolvedDir, { recursive: true, force: true });
|
|
181
282
|
}
|
|
182
283
|
function disposeCactusEngine(model_id) {
|
|
@@ -291,7 +392,7 @@ var Cactus_DownloadRemove = async (input, model, _signal, emit) => {
|
|
|
291
392
|
};
|
|
292
393
|
|
|
293
394
|
// src/ai/common/Cactus_ModelInfo.ts
|
|
294
|
-
var Cactus_ModelInfo = async (input, model,
|
|
395
|
+
var Cactus_ModelInfo = async (input, model, signal, emit) => {
|
|
295
396
|
if (!model)
|
|
296
397
|
throw new Error("Model config is required for ModelInfoTask.");
|
|
297
398
|
const model_id = model.provider_config.model_id;
|
|
@@ -299,7 +400,8 @@ var Cactus_ModelInfo = async (input, model, _signal, emit) => {
|
|
|
299
400
|
if (!entry)
|
|
300
401
|
throw new Error(`Unknown Cactus model_id: ${model_id}`);
|
|
301
402
|
const is_loaded = isModelLoaded(model_id);
|
|
302
|
-
const
|
|
403
|
+
const cacheInfo = await getCactusModelCacheInfo(model, entry, input.detail, signal);
|
|
404
|
+
const is_cached = is_loaded || isModelCached(model_id) || cacheInfo.allCached;
|
|
303
405
|
emit({
|
|
304
406
|
type: "finish",
|
|
305
407
|
data: {
|
|
@@ -310,7 +412,7 @@ var Cactus_ModelInfo = async (input, model, _signal, emit) => {
|
|
|
310
412
|
supports_node: true,
|
|
311
413
|
is_cached,
|
|
312
414
|
is_loaded,
|
|
313
|
-
file_sizes:
|
|
415
|
+
file_sizes: cacheInfo.file_sizes
|
|
314
416
|
}
|
|
315
417
|
});
|
|
316
418
|
};
|
|
@@ -338,7 +440,7 @@ var Cactus_ModelSearch = async (input, _model, _signal, emit) => {
|
|
|
338
440
|
|
|
339
441
|
// src/ai/common/Cactus_ToolCalling.ts
|
|
340
442
|
import { extractMessageText } from "@workglow/ai/provider-utils";
|
|
341
|
-
import { filterValidToolCalls } from "@workglow/ai/worker";
|
|
443
|
+
import { filterValidToolCalls, sanitizeToolArgs } from "@workglow/ai/worker";
|
|
342
444
|
function buildToolsJson(tools) {
|
|
343
445
|
return JSON.stringify(tools.map((t) => ({
|
|
344
446
|
name: t.name,
|
|
@@ -366,7 +468,7 @@ function parseToolCalls(raw) {
|
|
|
366
468
|
return obj.map((o, i) => ({
|
|
367
469
|
id: `call_${i}`,
|
|
368
470
|
name: String(o.name ?? ""),
|
|
369
|
-
input: o.arguments ?? o.params ?? {}
|
|
471
|
+
input: sanitizeToolArgs(o.arguments ?? o.params ?? {})
|
|
370
472
|
}));
|
|
371
473
|
}
|
|
372
474
|
if (obj && typeof obj === "object" && typeof obj.name === "string") {
|
|
@@ -374,7 +476,7 @@ function parseToolCalls(raw) {
|
|
|
374
476
|
{
|
|
375
477
|
id: "call_0",
|
|
376
478
|
name: obj.name,
|
|
377
|
-
input: obj.arguments ?? obj.params ?? {}
|
|
479
|
+
input: sanitizeToolArgs(obj.arguments ?? obj.params ?? {})
|
|
378
480
|
}
|
|
379
481
|
];
|
|
380
482
|
}
|
|
@@ -462,6 +564,7 @@ export {
|
|
|
462
564
|
isModelCached,
|
|
463
565
|
getOrLoadEngine,
|
|
464
566
|
getCactusSdk,
|
|
567
|
+
getCactusModelCacheInfo,
|
|
465
568
|
fetchAssetBytes,
|
|
466
569
|
disposeCactusResources,
|
|
467
570
|
deleteCactusSession,
|
|
@@ -470,4 +573,4 @@ export {
|
|
|
470
573
|
cactusConfigJson
|
|
471
574
|
};
|
|
472
575
|
|
|
473
|
-
//# debugId=
|
|
576
|
+
//# debugId=625B2696DC38FBF764756E2164756E21
|