(readBatchSize, maxBatchCalls) => {
const nativeBridge = globalThis.__bridge;
const stringify = JSON.stringify, parse = JSON.parse;
const isArray = Array.isArray, toString = String;
const trim = Function.prototype.call.bind(String.prototype.trim);
const ArgumentError = TypeError, floor = Math.floor;
const fail = message => { throw new ArgumentError(message); };
const bridge = (...args) => parse(nativeBridge(...args));
delete globalThis.__bridge;
const readMany = ({paths, intent}) => {
if (!isArray(paths) || paths.length > readBatchSize * maxBatchCalls)
fail(`readMany requires at most ${readBatchSize * maxBatchCalls} paths`);
if (typeof intent !== 'string' || !trim(intent))
fail('readMany requires a nonblank intent');
const calls = [];
for (let i = 0; i < paths.length; i++) {
const path = paths[i];
if (typeof path !== 'string' || !trim(path))
fail('readMany paths must be nonblank strings');
const group = floor(i / readBatchSize);
if (i % readBatchSize === 0) calls[group] = {name: 'read', args: {paths: [], intent}};
calls[group].args.paths[i % readBatchSize] = path;
}
const results = bridge('call_all', '', stringify(calls));
const files = [];
let success = true, complete = true, requestComplete = true, anySuccess = false;
for (let group = 0; group < calls.length; group++) {
const result = results[group];
const entries = result?.content?.files;
success = success && result?.success === true;
for (let index = 0; index < calls[group].args.paths.length; index++) {
const path = calls[group].args.paths[index];
const entry = isArray(entries) ? entries[index] : undefined;
const file = entry?.path === path ? entry : {
path, text: '', success: false, complete: false, request_complete: false,
omitted: true, error: result?.error ?? 'Read result omitted requested path'
};
files[files.length] = file;
success = success && file.success === true;
complete = complete && file.success === true && file.complete === true;
requestComplete = requestComplete && result?.success === true &&
file.success === true && file.request_complete === true;
anySuccess = anySuccess || file.success === true;
}
}
return {success, content: {files, complete, request_complete: requestComplete,
outcome: requestComplete ? 'complete' : anySuccess ? 'partial' : 'failed'}};
};
Object.defineProperty(globalThis, 'tools', {value: Object.freeze({
list: () => bridge('list', '', '{}'),
search: query => bridge('search', toString(query), '{}'),
describe: name => bridge('describe', toString(name), '{}'),
budget: () => bridge('budget', '', '{}'),
call: (name, args) => bridge('call', toString(name), stringify(args)),
callAll: calls => bridge('call_all', '', stringify(calls)),
readMany
}), writable: false, configurable: false});
}