@lloyal-labs/rig 2.1.0 → 3.0.1
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/LICENSE +107 -0
- package/LICENSE-FAQ.md +256 -0
- package/README.md +93 -74
- package/dist/bundle.d.ts +211 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +296 -0
- package/dist/bundle.js.map +1 -0
- package/dist/cancellable-fetch.d.ts +98 -0
- package/dist/cancellable-fetch.d.ts.map +1 -0
- package/dist/cancellable-fetch.js +133 -0
- package/dist/cancellable-fetch.js.map +1 -0
- package/dist/config-store.d.ts +30 -0
- package/dist/config-store.d.ts.map +1 -0
- package/dist/config-store.js +45 -0
- package/dist/config-store.js.map +1 -0
- package/dist/define-app.d.ts +98 -0
- package/dist/define-app.d.ts.map +1 -0
- package/dist/define-app.js +232 -0
- package/dist/define-app.js.map +1 -0
- package/dist/grant-store.d.ts +31 -0
- package/dist/grant-store.d.ts.map +1 -0
- package/dist/grant-store.js +49 -0
- package/dist/grant-store.js.map +1 -0
- package/dist/index.d.ts +13 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -11
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +3 -2
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +3 -2
- package/dist/node.js.map +1 -1
- package/dist/protocol.d.ts +155 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +184 -0
- package/dist/protocol.js.map +1 -0
- package/dist/registry.d.ts +87 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +245 -0
- package/dist/registry.js.map +1 -0
- package/dist/reranker.d.ts +25 -7
- package/dist/reranker.d.ts.map +1 -1
- package/dist/reranker.js +103 -63
- package/dist/reranker.js.map +1 -1
- package/dist/resources/types.d.ts +10 -37
- package/dist/resources/types.d.ts.map +1 -1
- package/dist/resources/types.js +12 -0
- package/dist/resources/types.js.map +1 -1
- package/dist/spine-render.d.ts +97 -0
- package/dist/spine-render.d.ts.map +1 -0
- package/dist/spine-render.js +121 -0
- package/dist/spine-render.js.map +1 -0
- package/dist/tools/index.d.ts +26 -22
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +24 -28
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/keyless-search.d.ts +67 -0
- package/dist/tools/keyless-search.d.ts.map +1 -0
- package/dist/tools/keyless-search.js +401 -0
- package/dist/tools/keyless-search.js.map +1 -0
- package/dist/tools/plan.d.ts +31 -4
- package/dist/tools/plan.d.ts.map +1 -1
- package/dist/tools/plan.js +46 -11
- package/dist/tools/plan.js.map +1 -1
- package/dist/tools/types.d.ts +12 -56
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +17 -0
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/web-search.d.ts +9 -25
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +11 -119
- package/dist/tools/web-search.js.map +1 -1
- package/package.json +10 -7
- package/dist/sources/corpus.d.ts +0 -80
- package/dist/sources/corpus.d.ts.map +0 -1
- package/dist/sources/corpus.js +0 -100
- package/dist/sources/corpus.js.map +0 -1
- package/dist/sources/index.d.ts +0 -12
- package/dist/sources/index.d.ts.map +0 -1
- package/dist/sources/index.js +0 -14
- package/dist/sources/index.js.map +0 -1
- package/dist/sources/web.d.ts +0 -67
- package/dist/sources/web.d.ts.map +0 -1
- package/dist/sources/web.js +0 -104
- package/dist/sources/web.js.map +0 -1
- package/dist/tools/fetch-page.d.ts +0 -48
- package/dist/tools/fetch-page.d.ts.map +0 -1
- package/dist/tools/fetch-page.js +0 -309
- package/dist/tools/fetch-page.js.map +0 -1
- package/dist/tools/grep.d.ts +0 -35
- package/dist/tools/grep.d.ts.map +0 -1
- package/dist/tools/grep.js +0 -84
- package/dist/tools/grep.js.map +0 -1
- package/dist/tools/read-file.d.ts +0 -74
- package/dist/tools/read-file.d.ts.map +0 -1
- package/dist/tools/read-file.js +0 -192
- package/dist/tools/read-file.js.map +0 -1
- package/dist/tools/search.d.ts +0 -34
- package/dist/tools/search.d.ts.map +0 -1
- package/dist/tools/search.js +0 -101
- package/dist/tools/search.js.map +0 -1
package/dist/tools/grep.js
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GrepTool = void 0;
|
|
4
|
-
const lloyal_agents_1 = require("@lloyal-labs/lloyal-agents");
|
|
5
|
-
/**
|
|
6
|
-
* Exhaustive regex search across all corpus resources
|
|
7
|
-
*
|
|
8
|
-
* Scans every line of every loaded {@link Resource} for matches
|
|
9
|
-
* against a regular expression. Returns matching lines with file
|
|
10
|
-
* names and line numbers, capped at 50 results. Complements
|
|
11
|
-
* {@link SearchTool} which ranks by semantic relevance -- grep
|
|
12
|
-
* finds exact patterns exhaustively.
|
|
13
|
-
*
|
|
14
|
-
* @category Rig
|
|
15
|
-
*/
|
|
16
|
-
class GrepTool extends lloyal_agents_1.Tool {
|
|
17
|
-
name = 'grep';
|
|
18
|
-
description = 'Search the entire corpus for a regex pattern. Returns every matching line with line numbers and total match count. Complements search() which ranks by relevance — grep scans exhaustively.';
|
|
19
|
-
parameters = {
|
|
20
|
-
type: 'object',
|
|
21
|
-
properties: {
|
|
22
|
-
pattern: { type: 'string', description: 'Regex pattern (e.g. "\\bshor\\b" for whole-word, "hidden_secret" for literal)' },
|
|
23
|
-
ignoreCase: { type: 'boolean', description: 'Case-insensitive matching (default: true)' },
|
|
24
|
-
},
|
|
25
|
-
required: ['pattern'],
|
|
26
|
-
};
|
|
27
|
-
_resources;
|
|
28
|
-
_maxResults;
|
|
29
|
-
_lineMaxChars;
|
|
30
|
-
constructor(resources, opts) {
|
|
31
|
-
super();
|
|
32
|
-
this._resources = resources;
|
|
33
|
-
this._maxResults = opts?.maxResults ?? 50;
|
|
34
|
-
this._lineMaxChars = opts?.lineMaxChars ?? 200;
|
|
35
|
-
}
|
|
36
|
-
*execute(args) {
|
|
37
|
-
const pattern = args.pattern?.trim();
|
|
38
|
-
if (!pattern)
|
|
39
|
-
return { error: 'pattern must not be empty' };
|
|
40
|
-
const flags = (args.ignoreCase === false) ? 'g' : 'gi';
|
|
41
|
-
let re;
|
|
42
|
-
try {
|
|
43
|
-
re = new RegExp(pattern, flags);
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
return { error: `Invalid regex: ${pattern}` };
|
|
47
|
-
}
|
|
48
|
-
const matches = [];
|
|
49
|
-
let totalMatches = 0;
|
|
50
|
-
for (const res of this._resources) {
|
|
51
|
-
const lines = res.content.split('\n');
|
|
52
|
-
for (let i = 0; i < lines.length; i++) {
|
|
53
|
-
const hits = lines[i].match(re);
|
|
54
|
-
if (hits) {
|
|
55
|
-
totalMatches += hits.length;
|
|
56
|
-
const raw = lines[i].trim();
|
|
57
|
-
let text;
|
|
58
|
-
const maxChars = this._lineMaxChars;
|
|
59
|
-
if (raw.length <= maxChars) {
|
|
60
|
-
text = raw;
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
const idx = raw.search(re);
|
|
64
|
-
const start = Math.max(0, idx - 40);
|
|
65
|
-
const end = Math.min(raw.length, start + maxChars);
|
|
66
|
-
text = (start > 0 ? '\u2026' : '') + raw.slice(start, end) + (end < raw.length ? '\u2026' : '');
|
|
67
|
-
}
|
|
68
|
-
matches.push({ file: res.name, line: i + 1, text });
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
if (totalMatches === 0) {
|
|
73
|
-
return {
|
|
74
|
-
totalMatches: 0, matchingLines: 0, matches: [],
|
|
75
|
-
note: 'Zero matches does NOT mean the topic is absent \u2014 only that this exact pattern was not found. Try search() for semantic matching or a broader/simpler regex.',
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
const limit = this._maxResults;
|
|
79
|
-
const truncated = matches.length > limit;
|
|
80
|
-
return { totalMatches, matchingLines: matches.length, truncated, matches: matches.slice(0, limit) };
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
exports.GrepTool = GrepTool;
|
|
84
|
-
//# sourceMappingURL=grep.js.map
|
package/dist/tools/grep.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":";;;AACA,8DAAkD;AAIlD;;;;;;;;;;GAUG;AACH,MAAa,QAAS,SAAQ,oBAA+C;IAClE,IAAI,GAAG,MAAM,CAAC;IACd,WAAW,GAAG,6LAA6L,CAAC;IAC5M,UAAU,GAAe;QAChC,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+EAA+E,EAAE;YACzH,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,2CAA2C,EAAE;SAC1F;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB,CAAC;IAEM,UAAU,CAAa;IACvB,WAAW,CAAS;IACpB,aAAa,CAAS;IAE9B,YAAY,SAAqB,EAAE,IAAqD;QACtF,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,EAAE,UAAU,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,EAAE,YAAY,IAAI,GAAG,CAAC;IACjD,CAAC;IAED,CAAC,OAAO,CAAC,IAA+C;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QACvD,IAAI,EAAU,CAAC;QACf,IAAI,CAAC;YAAC,EAAE,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAAC,CAAC;QACxC,MAAM,CAAC;YAAC,OAAO,EAAE,KAAK,EAAE,kBAAkB,OAAO,EAAE,EAAE,CAAC;QAAC,CAAC;QAExD,MAAM,OAAO,GAAmD,EAAE,CAAC;QACnE,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAChC,IAAI,IAAI,EAAE,CAAC;oBACT,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC;oBAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC5B,IAAI,IAAY,CAAC;oBACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;oBACpC,IAAI,GAAG,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;wBAC3B,IAAI,GAAG,GAAG,CAAC;oBACb,CAAC;yBAAM,CAAC;wBACN,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;wBAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;wBACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC;wBACnD,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAClG,CAAC;oBACD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE;gBAC9C,IAAI,EAAE,kKAAkK;aACzK,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;QAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;QACzC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;IACtG,CAAC;CACF;AAnED,4BAmEC"}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import type { Operation } from 'effection';
|
|
2
|
-
import { Tool } from '@lloyal-labs/lloyal-agents';
|
|
3
|
-
import type { JsonSchema, ToolContext } from '@lloyal-labs/lloyal-agents';
|
|
4
|
-
import type { Resource, Chunk } from '../resources/types';
|
|
5
|
-
/**
|
|
6
|
-
* Subtract previously-covered ranges from a target range
|
|
7
|
-
*
|
|
8
|
-
* Given a target half-open interval `[s, e)` and an array of
|
|
9
|
-
* already-covered intervals, returns the sub-ranges of `[s, e)`
|
|
10
|
-
* that have not yet been covered. Used by {@link ReadFileTool}
|
|
11
|
-
* to avoid re-reading lines the agent has already seen.
|
|
12
|
-
*
|
|
13
|
-
* @param range - Target range `[start, end)` (0-indexed)
|
|
14
|
-
* @param covered - Array of previously-covered `[start, end)` ranges
|
|
15
|
-
* @returns Uncovered sub-ranges of the target
|
|
16
|
-
*
|
|
17
|
-
* @category Rig
|
|
18
|
-
*/
|
|
19
|
-
export declare function subtractRanges([s, e]: [number, number], covered: [number, number][]): [number, number][];
|
|
20
|
-
/**
|
|
21
|
-
* Merge overlapping or adjacent half-open ranges into a minimal set
|
|
22
|
-
*
|
|
23
|
-
* Sorts the input ranges by start position, then collapses any
|
|
24
|
-
* overlapping or touching intervals. Used by {@link ReadFileTool}
|
|
25
|
-
* to maintain a compact record of lines already read per agent.
|
|
26
|
-
*
|
|
27
|
-
* @param ranges - Array of `[start, end)` ranges to merge
|
|
28
|
-
* @returns Merged non-overlapping ranges sorted by start
|
|
29
|
-
*
|
|
30
|
-
* @category Rig
|
|
31
|
-
*/
|
|
32
|
-
export declare function mergeRanges(ranges: [number, number][]): [number, number][];
|
|
33
|
-
/**
|
|
34
|
-
* Read content from corpus files by line range
|
|
35
|
-
*
|
|
36
|
-
* Tracks which lines each agent has already read and returns only
|
|
37
|
-
* the unread portions, preventing redundant context inflation.
|
|
38
|
-
* Line ranges typically come from {@link SearchTool} results.
|
|
39
|
-
*
|
|
40
|
-
* Uses {@link subtractRanges} and {@link mergeRanges} internally
|
|
41
|
-
* to maintain per-agent read tracking keyed by `agentId:filename`.
|
|
42
|
-
*
|
|
43
|
-
* @category Rig
|
|
44
|
-
*/
|
|
45
|
-
export declare class ReadFileTool extends Tool<{
|
|
46
|
-
filename: string;
|
|
47
|
-
startLine?: number;
|
|
48
|
-
endLine?: number;
|
|
49
|
-
}> {
|
|
50
|
-
readonly name = "read_file";
|
|
51
|
-
readonly description = "Read content from a file at specific line ranges. Use startLine/endLine from search results.";
|
|
52
|
-
readonly parameters: JsonSchema;
|
|
53
|
-
private _resources;
|
|
54
|
-
private _chunks;
|
|
55
|
-
private _readRanges;
|
|
56
|
-
private _defaultMaxLines;
|
|
57
|
-
constructor(resources: Resource[], opts?: {
|
|
58
|
-
defaultMaxLines?: number;
|
|
59
|
-
chunks?: Chunk[];
|
|
60
|
-
});
|
|
61
|
-
execute(args: {
|
|
62
|
-
filename: string;
|
|
63
|
-
startLine?: number;
|
|
64
|
-
endLine?: number;
|
|
65
|
-
} & Record<string, unknown>, context?: ToolContext): Operation<unknown>;
|
|
66
|
-
/**
|
|
67
|
-
* Find related sections: same-file siblings (adjacent in section hierarchy)
|
|
68
|
-
* and cross-file sections with keyword overlap in section paths.
|
|
69
|
-
*/
|
|
70
|
-
private _findRelated;
|
|
71
|
-
/** Extract lowercase keywords (3+ chars) from a heading */
|
|
72
|
-
private _extractKeywords;
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=read-file.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EACxB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAC1B,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAYpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAa1E;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,YAAa,SAAQ,IAAI,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;IAChG,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,WAAW,kGAAkG;IACtH,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAEhC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,gBAAgB,CAAS;gBAErB,SAAS,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAA;KAAE;IAoBvF,OAAO,CACN,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1F,OAAO,CAAC,EAAE,WAAW,GACpB,SAAS,CAAC,OAAO,CAAC;IAuCrB;;;OAGG;IACH,OAAO,CAAC,YAAY;IA6DpB,2DAA2D;IAC3D,OAAO,CAAC,gBAAgB;CAMzB"}
|
package/dist/tools/read-file.js
DELETED
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ReadFileTool = void 0;
|
|
4
|
-
exports.subtractRanges = subtractRanges;
|
|
5
|
-
exports.mergeRanges = mergeRanges;
|
|
6
|
-
const lloyal_agents_1 = require("@lloyal-labs/lloyal-agents");
|
|
7
|
-
/**
|
|
8
|
-
* Subtract previously-covered ranges from a target range
|
|
9
|
-
*
|
|
10
|
-
* Given a target half-open interval `[s, e)` and an array of
|
|
11
|
-
* already-covered intervals, returns the sub-ranges of `[s, e)`
|
|
12
|
-
* that have not yet been covered. Used by {@link ReadFileTool}
|
|
13
|
-
* to avoid re-reading lines the agent has already seen.
|
|
14
|
-
*
|
|
15
|
-
* @param range - Target range `[start, end)` (0-indexed)
|
|
16
|
-
* @param covered - Array of previously-covered `[start, end)` ranges
|
|
17
|
-
* @returns Uncovered sub-ranges of the target
|
|
18
|
-
*
|
|
19
|
-
* @category Rig
|
|
20
|
-
*/
|
|
21
|
-
function subtractRanges([s, e], covered) {
|
|
22
|
-
let ranges = [[s, e]];
|
|
23
|
-
for (const [cs, ce] of covered) {
|
|
24
|
-
ranges = ranges.flatMap(([a, b]) => {
|
|
25
|
-
if (ce <= a || cs >= b)
|
|
26
|
-
return [[a, b]];
|
|
27
|
-
const result = [];
|
|
28
|
-
if (a < cs)
|
|
29
|
-
result.push([a, cs]);
|
|
30
|
-
if (ce < b)
|
|
31
|
-
result.push([ce, b]);
|
|
32
|
-
return result;
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
return ranges;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Merge overlapping or adjacent half-open ranges into a minimal set
|
|
39
|
-
*
|
|
40
|
-
* Sorts the input ranges by start position, then collapses any
|
|
41
|
-
* overlapping or touching intervals. Used by {@link ReadFileTool}
|
|
42
|
-
* to maintain a compact record of lines already read per agent.
|
|
43
|
-
*
|
|
44
|
-
* @param ranges - Array of `[start, end)` ranges to merge
|
|
45
|
-
* @returns Merged non-overlapping ranges sorted by start
|
|
46
|
-
*
|
|
47
|
-
* @category Rig
|
|
48
|
-
*/
|
|
49
|
-
function mergeRanges(ranges) {
|
|
50
|
-
if (ranges.length === 0)
|
|
51
|
-
return [];
|
|
52
|
-
const sorted = [...ranges].sort((a, b) => a[0] - b[0]);
|
|
53
|
-
const merged = [sorted[0]];
|
|
54
|
-
for (let i = 1; i < sorted.length; i++) {
|
|
55
|
-
const last = merged[merged.length - 1];
|
|
56
|
-
if (sorted[i][0] <= last[1]) {
|
|
57
|
-
last[1] = Math.max(last[1], sorted[i][1]);
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
merged.push(sorted[i]);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return merged;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Read content from corpus files by line range
|
|
67
|
-
*
|
|
68
|
-
* Tracks which lines each agent has already read and returns only
|
|
69
|
-
* the unread portions, preventing redundant context inflation.
|
|
70
|
-
* Line ranges typically come from {@link SearchTool} results.
|
|
71
|
-
*
|
|
72
|
-
* Uses {@link subtractRanges} and {@link mergeRanges} internally
|
|
73
|
-
* to maintain per-agent read tracking keyed by `agentId:filename`.
|
|
74
|
-
*
|
|
75
|
-
* @category Rig
|
|
76
|
-
*/
|
|
77
|
-
class ReadFileTool extends lloyal_agents_1.Tool {
|
|
78
|
-
name = 'read_file';
|
|
79
|
-
description = 'Read content from a file at specific line ranges. Use startLine/endLine from search results.';
|
|
80
|
-
parameters;
|
|
81
|
-
_resources;
|
|
82
|
-
_chunks;
|
|
83
|
-
_readRanges = new Map();
|
|
84
|
-
_defaultMaxLines;
|
|
85
|
-
constructor(resources, opts) {
|
|
86
|
-
super();
|
|
87
|
-
this._resources = resources;
|
|
88
|
-
this._chunks = opts?.chunks ?? [];
|
|
89
|
-
this._defaultMaxLines = opts?.defaultMaxLines ?? 100;
|
|
90
|
-
this.parameters = {
|
|
91
|
-
type: 'object',
|
|
92
|
-
properties: {
|
|
93
|
-
filename: {
|
|
94
|
-
type: 'string',
|
|
95
|
-
description: 'Filename from search results',
|
|
96
|
-
enum: resources.map(r => r.name),
|
|
97
|
-
},
|
|
98
|
-
startLine: { type: 'number', description: 'Start line (1-indexed, from search results)' },
|
|
99
|
-
endLine: { type: 'number', description: 'End line (1-indexed, from search results)' },
|
|
100
|
-
},
|
|
101
|
-
required: ['filename'],
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
*execute(args, context) {
|
|
105
|
-
const filename = args.filename || args.path || '';
|
|
106
|
-
const file = this._resources.find(r => r.name === filename);
|
|
107
|
-
if (!file) {
|
|
108
|
-
return { error: `File not found: ${filename}. Available: ${this._resources.map(r => r.name).join(', ')}` };
|
|
109
|
-
}
|
|
110
|
-
const lines = file.content.split('\n');
|
|
111
|
-
const s = Math.max(0, (args.startLine ?? 1) - 1);
|
|
112
|
-
const e = Math.min(lines.length, args.endLine ?? Math.min(this._defaultMaxLines, lines.length));
|
|
113
|
-
const key = context ? `${context.agentId}:${filename}` : filename;
|
|
114
|
-
const prev = this._readRanges.get(key) ?? [];
|
|
115
|
-
const unread = subtractRanges([s, e], prev);
|
|
116
|
-
if (unread.length === 0) {
|
|
117
|
-
return { file: file.name, note: `Lines ${s + 1}-${e} already read` };
|
|
118
|
-
}
|
|
119
|
-
this._readRanges.set(key, mergeRanges([...prev, [s, e]]));
|
|
120
|
-
const content = unread
|
|
121
|
-
.map(([a, b]) => lines.slice(a, b).join('\n'))
|
|
122
|
-
.join('\n...\n');
|
|
123
|
-
const result = {
|
|
124
|
-
file: file.name,
|
|
125
|
-
content,
|
|
126
|
-
lines: unread.map(([a, b]) => `${a + 1}-${b}`),
|
|
127
|
-
};
|
|
128
|
-
// Add related sections for corpus navigation
|
|
129
|
-
if (this._chunks.length > 0) {
|
|
130
|
-
result.relatedSections = this._findRelated(filename, s, e);
|
|
131
|
-
}
|
|
132
|
-
return result;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Find related sections: same-file siblings (adjacent in section hierarchy)
|
|
136
|
-
* and cross-file sections with keyword overlap in section paths.
|
|
137
|
-
*/
|
|
138
|
-
_findRelated(filename, readStart, readEnd) {
|
|
139
|
-
// Find the chunk being read
|
|
140
|
-
const currentChunk = this._chunks.find(c => c.resource === filename && c.startLine - 1 <= readStart && c.endLine >= readEnd);
|
|
141
|
-
const currentSection = currentChunk?.section ?? '';
|
|
142
|
-
// Extract the parent path (everything before the last " > ")
|
|
143
|
-
const lastSep = currentSection.lastIndexOf(' > ');
|
|
144
|
-
const parentPath = lastSep >= 0 ? currentSection.slice(0, lastSep) : '';
|
|
145
|
-
// Same-file siblings: chunks in the same file with the same parent path
|
|
146
|
-
const sameFile = this._chunks.filter(c => c.resource === filename
|
|
147
|
-
&& c.section !== currentSection
|
|
148
|
-
&& c.section !== ''
|
|
149
|
-
&& c.startLine !== (currentChunk?.startLine ?? -1)
|
|
150
|
-
&& (parentPath
|
|
151
|
-
? c.section.startsWith(parentPath + ' > ')
|
|
152
|
-
|| c.section === parentPath
|
|
153
|
-
: !c.section.includes(' > ')) // top-level siblings if no parent
|
|
154
|
-
);
|
|
155
|
-
// Cross-file: extract keywords from current heading, find matches in other files
|
|
156
|
-
const keywords = this._extractKeywords(currentChunk?.heading ?? '');
|
|
157
|
-
const crossFile = keywords.length > 0
|
|
158
|
-
? this._chunks.filter(c => c.resource !== filename
|
|
159
|
-
&& c.section !== ''
|
|
160
|
-
&& keywords.some(kw => c.heading.toLowerCase().includes(kw)
|
|
161
|
-
|| c.section.toLowerCase().includes(kw)))
|
|
162
|
-
: [];
|
|
163
|
-
// Combine, dedup, limit
|
|
164
|
-
const seen = new Set();
|
|
165
|
-
const related = [];
|
|
166
|
-
for (const c of [...sameFile, ...crossFile]) {
|
|
167
|
-
const key = `${c.resource}:${c.startLine}`;
|
|
168
|
-
if (seen.has(key))
|
|
169
|
-
continue;
|
|
170
|
-
seen.add(key);
|
|
171
|
-
related.push({
|
|
172
|
-
file: c.resource,
|
|
173
|
-
heading: c.heading,
|
|
174
|
-
section: c.section,
|
|
175
|
-
startLine: c.startLine,
|
|
176
|
-
endLine: c.endLine,
|
|
177
|
-
});
|
|
178
|
-
if (related.length >= 8)
|
|
179
|
-
break;
|
|
180
|
-
}
|
|
181
|
-
return related;
|
|
182
|
-
}
|
|
183
|
-
/** Extract lowercase keywords (3+ chars) from a heading */
|
|
184
|
-
_extractKeywords(heading) {
|
|
185
|
-
return heading
|
|
186
|
-
.toLowerCase()
|
|
187
|
-
.split(/[\s>_\-./]+/)
|
|
188
|
-
.filter(w => w.length >= 3);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
exports.ReadFileTool = ReadFileTool;
|
|
192
|
-
//# sourceMappingURL=read-file.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/search.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import type { Operation } from 'effection';
|
|
2
|
-
import { Tool } from '@lloyal-labs/lloyal-agents';
|
|
3
|
-
import type { JsonSchema, ToolContext } from '@lloyal-labs/lloyal-agents';
|
|
4
|
-
import type { Chunk } from '../resources/types';
|
|
5
|
-
import type { Reranker } from './types';
|
|
6
|
-
/**
|
|
7
|
-
* Semantic search over corpus chunks via a {@link Reranker}
|
|
8
|
-
*
|
|
9
|
-
* Scores all chunks against the query and returns ranked results
|
|
10
|
-
* with file names, headings, scores, and line ranges. Progress is
|
|
11
|
-
* reported through the optional {@link ToolContext.onProgress}
|
|
12
|
-
* callback as the reranker streams intermediate results.
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```typescript
|
|
16
|
-
* const search = new SearchTool(chunks, reranker);
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* @category Rig
|
|
20
|
-
*/
|
|
21
|
-
export declare class SearchTool extends Tool<{
|
|
22
|
-
query: string;
|
|
23
|
-
}> {
|
|
24
|
-
readonly name = "search";
|
|
25
|
-
readonly description = "Search the knowledge base. Returns sections ranked by relevance with line ranges for read_file.";
|
|
26
|
-
readonly parameters: JsonSchema;
|
|
27
|
-
private _chunks;
|
|
28
|
-
private _reranker;
|
|
29
|
-
constructor(chunks: Chunk[], reranker: Reranker);
|
|
30
|
-
execute(args: {
|
|
31
|
-
query: string;
|
|
32
|
-
}, context?: ToolContext): Operation<unknown>;
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=search.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAS,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,SAAS,CAAC;AAErD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,UAAW,SAAQ,IAAI,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;IACrD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,qGAAqG;IACzH,QAAQ,CAAC,UAAU,EAAE,UAAU,CAI7B;IAEF,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,SAAS,CAAW;gBAEhB,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ;IAM9C,OAAO,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC;CAsE7E"}
|
package/dist/tools/search.js
DELETED
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SearchTool = void 0;
|
|
4
|
-
const effection_1 = require("effection");
|
|
5
|
-
const lloyal_agents_1 = require("@lloyal-labs/lloyal-agents");
|
|
6
|
-
/**
|
|
7
|
-
* Semantic search over corpus chunks via a {@link Reranker}
|
|
8
|
-
*
|
|
9
|
-
* Scores all chunks against the query and returns ranked results
|
|
10
|
-
* with file names, headings, scores, and line ranges. Progress is
|
|
11
|
-
* reported through the optional {@link ToolContext.onProgress}
|
|
12
|
-
* callback as the reranker streams intermediate results.
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```typescript
|
|
16
|
-
* const search = new SearchTool(chunks, reranker);
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* @category Rig
|
|
20
|
-
*/
|
|
21
|
-
class SearchTool extends lloyal_agents_1.Tool {
|
|
22
|
-
name = 'search';
|
|
23
|
-
description = 'Search the knowledge base. Returns sections ranked by relevance with line ranges for read_file.';
|
|
24
|
-
parameters = {
|
|
25
|
-
type: 'object',
|
|
26
|
-
properties: { query: { type: 'string', description: 'Search query' } },
|
|
27
|
-
required: ['query'],
|
|
28
|
-
};
|
|
29
|
-
_chunks;
|
|
30
|
-
_reranker;
|
|
31
|
-
constructor(chunks, reranker) {
|
|
32
|
-
super();
|
|
33
|
-
this._chunks = chunks;
|
|
34
|
-
this._reranker = reranker;
|
|
35
|
-
}
|
|
36
|
-
*execute(args, context) {
|
|
37
|
-
const query = args.query?.trim();
|
|
38
|
-
if (!query)
|
|
39
|
-
return { error: 'query must not be empty' };
|
|
40
|
-
const tw = yield* lloyal_agents_1.Trace.expect();
|
|
41
|
-
const reranker = this._reranker;
|
|
42
|
-
const chunks = this._chunks;
|
|
43
|
-
const t0 = performance.now();
|
|
44
|
-
tw.write({
|
|
45
|
-
traceId: tw.nextId(), parentTraceId: null, ts: t0,
|
|
46
|
-
type: 'rerank:start', query, chunkCount: chunks.length,
|
|
47
|
-
});
|
|
48
|
-
let results = yield* (0, effection_1.call)(async () => {
|
|
49
|
-
let last = [];
|
|
50
|
-
for await (const { results, filled, total } of reranker.score(query, chunks)) {
|
|
51
|
-
if (context?.onProgress)
|
|
52
|
-
context.onProgress({ filled, total });
|
|
53
|
-
last = results;
|
|
54
|
-
}
|
|
55
|
-
return last;
|
|
56
|
-
});
|
|
57
|
-
// Explore mode (default): agent-local scoring only. Agents discover
|
|
58
|
-
// bridging content (adjacent sections connecting investigation to answer).
|
|
59
|
-
// Scoring against the original query would demote exactly that content.
|
|
60
|
-
//
|
|
61
|
-
// Exploit mode (!explore): dual scoring via scoreRelevanceBatch —
|
|
62
|
-
// min(toolQueryScore, originalQueryScore) per chunk. Tightens focus
|
|
63
|
-
// when KV headroom is low, at the cost of serendipitous discovery.
|
|
64
|
-
if (!context?.explore && context?.scorer && results.length > 0) {
|
|
65
|
-
const chunkTexts = results.map((sc) => {
|
|
66
|
-
const chunk = chunks.find(c => c.resource === sc.file && c.startLine === sc.startLine);
|
|
67
|
-
return chunk?.text ?? '';
|
|
68
|
-
});
|
|
69
|
-
const combinedScores = yield* (0, effection_1.call)(() => context.scorer.scoreRelevanceBatch(chunkTexts, query));
|
|
70
|
-
const reordered = results
|
|
71
|
-
.map((sc, i) => ({ ...sc, score: combinedScores[i], _toolQueryScore: sc.score }))
|
|
72
|
-
.sort((a, b) => b.score - a.score);
|
|
73
|
-
results = reordered;
|
|
74
|
-
tw.write({
|
|
75
|
-
traceId: tw.nextId(), parentTraceId: null, ts: performance.now(),
|
|
76
|
-
type: 'entailment:content:exploit', tool: 'search',
|
|
77
|
-
pressure: {
|
|
78
|
-
percentAvailable: context.pressurePercentAvailable ?? -1,
|
|
79
|
-
remaining: -1,
|
|
80
|
-
nCtx: -1,
|
|
81
|
-
},
|
|
82
|
-
chunks: reordered.slice(0, 5).map((sc) => ({
|
|
83
|
-
heading: sc.heading,
|
|
84
|
-
toolQueryScore: sc._toolQueryScore,
|
|
85
|
-
combinedScore: sc.score,
|
|
86
|
-
})),
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
tw.write({
|
|
90
|
-
traceId: tw.nextId(), parentTraceId: null, ts: performance.now(),
|
|
91
|
-
type: 'rerank:end',
|
|
92
|
-
topResults: results.slice(0, 5).map(r => ({ file: r.file, heading: r.heading, score: r.score })),
|
|
93
|
-
selectedPassageCount: results.length,
|
|
94
|
-
totalChars: 0,
|
|
95
|
-
durationMs: performance.now() - t0,
|
|
96
|
-
});
|
|
97
|
-
return results;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
exports.SearchTool = SearchTool;
|
|
101
|
-
//# sourceMappingURL=search.js.map
|
package/dist/tools/search.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
|