@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.
Files changed (100) hide show
  1. package/LICENSE +107 -0
  2. package/LICENSE-FAQ.md +256 -0
  3. package/README.md +93 -74
  4. package/dist/bundle.d.ts +211 -0
  5. package/dist/bundle.d.ts.map +1 -0
  6. package/dist/bundle.js +296 -0
  7. package/dist/bundle.js.map +1 -0
  8. package/dist/cancellable-fetch.d.ts +98 -0
  9. package/dist/cancellable-fetch.d.ts.map +1 -0
  10. package/dist/cancellable-fetch.js +133 -0
  11. package/dist/cancellable-fetch.js.map +1 -0
  12. package/dist/config-store.d.ts +30 -0
  13. package/dist/config-store.d.ts.map +1 -0
  14. package/dist/config-store.js +45 -0
  15. package/dist/config-store.js.map +1 -0
  16. package/dist/define-app.d.ts +98 -0
  17. package/dist/define-app.d.ts.map +1 -0
  18. package/dist/define-app.js +232 -0
  19. package/dist/define-app.js.map +1 -0
  20. package/dist/grant-store.d.ts +31 -0
  21. package/dist/grant-store.d.ts.map +1 -0
  22. package/dist/grant-store.js +49 -0
  23. package/dist/grant-store.js.map +1 -0
  24. package/dist/index.d.ts +13 -6
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +37 -11
  27. package/dist/index.js.map +1 -1
  28. package/dist/node.d.ts +3 -2
  29. package/dist/node.d.ts.map +1 -1
  30. package/dist/node.js +3 -2
  31. package/dist/node.js.map +1 -1
  32. package/dist/protocol.d.ts +155 -0
  33. package/dist/protocol.d.ts.map +1 -0
  34. package/dist/protocol.js +184 -0
  35. package/dist/protocol.js.map +1 -0
  36. package/dist/registry.d.ts +87 -0
  37. package/dist/registry.d.ts.map +1 -0
  38. package/dist/registry.js +245 -0
  39. package/dist/registry.js.map +1 -0
  40. package/dist/reranker.d.ts +25 -7
  41. package/dist/reranker.d.ts.map +1 -1
  42. package/dist/reranker.js +103 -63
  43. package/dist/reranker.js.map +1 -1
  44. package/dist/resources/types.d.ts +10 -37
  45. package/dist/resources/types.d.ts.map +1 -1
  46. package/dist/resources/types.js +12 -0
  47. package/dist/resources/types.js.map +1 -1
  48. package/dist/spine-render.d.ts +97 -0
  49. package/dist/spine-render.d.ts.map +1 -0
  50. package/dist/spine-render.js +121 -0
  51. package/dist/spine-render.js.map +1 -0
  52. package/dist/tools/index.d.ts +26 -22
  53. package/dist/tools/index.d.ts.map +1 -1
  54. package/dist/tools/index.js +24 -28
  55. package/dist/tools/index.js.map +1 -1
  56. package/dist/tools/keyless-search.d.ts +67 -0
  57. package/dist/tools/keyless-search.d.ts.map +1 -0
  58. package/dist/tools/keyless-search.js +401 -0
  59. package/dist/tools/keyless-search.js.map +1 -0
  60. package/dist/tools/plan.d.ts +31 -4
  61. package/dist/tools/plan.d.ts.map +1 -1
  62. package/dist/tools/plan.js +46 -11
  63. package/dist/tools/plan.js.map +1 -1
  64. package/dist/tools/types.d.ts +12 -56
  65. package/dist/tools/types.d.ts.map +1 -1
  66. package/dist/tools/types.js +17 -0
  67. package/dist/tools/types.js.map +1 -1
  68. package/dist/tools/web-search.d.ts +9 -25
  69. package/dist/tools/web-search.d.ts.map +1 -1
  70. package/dist/tools/web-search.js +11 -119
  71. package/dist/tools/web-search.js.map +1 -1
  72. package/package.json +10 -7
  73. package/dist/sources/corpus.d.ts +0 -80
  74. package/dist/sources/corpus.d.ts.map +0 -1
  75. package/dist/sources/corpus.js +0 -100
  76. package/dist/sources/corpus.js.map +0 -1
  77. package/dist/sources/index.d.ts +0 -12
  78. package/dist/sources/index.d.ts.map +0 -1
  79. package/dist/sources/index.js +0 -14
  80. package/dist/sources/index.js.map +0 -1
  81. package/dist/sources/web.d.ts +0 -67
  82. package/dist/sources/web.d.ts.map +0 -1
  83. package/dist/sources/web.js +0 -104
  84. package/dist/sources/web.js.map +0 -1
  85. package/dist/tools/fetch-page.d.ts +0 -48
  86. package/dist/tools/fetch-page.d.ts.map +0 -1
  87. package/dist/tools/fetch-page.js +0 -309
  88. package/dist/tools/fetch-page.js.map +0 -1
  89. package/dist/tools/grep.d.ts +0 -35
  90. package/dist/tools/grep.d.ts.map +0 -1
  91. package/dist/tools/grep.js +0 -84
  92. package/dist/tools/grep.js.map +0 -1
  93. package/dist/tools/read-file.d.ts +0 -74
  94. package/dist/tools/read-file.d.ts.map +0 -1
  95. package/dist/tools/read-file.js +0 -192
  96. package/dist/tools/read-file.js.map +0 -1
  97. package/dist/tools/search.d.ts +0 -34
  98. package/dist/tools/search.d.ts.map +0 -1
  99. package/dist/tools/search.js +0 -101
  100. package/dist/tools/search.js.map +0 -1
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -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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"}
@@ -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"}
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}