@multiplayer-app/agent 0.0.7 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +15 -16
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +43 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +73 -11
- package/dist/config.js.map +1 -1
- package/dist/git-sync.d.ts +22 -0
- package/dist/git-sync.d.ts.map +1 -0
- package/dist/git-sync.js +107 -0
- package/dist/git-sync.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -1
- package/dist/index.js.map +1 -1
- package/dist/lambda-microvm-entrypoint.js +74 -39
- package/dist/lambda-microvm-entrypoint.js.map +1 -1
- package/dist/link.d.ts +16 -0
- package/dist/link.d.ts.map +1 -0
- package/dist/link.js +76 -0
- package/dist/link.js.map +1 -0
- package/dist/loop.d.ts.map +1 -1
- package/dist/loop.js +8 -6
- package/dist/loop.js.map +1 -1
- package/dist/mcp/mcp-connection.js +1 -1
- package/dist/mcp/mcp-connection.js.map +1 -1
- package/dist/mcp/mcp-tools.js +1 -1
- package/dist/mcp/mcp-tools.js.map +1 -1
- package/dist/model.d.ts +4 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +20 -0
- package/dist/model.js.map +1 -0
- package/dist/protocol.d.ts +174 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +95 -0
- package/dist/protocol.js.map +1 -0
- package/dist/protocol.test.d.ts +2 -0
- package/dist/protocol.test.d.ts.map +1 -0
- package/dist/protocol.test.js +25 -0
- package/dist/protocol.test.js.map +1 -0
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +22 -44
- package/dist/report.js.map +1 -1
- package/dist/research/filingramp-client.d.ts +28 -0
- package/dist/research/filingramp-client.d.ts.map +1 -0
- package/dist/research/filingramp-client.js +124 -0
- package/dist/research/filingramp-client.js.map +1 -0
- package/dist/research/filingramp-tools.d.ts +10 -0
- package/dist/research/filingramp-tools.d.ts.map +1 -0
- package/dist/research/filingramp-tools.js +447 -0
- package/dist/research/filingramp-tools.js.map +1 -0
- package/dist/research/prompt.d.ts +13 -0
- package/dist/research/prompt.d.ts.map +1 -0
- package/dist/research/prompt.js +40 -0
- package/dist/research/prompt.js.map +1 -0
- package/dist/research/scope.d.ts +24 -0
- package/dist/research/scope.d.ts.map +1 -0
- package/dist/research/scope.js +103 -0
- package/dist/research/scope.js.map +1 -0
- package/dist/research/scope.test.d.ts +2 -0
- package/dist/research/scope.test.d.ts.map +1 -0
- package/dist/research/scope.test.js +45 -0
- package/dist/research/scope.test.js.map +1 -0
- package/dist/runtime.d.ts +10 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +35 -0
- package/dist/runtime.js.map +1 -0
- package/dist/session.d.ts +38 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +427 -0
- package/dist/session.js.map +1 -0
- package/dist/tools/fs-tools.js +1 -1
- package/dist/tools/fs-tools.js.map +1 -1
- package/package.json +8 -2
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createFilingRampTools = createFilingRampTools;
|
|
7
|
+
// FilingRamp tools for the research profile. Design rule: token cost first. Every tool
|
|
8
|
+
// returns a lean projection and writes anything bulky (document text, downloaded files,
|
|
9
|
+
// full result pages) to the workspace, where grep / DuckDB / Python work on it for free.
|
|
10
|
+
// The session scope (scope.ts) is applied server-side here, before the model's own filters.
|
|
11
|
+
const child_process_1 = require("child_process");
|
|
12
|
+
const fs_1 = require("fs");
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
const util_1 = require("util");
|
|
15
|
+
const ai_1 = require("ai");
|
|
16
|
+
const zod_1 = require("zod");
|
|
17
|
+
const scope_1 = require("./scope");
|
|
18
|
+
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
19
|
+
const DEFAULT_FILING_FIELDS = [
|
|
20
|
+
'_id',
|
|
21
|
+
'trackingNumber',
|
|
22
|
+
'state',
|
|
23
|
+
'statusId',
|
|
24
|
+
'status',
|
|
25
|
+
'filingType',
|
|
26
|
+
'typeOfInsurance',
|
|
27
|
+
'subTypeOfInsurance',
|
|
28
|
+
'dateSubmitted',
|
|
29
|
+
'product',
|
|
30
|
+
'project',
|
|
31
|
+
];
|
|
32
|
+
const MAX_PAGE = 200;
|
|
33
|
+
const MAX_DOC_HITS = 100;
|
|
34
|
+
const MAX_HIGHLIGHTS = 3;
|
|
35
|
+
const MAX_INLINE_TEXT_CHARS = 4000;
|
|
36
|
+
const filterSchema = zod_1.z.object({
|
|
37
|
+
field: zod_1.z.string().min(1).max(100),
|
|
38
|
+
comparisonOperator: zod_1.z.enum(['cn', 'in', 'eq', 'gt', 'gte', 'lt', 'lte', 'ex']),
|
|
39
|
+
value: zod_1.z.unknown(),
|
|
40
|
+
});
|
|
41
|
+
const searchTypeSchema = zod_1.z.enum(['ACCOUNT', 'INDUSTRY']).optional().describe('Defaults to the session scope. INDUSTRY needs the industry-data entitlement.');
|
|
42
|
+
function safeName(value) {
|
|
43
|
+
return value.replace(/[^A-Za-z0-9._-]+/g, '_').replace(/^_+|_+$/g, '').slice(0, 120) || 'item';
|
|
44
|
+
}
|
|
45
|
+
function pick(record, fields) {
|
|
46
|
+
const out = {};
|
|
47
|
+
for (const field of fields) {
|
|
48
|
+
if (record[field] !== undefined)
|
|
49
|
+
out[field] = record[field];
|
|
50
|
+
}
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
function asRecordList(payload) {
|
|
54
|
+
if (Array.isArray(payload))
|
|
55
|
+
return payload;
|
|
56
|
+
if (payload && typeof payload === 'object' && Array.isArray(payload.items)) {
|
|
57
|
+
return payload.items;
|
|
58
|
+
}
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
async function writeWorkspaceFile(workspaceDir, relativePath, content) {
|
|
62
|
+
const target = path_1.default.resolve(workspaceDir, relativePath);
|
|
63
|
+
if (!target.startsWith(path_1.default.resolve(workspaceDir) + path_1.default.sep))
|
|
64
|
+
throw new Error(`path escapes the workspace: ${relativePath}`);
|
|
65
|
+
await fs_1.promises.mkdir(path_1.default.dirname(target), { recursive: true });
|
|
66
|
+
const buffer = typeof content === 'string' ? Buffer.from(content, 'utf8') : content;
|
|
67
|
+
await fs_1.promises.writeFile(target, buffer);
|
|
68
|
+
return { path: relativePath, bytes: buffer.byteLength };
|
|
69
|
+
}
|
|
70
|
+
/** PDF → text with whatever the image has (mupdf first, poppler second). Empty text = scanned or protected. */
|
|
71
|
+
async function extractPdfText(file, output) {
|
|
72
|
+
const attempts = [
|
|
73
|
+
['mutool', ['draw', '-F', 'txt', '-o', output, file]],
|
|
74
|
+
['pdftotext', ['-layout', file, output]],
|
|
75
|
+
];
|
|
76
|
+
for (const [bin, args] of attempts) {
|
|
77
|
+
try {
|
|
78
|
+
await execFileAsync(bin, args, { timeout: 120000 });
|
|
79
|
+
const stat = await fs_1.promises.stat(output);
|
|
80
|
+
return stat.size;
|
|
81
|
+
}
|
|
82
|
+
catch (_b) {
|
|
83
|
+
/* try the next extractor */
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return 0;
|
|
87
|
+
}
|
|
88
|
+
/** Walks a filing record and lists every attachment with where it sits in the filing. */
|
|
89
|
+
function collectAttachments(filing) {
|
|
90
|
+
var _b, _c;
|
|
91
|
+
const out = [];
|
|
92
|
+
const sections = [
|
|
93
|
+
['forms', 'formNumber'],
|
|
94
|
+
['rates', 'name'],
|
|
95
|
+
['supportings', 'name'],
|
|
96
|
+
['dispositions', 'status'],
|
|
97
|
+
];
|
|
98
|
+
for (const [section, labelField] of sections) {
|
|
99
|
+
const items = filing[section];
|
|
100
|
+
if (!Array.isArray(items))
|
|
101
|
+
continue;
|
|
102
|
+
for (const item of items) {
|
|
103
|
+
const attachments = Array.isArray(item.attachments) ? item.attachments : [];
|
|
104
|
+
for (const attachment of attachments) {
|
|
105
|
+
out.push({
|
|
106
|
+
section,
|
|
107
|
+
item: (_c = (_b = item[labelField]) !== null && _b !== void 0 ? _b : item.name) !== null && _c !== void 0 ? _c : item.title,
|
|
108
|
+
itemId: item._id,
|
|
109
|
+
action: item.action,
|
|
110
|
+
key: attachment.key,
|
|
111
|
+
name: attachment.name,
|
|
112
|
+
type: attachment.type,
|
|
113
|
+
size: attachment.size,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const objections = Array.isArray(filing.objections) ? filing.objections : [];
|
|
119
|
+
for (const letter of objections) {
|
|
120
|
+
for (const attachment of Array.isArray(letter.attachments) ? letter.attachments : []) {
|
|
121
|
+
out.push({ section: 'objections', item: letter.letterDate, key: attachment.key, name: attachment.name, size: attachment.size });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
function createFilingRampTools(options) {
|
|
127
|
+
const { client, workspaceDir, scope } = options;
|
|
128
|
+
const industryData = client.industryData;
|
|
129
|
+
const searchFilings = (0, ai_1.tool)({
|
|
130
|
+
description: 'List filings matching filters (account filings by default). Lean rows: pass `fields` for exactly what you need. Page with lastItemId (sortKey "_id") until a page is shorter than limit. For counts or breakdowns use count_filings / summarize_filings instead — never page to count.',
|
|
131
|
+
inputSchema: zod_1.z.object({
|
|
132
|
+
text: zod_1.z.string().max(500).optional().describe('Free-text match over filing metadata'),
|
|
133
|
+
filters: zod_1.z.array(filterSchema).max(30).optional(),
|
|
134
|
+
fields: zod_1.z.array(zod_1.z.string().max(100)).max(40).optional().describe(`Filing fields to return; default ${DEFAULT_FILING_FIELDS.join(', ')}`),
|
|
135
|
+
limit: zod_1.z.number().int().min(1).max(MAX_PAGE).optional(),
|
|
136
|
+
lastItemId: zod_1.z.string().optional(),
|
|
137
|
+
lastItemSortValue: zod_1.z.union([zod_1.z.string(), zod_1.z.number()]).optional(),
|
|
138
|
+
sortKey: zod_1.z.string().max(60).optional(),
|
|
139
|
+
sortDirection: zod_1.z.union([zod_1.z.literal(1), zod_1.z.literal(-1)]).optional(),
|
|
140
|
+
searchType: searchTypeSchema,
|
|
141
|
+
saveAs: zod_1.z.string().max(200).optional().describe('Also write the full page as JSON to this workspace path (e.g. data/filings/page-1.json)'),
|
|
142
|
+
}),
|
|
143
|
+
execute: async (input) => {
|
|
144
|
+
var _b, _c, _d, _e, _f, _g;
|
|
145
|
+
const searchType = (0, scope_1.resolveSearchType)(scope, industryData, input.searchType);
|
|
146
|
+
const filters = (0, scope_1.scopeFilingsFilters)(scope, input.filters);
|
|
147
|
+
const fields = ((_b = input.fields) === null || _b === void 0 ? void 0 : _b.length) ? [...new Set(['_id', ...input.fields])] : DEFAULT_FILING_FIELDS;
|
|
148
|
+
const limit = (_c = input.limit) !== null && _c !== void 0 ? _c : 100;
|
|
149
|
+
let items;
|
|
150
|
+
if (searchType === 'INDUSTRY') {
|
|
151
|
+
// v2 has no industry search; v1 pages by offset. lastItemSortValue carries the offset here.
|
|
152
|
+
const offset = typeof input.lastItemSortValue === 'number' ? input.lastItemSortValue : 0;
|
|
153
|
+
const payload = await client.request('/v1/search/filings', {
|
|
154
|
+
method: 'POST',
|
|
155
|
+
body: { text: input.text, filters, limit, offset, searchType, sortKey: (_d = input.sortKey) !== null && _d !== void 0 ? _d : '_id', sortDirection: (_e = input.sortDirection) !== null && _e !== void 0 ? _e : 1 },
|
|
156
|
+
});
|
|
157
|
+
items = asRecordList(payload);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
const payload = await client.request('/v2/search/filings', {
|
|
161
|
+
method: 'POST',
|
|
162
|
+
body: {
|
|
163
|
+
text: input.text,
|
|
164
|
+
filters,
|
|
165
|
+
fields,
|
|
166
|
+
limit,
|
|
167
|
+
lastItemId: input.lastItemId,
|
|
168
|
+
lastItemSortValue: input.lastItemSortValue,
|
|
169
|
+
sortKey: (_f = input.sortKey) !== null && _f !== void 0 ? _f : '_id',
|
|
170
|
+
sortDirection: (_g = input.sortDirection) !== null && _g !== void 0 ? _g : 1,
|
|
171
|
+
searchType,
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
items = asRecordList(payload);
|
|
175
|
+
}
|
|
176
|
+
const saved = input.saveAs ? await writeWorkspaceFile(workspaceDir, input.saveAs, JSON.stringify(items, null, 2)) : undefined;
|
|
177
|
+
const rows = items.map((item) => pick(item, fields));
|
|
178
|
+
const last = items[items.length - 1];
|
|
179
|
+
return {
|
|
180
|
+
count: rows.length,
|
|
181
|
+
items: rows,
|
|
182
|
+
nextLastItemId: rows.length === limit ? last === null || last === void 0 ? void 0 : last._id : undefined,
|
|
183
|
+
nextOffset: searchType === 'INDUSTRY' && rows.length === limit ? ((typeof input.lastItemSortValue === 'number' ? input.lastItemSortValue : 0) + limit) : undefined,
|
|
184
|
+
appliedFilters: filters,
|
|
185
|
+
saved,
|
|
186
|
+
};
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
const countFilings = (0, ai_1.tool)({
|
|
190
|
+
description: 'One total count of filings matching filters. For counts per state, line or status use summarize_filings.',
|
|
191
|
+
inputSchema: zod_1.z.object({
|
|
192
|
+
text: zod_1.z.string().max(500).optional(),
|
|
193
|
+
filters: zod_1.z.array(filterSchema).max(30).optional(),
|
|
194
|
+
searchType: searchTypeSchema,
|
|
195
|
+
}),
|
|
196
|
+
execute: async (input) => {
|
|
197
|
+
var _b;
|
|
198
|
+
const searchType = (0, scope_1.resolveSearchType)(scope, industryData, input.searchType);
|
|
199
|
+
const filters = (0, scope_1.scopeFilingsFilters)(scope, input.filters);
|
|
200
|
+
const payload = await client.request('/v2/search/filings/count', {
|
|
201
|
+
method: 'POST',
|
|
202
|
+
body: { text: input.text, filters, searchType },
|
|
203
|
+
});
|
|
204
|
+
return { count: (_b = payload === null || payload === void 0 ? void 0 : payload.count) !== null && _b !== void 0 ? _b : 0, appliedFilters: filters };
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
const summarizeFilings = (0, ai_1.tool)({
|
|
208
|
+
description: 'Counts and totals per group (state, filingType, statusId, typeOfInsurance, subTypeOfInsurance, company, submittedMonth, dispositionMonth, source, businessType). Use this to size a population before reading documents, and for rankings or trends. Never page search_filings to count.',
|
|
209
|
+
inputSchema: zod_1.z.object({
|
|
210
|
+
text: zod_1.z.string().max(500).optional(),
|
|
211
|
+
filters: zod_1.z.array(filterSchema).max(30).optional(),
|
|
212
|
+
groupBy: zod_1.z.array(zod_1.z.string().max(40)).max(4).optional(),
|
|
213
|
+
limit: zod_1.z.number().int().min(1).max(50000).optional(),
|
|
214
|
+
sortBy: zod_1.z.enum(['key', 'filings']).optional(),
|
|
215
|
+
searchType: searchTypeSchema,
|
|
216
|
+
saveAs: zod_1.z.string().max(200).optional().describe('Write the full summary rows as JSON to this workspace path'),
|
|
217
|
+
}),
|
|
218
|
+
execute: async (input) => {
|
|
219
|
+
var _b, _c;
|
|
220
|
+
const searchType = (0, scope_1.resolveSearchType)(scope, industryData, input.searchType);
|
|
221
|
+
const filters = (0, scope_1.scopeFilingsFilters)(scope, input.filters);
|
|
222
|
+
const payload = await client.request('/v2/search/filings/summary', {
|
|
223
|
+
method: 'POST',
|
|
224
|
+
body: { text: input.text, filters, groupBy: input.groupBy, limit: input.limit, sortBy: input.sortBy, searchType },
|
|
225
|
+
});
|
|
226
|
+
const items = (_b = payload === null || payload === void 0 ? void 0 : payload.items) !== null && _b !== void 0 ? _b : [];
|
|
227
|
+
const saved = input.saveAs ? await writeWorkspaceFile(workspaceDir, input.saveAs, JSON.stringify(items, null, 2)) : undefined;
|
|
228
|
+
// Rows carry per-status day sums the model rarely needs; keep the counts.
|
|
229
|
+
const rows = items.slice(0, 200).map((row) => ({
|
|
230
|
+
key: row.key,
|
|
231
|
+
filings: row.filings,
|
|
232
|
+
filingsWithObjections: row.filingsWithObjections,
|
|
233
|
+
filingsWithForms: row.filingsWithForms,
|
|
234
|
+
objectionLetters: row.objectionLetters,
|
|
235
|
+
forms: row.forms,
|
|
236
|
+
rates: row.rates,
|
|
237
|
+
statusIds: row.statusIds && typeof row.statusIds === 'object'
|
|
238
|
+
? Object.fromEntries(Object.entries(row.statusIds).map(([k, v]) => { var _b; return [k, (_b = v === null || v === void 0 ? void 0 : v.filings) !== null && _b !== void 0 ? _b : 0]; }))
|
|
239
|
+
: undefined,
|
|
240
|
+
}));
|
|
241
|
+
return { rows, totalRows: items.length, truncated: (_c = payload === null || payload === void 0 ? void 0 : payload.truncated) !== null && _c !== void 0 ? _c : false, appliedFilters: filters, saved };
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
const getFiling = (0, ai_1.tool)({
|
|
245
|
+
description: 'One filing in full: general information, forms, rates, supporting documents, objection letters, dispositions and every attachment (with the `key` download_attachment needs). Large: ask for `include` sections only when you need them.',
|
|
246
|
+
inputSchema: zod_1.z.object({
|
|
247
|
+
id: zod_1.z.string().min(1).max(100).describe('Filing _id or SERFF tracking number'),
|
|
248
|
+
include: zod_1.z.array(zod_1.z.enum(['general', 'forms', 'rates', 'supportings', 'objections', 'dispositions', 'attachments'])).optional(),
|
|
249
|
+
saveAs: zod_1.z.string().max(200).optional().describe('Write the full filing JSON to this workspace path'),
|
|
250
|
+
}),
|
|
251
|
+
execute: async (input) => {
|
|
252
|
+
var _b;
|
|
253
|
+
const filing = await client.request(`/v1/filings/${encodeURIComponent(input.id)}`);
|
|
254
|
+
const saved = input.saveAs ? await writeWorkspaceFile(workspaceDir, input.saveAs, JSON.stringify(filing, null, 2)) : undefined;
|
|
255
|
+
const include = new Set((_b = input.include) !== null && _b !== void 0 ? _b : ['general', 'attachments']);
|
|
256
|
+
const out = {
|
|
257
|
+
_id: filing._id,
|
|
258
|
+
trackingNumber: filing.trackingNumber,
|
|
259
|
+
state: filing.state,
|
|
260
|
+
statusId: filing.statusId,
|
|
261
|
+
status: filing.status,
|
|
262
|
+
filingType: filing.filingType,
|
|
263
|
+
typeOfInsurance: filing.typeOfInsurance,
|
|
264
|
+
subTypeOfInsurance: filing.subTypeOfInsurance,
|
|
265
|
+
dateSubmitted: filing.dateSubmitted,
|
|
266
|
+
companyNames: Array.isArray(filing.companies) ? filing.companies.map((c) => c.name) : undefined,
|
|
267
|
+
};
|
|
268
|
+
if (include.has('general'))
|
|
269
|
+
out.generalInformation = filing.generalInformation;
|
|
270
|
+
for (const section of ['forms', 'rates', 'supportings', 'objections', 'dispositions']) {
|
|
271
|
+
if (!include.has(section))
|
|
272
|
+
continue;
|
|
273
|
+
const items = Array.isArray(filing[section]) ? filing[section] : [];
|
|
274
|
+
out[section] = items.map((item) => {
|
|
275
|
+
const { attachments: _a, ...rest } = item;
|
|
276
|
+
return rest;
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
if (include.has('attachments'))
|
|
280
|
+
out.attachments = collectAttachments(filing);
|
|
281
|
+
return { filing: out, saved };
|
|
282
|
+
},
|
|
283
|
+
});
|
|
284
|
+
const searchDocuments = (0, ai_1.tool)({
|
|
285
|
+
description: 'Full-text or semantic search INSIDE documents (extracted PDF text of forms, rate and supporting documents, objection letters, responses, library forms, circulars). This is how you find which filings contain a clause. Returns hits with highlights; set saveText=true to write each hit\'s full extracted text to data/text/<trackingNumber>/<name>.txt for grep and analysis — never read whole documents into the chat.',
|
|
286
|
+
inputSchema: zod_1.z.object({
|
|
287
|
+
query: zod_1.z.string().min(1).max(2000),
|
|
288
|
+
searchType: zod_1.z.enum(['KEYWORD', 'SEMANTIC', 'HYBRID']).optional().describe('KEYWORD for exact phrases (default), SEMANTIC for meaning, HYBRID for both'),
|
|
289
|
+
indexes: zod_1.z
|
|
290
|
+
.array(zod_1.z.enum(['filings', 'objections', 'responses', 'library_forms', 'library_rates', 'circulars']))
|
|
291
|
+
.min(1)
|
|
292
|
+
.optional()
|
|
293
|
+
.describe('Which document collections; default ["filings"]'),
|
|
294
|
+
matchMode: zod_1.z.enum(['EXACT', 'ANY_WORD', 'PROXIMITY']).optional(),
|
|
295
|
+
filters: zod_1.z.array(filterSchema).max(20).optional().describe('OpenSearch filters: states, filingTypes, typeOfInsurance, subTypeOfInsurance, dateSubmitted, productIds, projectIds, authors…'),
|
|
296
|
+
scope: zod_1.z.enum(['ACCOUNT', 'INDUSTRY']).optional(),
|
|
297
|
+
limit: zod_1.z.number().int().min(1).max(1000).optional(),
|
|
298
|
+
saveText: zod_1.z.boolean().optional(),
|
|
299
|
+
}),
|
|
300
|
+
execute: async (input) => {
|
|
301
|
+
var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
|
|
302
|
+
const searchType = (_b = input.searchType) !== null && _b !== void 0 ? _b : 'KEYWORD';
|
|
303
|
+
const suffix = searchType === 'KEYWORD' ? 'keyword_index' : 'semantic_index';
|
|
304
|
+
const indexNames = ((_c = input.indexes) !== null && _c !== void 0 ? _c : ['filings']).map((name) => `${name}_${suffix}`);
|
|
305
|
+
const scopeValue = (0, scope_1.resolveSearchType)(scope, industryData, input.scope);
|
|
306
|
+
const filters = (0, scope_1.scopeDocumentFilters)(scope, input.filters);
|
|
307
|
+
const hits = await client.request('/v1/search/global', {
|
|
308
|
+
method: 'POST',
|
|
309
|
+
body: {
|
|
310
|
+
searchType,
|
|
311
|
+
searchText: input.query,
|
|
312
|
+
matchMode: (_d = input.matchMode) !== null && _d !== void 0 ? _d : (searchType === 'KEYWORD' ? 'EXACT' : 'ANY_WORD'),
|
|
313
|
+
indexNames,
|
|
314
|
+
scope: scopeValue,
|
|
315
|
+
limit: (_e = input.limit) !== null && _e !== void 0 ? _e : 50,
|
|
316
|
+
filters,
|
|
317
|
+
},
|
|
318
|
+
timeoutMs: 120000,
|
|
319
|
+
});
|
|
320
|
+
const list = Array.isArray(hits) ? hits : asRecordList(hits);
|
|
321
|
+
const results = [];
|
|
322
|
+
for (const hit of list.slice(0, MAX_DOC_HITS)) {
|
|
323
|
+
const source = ((_f = hit._source) !== null && _f !== void 0 ? _f : {});
|
|
324
|
+
const highlight = ((_g = hit.highlight) !== null && _g !== void 0 ? _g : {});
|
|
325
|
+
const fragments = Object.values(highlight).flat().slice(0, MAX_HIGHLIGHTS);
|
|
326
|
+
const text = typeof source.attachmentText === 'string' ? source.attachmentText : undefined;
|
|
327
|
+
const trackingNumber = String((_l = (_k = (_j = (_h = source.trackingNumber) !== null && _h !== void 0 ? _h : source.filingTrackingNumber) !== null && _j !== void 0 ? _j : source.resourceId) !== null && _k !== void 0 ? _k : hit._id) !== null && _l !== void 0 ? _l : 'unknown');
|
|
328
|
+
const name = String((_r = (_q = (_p = (_o = (_m = source.name) !== null && _m !== void 0 ? _m : source.attachmentName) !== null && _o !== void 0 ? _o : source.formNumber) !== null && _p !== void 0 ? _p : source.title) !== null && _q !== void 0 ? _q : hit._id) !== null && _r !== void 0 ? _r : 'document');
|
|
329
|
+
let textPath;
|
|
330
|
+
if (input.saveText && text) {
|
|
331
|
+
textPath = `data/text/${safeName(trackingNumber)}/${safeName(name)}.txt`;
|
|
332
|
+
await writeWorkspaceFile(workspaceDir, textPath, text);
|
|
333
|
+
}
|
|
334
|
+
results.push({
|
|
335
|
+
id: hit._id,
|
|
336
|
+
index: hit._index,
|
|
337
|
+
score: hit._score,
|
|
338
|
+
resourceType: source.resourceType,
|
|
339
|
+
trackingNumber,
|
|
340
|
+
state: source.state,
|
|
341
|
+
filingType: source.filingType,
|
|
342
|
+
dateSubmitted: source.dateSubmitted,
|
|
343
|
+
name,
|
|
344
|
+
formNumber: source.formNumber,
|
|
345
|
+
attachmentKey: (_s = source.key) !== null && _s !== void 0 ? _s : source.attachmentKey,
|
|
346
|
+
textChars: (_t = text === null || text === void 0 ? void 0 : text.length) !== null && _t !== void 0 ? _t : 0,
|
|
347
|
+
textPath,
|
|
348
|
+
highlights: fragments.map((fragment) => fragment.replace(/<\/?em>/g, '**').slice(0, 300)),
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
return { hits: results, total: list.length, truncated: list.length > MAX_DOC_HITS, indexNames, appliedFilters: filters };
|
|
352
|
+
},
|
|
353
|
+
});
|
|
354
|
+
const downloadAttachment = (0, ai_1.tool)({
|
|
355
|
+
description: 'Download one attachment by key into data/attachments/<trackingNumber>/<name> and, for PDFs, extract its text to data/text/<trackingNumber>/<name>.txt. Use when search_documents has no text for a document (large or scanned PDFs) or you need the original file. Returns paths and sizes, never the content.',
|
|
356
|
+
inputSchema: zod_1.z.object({
|
|
357
|
+
key: zod_1.z.string().min(1).max(2000),
|
|
358
|
+
trackingNumber: zod_1.z.string().max(100).optional(),
|
|
359
|
+
name: zod_1.z.string().max(300).optional(),
|
|
360
|
+
extractText: zod_1.z.boolean().optional().describe('default true for PDFs'),
|
|
361
|
+
}),
|
|
362
|
+
execute: async (input) => {
|
|
363
|
+
var _b, _c, _d;
|
|
364
|
+
const bytes = await client.downloadAttachment(input.key);
|
|
365
|
+
const folder = safeName((_b = input.trackingNumber) !== null && _b !== void 0 ? _b : 'misc');
|
|
366
|
+
const fileName = safeName((_d = (_c = input.name) !== null && _c !== void 0 ? _c : input.key.split('/').pop()) !== null && _d !== void 0 ? _d : 'attachment');
|
|
367
|
+
const filePath = `data/attachments/${folder}/${fileName}`;
|
|
368
|
+
const written = await writeWorkspaceFile(workspaceDir, filePath, bytes);
|
|
369
|
+
const isPdf = /\.pdf$/i.test(fileName) || bytes.subarray(0, 4).toString() === '%PDF';
|
|
370
|
+
let textPath;
|
|
371
|
+
let textChars = 0;
|
|
372
|
+
if (isPdf && input.extractText !== false) {
|
|
373
|
+
textPath = `data/text/${folder}/${fileName.replace(/\.pdf$/i, '')}.txt`;
|
|
374
|
+
const absoluteText = path_1.default.resolve(workspaceDir, textPath);
|
|
375
|
+
await fs_1.promises.mkdir(path_1.default.dirname(absoluteText), { recursive: true });
|
|
376
|
+
textChars = await extractPdfText(path_1.default.resolve(workspaceDir, filePath), absoluteText);
|
|
377
|
+
if (textChars === 0)
|
|
378
|
+
textPath = undefined;
|
|
379
|
+
}
|
|
380
|
+
return {
|
|
381
|
+
path: written.path,
|
|
382
|
+
bytes: written.bytes,
|
|
383
|
+
textPath,
|
|
384
|
+
textChars,
|
|
385
|
+
note: isPdf && textChars === 0 ? 'No extractable text (scanned or protected PDF) — record it as unreadable in findings.' : undefined,
|
|
386
|
+
};
|
|
387
|
+
},
|
|
388
|
+
});
|
|
389
|
+
const searchObjections = (0, ai_1.tool)({
|
|
390
|
+
description: 'Objection letters on account filings, open or closed, with their respond-by dates. Account data only.',
|
|
391
|
+
inputSchema: zod_1.z.object({
|
|
392
|
+
type: zod_1.z.enum(['OPEN', 'CLOSED']),
|
|
393
|
+
filters: zod_1.z.array(filterSchema).max(20).optional(),
|
|
394
|
+
limit: zod_1.z.number().int().min(1).max(MAX_PAGE).optional(),
|
|
395
|
+
offset: zod_1.z.number().int().min(0).optional(),
|
|
396
|
+
sortKey: zod_1.z.enum(['filingType', 'objection.letterDate', 'objection.respondByDate']).optional(),
|
|
397
|
+
sortDirection: zod_1.z.union([zod_1.z.literal(1), zod_1.z.literal(-1)]).optional(),
|
|
398
|
+
}),
|
|
399
|
+
execute: async (input) => {
|
|
400
|
+
var _b, _c, _d, _e, _f;
|
|
401
|
+
const filters = (0, scope_1.scopeFilingsFilters)(scope, input.filters);
|
|
402
|
+
const payload = await client.request('/v2/search/filings/objections', {
|
|
403
|
+
method: 'POST',
|
|
404
|
+
query: { type: input.type },
|
|
405
|
+
body: { filters, limit: (_b = input.limit) !== null && _b !== void 0 ? _b : 50, offset: (_c = input.offset) !== null && _c !== void 0 ? _c : 0, sortKey: input.sortKey, sortDirection: (_d = input.sortDirection) !== null && _d !== void 0 ? _d : -1 },
|
|
406
|
+
});
|
|
407
|
+
return { count: (_e = payload === null || payload === void 0 ? void 0 : payload.count) !== null && _e !== void 0 ? _e : 0, items: (_f = payload === null || payload === void 0 ? void 0 : payload.items) !== null && _f !== void 0 ? _f : [], appliedFilters: filters };
|
|
408
|
+
},
|
|
409
|
+
});
|
|
410
|
+
const readText = (0, ai_1.tool)({
|
|
411
|
+
description: 'Read a slice of an extracted text file in the workspace (data/text/…). Prefer run_command with rg/grep to locate the passage first, then read only the lines around it. Hard cap per call keeps the conversation small.',
|
|
412
|
+
inputSchema: zod_1.z.object({
|
|
413
|
+
path: zod_1.z.string().min(1).max(500),
|
|
414
|
+
startLine: zod_1.z.number().int().min(1).optional(),
|
|
415
|
+
endLine: zod_1.z.number().int().min(1).optional(),
|
|
416
|
+
}),
|
|
417
|
+
execute: async (input) => {
|
|
418
|
+
var _b, _c;
|
|
419
|
+
const target = path_1.default.resolve(workspaceDir, input.path);
|
|
420
|
+
if (!target.startsWith(path_1.default.resolve(workspaceDir) + path_1.default.sep))
|
|
421
|
+
throw new Error('path escapes the workspace');
|
|
422
|
+
const content = await fs_1.promises.readFile(target, 'utf8');
|
|
423
|
+
const lines = content.split('\n');
|
|
424
|
+
const start = Math.max(1, (_b = input.startLine) !== null && _b !== void 0 ? _b : 1);
|
|
425
|
+
const end = Math.min(lines.length, (_c = input.endLine) !== null && _c !== void 0 ? _c : start + 80);
|
|
426
|
+
const slice = lines.slice(start - 1, end).join('\n');
|
|
427
|
+
return {
|
|
428
|
+
path: input.path,
|
|
429
|
+
totalLines: lines.length,
|
|
430
|
+
startLine: start,
|
|
431
|
+
endLine: end,
|
|
432
|
+
text: slice.length > MAX_INLINE_TEXT_CHARS ? `${slice.slice(0, MAX_INLINE_TEXT_CHARS)}…[truncated — narrow the line range]` : slice,
|
|
433
|
+
};
|
|
434
|
+
},
|
|
435
|
+
});
|
|
436
|
+
return {
|
|
437
|
+
search_filings: searchFilings,
|
|
438
|
+
count_filings: countFilings,
|
|
439
|
+
summarize_filings: summarizeFilings,
|
|
440
|
+
get_filing: getFiling,
|
|
441
|
+
search_documents: searchDocuments,
|
|
442
|
+
download_attachment: downloadAttachment,
|
|
443
|
+
search_objections: searchObjections,
|
|
444
|
+
read_text: readText,
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
//# sourceMappingURL=filingramp-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filingramp-tools.js","sourceRoot":"","sources":["../../src/research/filingramp-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ResearchScope } from '../config';
|
|
2
|
+
export declare const RESEARCH_OUTPUT_FILES: {
|
|
3
|
+
readonly findings: "research/findings.md";
|
|
4
|
+
readonly results: "research/results.csv";
|
|
5
|
+
readonly evidence: "research/evidence.json";
|
|
6
|
+
readonly notes: "research/notes.md";
|
|
7
|
+
};
|
|
8
|
+
export declare function buildResearchSystemPrompt(options: {
|
|
9
|
+
scope?: ResearchScope;
|
|
10
|
+
industryData: boolean;
|
|
11
|
+
tokenBudget?: number;
|
|
12
|
+
}): string;
|
|
13
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/research/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAG9C,eAAO,MAAM,qBAAqB;;;;;CAKxB,CAAA;AAEV,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,aAAa,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CA2BjI"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RESEARCH_OUTPUT_FILES = void 0;
|
|
4
|
+
exports.buildResearchSystemPrompt = buildResearchSystemPrompt;
|
|
5
|
+
const scope_1 = require("./scope");
|
|
6
|
+
exports.RESEARCH_OUTPUT_FILES = {
|
|
7
|
+
findings: 'research/findings.md',
|
|
8
|
+
results: 'research/results.csv',
|
|
9
|
+
evidence: 'research/evidence.json',
|
|
10
|
+
notes: 'research/notes.md',
|
|
11
|
+
};
|
|
12
|
+
function buildResearchSystemPrompt(options) {
|
|
13
|
+
const budget = options.tokenBudget ? `Token budget for this session: ${options.tokenBudget.toLocaleString()} tokens. ` : '';
|
|
14
|
+
return `You are a deep research agent for insurance regulatory filings, running inside an isolated session workspace with a persistent disk. You answer one research question at a time by reading the actual filing documents, and you leave a verifiable trail.
|
|
15
|
+
|
|
16
|
+
Scope of this session (enforced on every FilingRamp call; you may narrow, never widen):
|
|
17
|
+
${(0, scope_1.describeScope)(options.scope)}
|
|
18
|
+
${options.industryData ? 'Industry (public) filings are available with searchType/scope INDUSTRY.' : 'Only this account\'s own filings are available.'}
|
|
19
|
+
|
|
20
|
+
Method — plan, size, confirm, narrow, download, analyze, report:
|
|
21
|
+
1. Plan. Restate the question as concrete, checkable criteria (which document types, which clauses or values, which time range). Write the plan to ${exports.RESEARCH_OUTPUT_FILES.notes} and tell the user in two or three sentences.
|
|
22
|
+
2. Size. Use count_filings and summarize_filings (grouped by state, filingType, typeOfInsurance, submittedMonth) to see how big the population is before reading anything.
|
|
23
|
+
3. Confirm. If the population is large (more than ~300 filings or ~1,000 documents) or the question is ambiguous, call ask_user with the counts and the choice to make. Stop and wait for the answer.
|
|
24
|
+
4. Narrow. Use search_documents (KEYWORD with exact phrases first, SEMANTIC/HYBRID for concepts like "water shut-off valve requirement") to find the documents that matter. Pass saveText=true so the extracted text lands in data/text/ for grep.
|
|
25
|
+
5. Download only what search cannot answer: download_attachment extracts PDF text locally. Note documents with no text (scanned) — they go in the findings as "not readable".
|
|
26
|
+
6. Analyze locally. Use run_command with rg/grep, python3 (pandas, duckdb) and the files under data/. Keep intermediate tables in data/*.csv. Never paste whole documents into the conversation; read_text only the lines around a match.
|
|
27
|
+
7. Report. Write:
|
|
28
|
+
- ${exports.RESEARCH_OUTPUT_FILES.findings}: the answer first, then method, population size, coverage (documents read vs unreadable), caveats.
|
|
29
|
+
- ${exports.RESEARCH_OUTPUT_FILES.results}: one row per filing or document with the facts you extracted (tracking number, state, company, date, the extracted value(s), source document, page/line hint).
|
|
30
|
+
- ${exports.RESEARCH_OUTPUT_FILES.evidence}: for every fact, the quoted span and where it came from ({trackingNumber, attachmentKey or path, line, quote}).
|
|
31
|
+
Then call publish_results with those paths so they appear in the session, and finish with a short summary message.
|
|
32
|
+
|
|
33
|
+
Working rules:
|
|
34
|
+
- Progress: call report_progress when a phase starts and finishes, so the user sees a checklist while you work. Post a short message every ~10 minutes of work with counts so far.
|
|
35
|
+
- ${budget}Prefer counts and summaries over listing rows; request only the fields you need; let files hold bulk data.
|
|
36
|
+
- Dates, states and lines you were given are the scope: always say when the data can not answer the question within it.
|
|
37
|
+
- Be explicit about uncertainty: separate "found in document" from "inferred".
|
|
38
|
+
- Resumability: after each phase, update ${exports.RESEARCH_OUTPUT_FILES.notes} with what is done and what is next — a restarted session reads it first.`;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/research/prompt.ts"],"names":[],"mappings":";;;AAUA,8DA2BC;AApCD,mCAAuC;AAE1B,QAAA,qBAAqB,GAAG;IACnC,QAAQ,EAAE,sBAAsB;IAChC,OAAO,EAAE,sBAAsB;IAC/B,QAAQ,EAAE,wBAAwB;IAClC,KAAK,EAAE,mBAAmB;CAClB,CAAA;AAEV,SAAgB,yBAAyB,CAAC,OAA+E;IACvH,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,kCAAkC,OAAO,CAAC,WAAW,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3H,OAAO;;;EAGP,IAAA,qBAAa,EAAC,OAAO,CAAC,KAAK,CAAC;EAC5B,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,yEAAyE,CAAC,CAAC,CAAC,iDAAiD;;;qJAGD,6BAAqB,CAAC,KAAK;;;;;;;OAOzK,6BAAqB,CAAC,QAAQ;OAC9B,6BAAqB,CAAC,OAAO;OAC7B,6BAAqB,CAAC,QAAQ;;;;;IAKjC,MAAM;;;2CAGiC,6BAAqB,CAAC,KAAK,2EAA2E,CAAA;AACjJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ResearchScope } from '../config';
|
|
2
|
+
export interface FilingsFilter {
|
|
3
|
+
field: string;
|
|
4
|
+
comparisonOperator: string;
|
|
5
|
+
value: unknown;
|
|
6
|
+
}
|
|
7
|
+
/** Four-decimal codes ("17.0001") are sub-lines; anything else is a broad line or a name. */
|
|
8
|
+
export declare function isSubLineCode(line: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Filters the scope implies for the filings search / count / summary endpoints
|
|
11
|
+
* (FilingsFilters in the FilingRamp catalog). A field the caller already set wins — the
|
|
12
|
+
* caller is the model narrowing within the scope, never a way around it: when the caller's
|
|
13
|
+
* value falls outside the scope the scope's filter is kept and the caller's is dropped.
|
|
14
|
+
*/
|
|
15
|
+
export declare function scopeFilingsFilters(scope: ResearchScope | undefined, requested?: FilingsFilter[]): FilingsFilter[];
|
|
16
|
+
/**
|
|
17
|
+
* Same idea for POST /v1/search/global (OpenSearch): its filter vocabulary differs (singular
|
|
18
|
+
* typeOfInsurance / subTypeOfInsurance, exact "in" matches only).
|
|
19
|
+
*/
|
|
20
|
+
export declare function scopeDocumentFilters(scope: ResearchScope | undefined, requested?: FilingsFilter[]): FilingsFilter[];
|
|
21
|
+
/** 'INDUSTRY' only when the session asked for it and the account is entitled; otherwise account data. */
|
|
22
|
+
export declare function resolveSearchType(scope: ResearchScope | undefined, industryData: boolean, requested?: 'ACCOUNT' | 'INDUSTRY'): 'ACCOUNT' | 'INDUSTRY';
|
|
23
|
+
export declare function describeScope(scope: ResearchScope | undefined): string;
|
|
24
|
+
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/research/scope.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAE9C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,kBAAkB,EAAE,MAAM,CAAA;IAC1B,KAAK,EAAE,OAAO,CAAA;CACf;AAED,6FAA6F;AAC7F,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,EAAE,SAAS,GAAE,aAAa,EAAO,GAAG,aAAa,EAAE,CAkCtH;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,EAAE,SAAS,GAAE,aAAa,EAAO,GAAG,aAAa,EAAE,CAwBvH;AAED,yGAAyG;AACzG,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,aAAa,GAAG,SAAS,EAChC,YAAY,EAAE,OAAO,EACrB,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,GACjC,SAAS,GAAG,UAAU,CAMxB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,CAUtE"}
|