@multiplayer-app/agent 0.1.9 → 0.1.11

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 (274) hide show
  1. package/README.md +106 -0
  2. package/dist/agent/definition.d.ts +22 -0
  3. package/dist/agent/definition.d.ts.map +1 -0
  4. package/dist/agent/definition.js +3 -0
  5. package/dist/agent/definition.js.map +1 -0
  6. package/dist/agent/definition.test.d.ts +2 -0
  7. package/dist/agent/definition.test.d.ts.map +1 -0
  8. package/dist/agent/definition.test.js +40 -0
  9. package/dist/agent/definition.test.js.map +1 -0
  10. package/dist/agent/model-failure.d.ts +10 -0
  11. package/dist/agent/model-failure.d.ts.map +1 -0
  12. package/dist/agent/model-failure.js +50 -0
  13. package/dist/agent/model-failure.js.map +1 -0
  14. package/dist/agent/profiles/coding.d.ts +4 -0
  15. package/dist/agent/profiles/coding.d.ts.map +1 -0
  16. package/dist/agent/profiles/coding.js +17 -0
  17. package/dist/agent/profiles/coding.js.map +1 -0
  18. package/dist/agent/profiles/index.d.ts +4 -0
  19. package/dist/agent/profiles/index.d.ts.map +1 -0
  20. package/dist/agent/profiles/index.js +9 -0
  21. package/dist/agent/profiles/index.js.map +1 -0
  22. package/dist/agent/profiles/research.d.ts +4 -0
  23. package/dist/agent/profiles/research.d.ts.map +1 -0
  24. package/dist/agent/profiles/research.js +53 -0
  25. package/dist/agent/profiles/research.js.map +1 -0
  26. package/dist/agent/progress-reminder.test.d.ts +2 -0
  27. package/dist/agent/progress-reminder.test.d.ts.map +1 -0
  28. package/dist/agent/progress-reminder.test.js +20 -0
  29. package/dist/agent/progress-reminder.test.js.map +1 -0
  30. package/dist/agent/turn-runner.d.ts +54 -0
  31. package/dist/agent/turn-runner.d.ts.map +1 -0
  32. package/dist/agent/turn-runner.js +147 -0
  33. package/dist/agent/turn-runner.js.map +1 -0
  34. package/dist/agent/turn-runner.test.d.ts +2 -0
  35. package/dist/agent/turn-runner.test.d.ts.map +1 -0
  36. package/dist/agent/turn-runner.test.js +181 -0
  37. package/dist/agent/turn-runner.test.js.map +1 -0
  38. package/dist/context-pruning.d.ts +13 -0
  39. package/dist/context-pruning.d.ts.map +1 -0
  40. package/dist/context-pruning.js +61 -0
  41. package/dist/context-pruning.js.map +1 -0
  42. package/dist/context-pruning.test.d.ts +2 -0
  43. package/dist/context-pruning.test.d.ts.map +1 -0
  44. package/dist/context-pruning.test.js +48 -0
  45. package/dist/context-pruning.test.js.map +1 -0
  46. package/dist/index.d.ts +11 -6
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +18 -10
  49. package/dist/index.js.map +1 -1
  50. package/dist/models/attribution.d.ts.map +1 -0
  51. package/dist/models/attribution.js.map +1 -0
  52. package/dist/{model.d.ts → models/resolve-model.d.ts} +2 -2
  53. package/dist/models/resolve-model.d.ts.map +1 -0
  54. package/dist/{model.js → models/resolve-model.js} +4 -2
  55. package/dist/models/resolve-model.js.map +1 -0
  56. package/dist/models/usage.d.ts +11 -0
  57. package/dist/models/usage.d.ts.map +1 -0
  58. package/dist/models/usage.js +19 -0
  59. package/dist/models/usage.js.map +1 -0
  60. package/dist/{git-sync.d.ts → persistence/git-sync.d.ts} +1 -1
  61. package/dist/persistence/git-sync.d.ts.map +1 -0
  62. package/dist/persistence/git-sync.js.map +1 -0
  63. package/dist/persistence/git-sync.test.d.ts.map +1 -0
  64. package/dist/{git-sync.test.js → persistence/git-sync.test.js} +2 -2
  65. package/dist/persistence/git-sync.test.js.map +1 -0
  66. package/dist/{session-storage-sync.d.ts → persistence/snapshot-sync.d.ts} +2 -2
  67. package/dist/persistence/snapshot-sync.d.ts.map +1 -0
  68. package/dist/{session-storage-sync.js → persistence/snapshot-sync.js} +1 -1
  69. package/dist/persistence/snapshot-sync.js.map +1 -0
  70. package/dist/persistence/snapshot-sync.test.d.ts +2 -0
  71. package/dist/persistence/snapshot-sync.test.d.ts.map +1 -0
  72. package/dist/{session-storage-sync.test.js → persistence/snapshot-sync.test.js} +3 -3
  73. package/dist/persistence/snapshot-sync.test.js.map +1 -0
  74. package/dist/persistence/workspace.d.ts +17 -0
  75. package/dist/persistence/workspace.d.ts.map +1 -0
  76. package/dist/persistence/workspace.js +26 -0
  77. package/dist/persistence/workspace.js.map +1 -0
  78. package/dist/persistence/workspace.test.d.ts +2 -0
  79. package/dist/persistence/workspace.test.d.ts.map +1 -0
  80. package/dist/persistence/workspace.test.js +38 -0
  81. package/dist/persistence/workspace.test.js.map +1 -0
  82. package/dist/research/extract-texts.d.ts +41 -0
  83. package/dist/research/extract-texts.d.ts.map +1 -0
  84. package/dist/research/extract-texts.js +239 -0
  85. package/dist/research/extract-texts.js.map +1 -0
  86. package/dist/research/extract-texts.test.d.ts +2 -0
  87. package/dist/research/extract-texts.test.d.ts.map +1 -0
  88. package/dist/research/extract-texts.test.js +120 -0
  89. package/dist/research/extract-texts.test.js.map +1 -0
  90. package/dist/research/extraction-tool.d.ts +6 -0
  91. package/dist/research/extraction-tool.d.ts.map +1 -0
  92. package/dist/research/extraction-tool.js +41 -0
  93. package/dist/research/extraction-tool.js.map +1 -0
  94. package/dist/research/extraction-tool.test.d.ts +2 -0
  95. package/dist/research/extraction-tool.test.d.ts.map +1 -0
  96. package/dist/research/extraction-tool.test.js +102 -0
  97. package/dist/research/extraction-tool.test.js.map +1 -0
  98. package/dist/research/filingramp/attachment-tools.d.ts +4 -0
  99. package/dist/research/filingramp/attachment-tools.d.ts.map +1 -0
  100. package/dist/research/filingramp/attachment-tools.js +198 -0
  101. package/dist/research/filingramp/attachment-tools.js.map +1 -0
  102. package/dist/research/filingramp/document-search-tool.d.ts +4 -0
  103. package/dist/research/filingramp/document-search-tool.d.ts.map +1 -0
  104. package/dist/research/filingramp/document-search-tool.js +231 -0
  105. package/dist/research/filingramp/document-search-tool.js.map +1 -0
  106. package/dist/research/filingramp/filing-detail-tool.d.ts +8 -0
  107. package/dist/research/filingramp/filing-detail-tool.d.ts.map +1 -0
  108. package/dist/research/filingramp/filing-detail-tool.js +161 -0
  109. package/dist/research/filingramp/filing-detail-tool.js.map +1 -0
  110. package/dist/research/filingramp/filing-search-tools.d.ts +4 -0
  111. package/dist/research/filingramp/filing-search-tools.d.ts.map +1 -0
  112. package/dist/research/filingramp/filing-search-tools.js +207 -0
  113. package/dist/research/filingramp/filing-search-tools.js.map +1 -0
  114. package/dist/research/filingramp/shared.d.ts +64 -0
  115. package/dist/research/filingramp/shared.d.ts.map +1 -0
  116. package/dist/research/filingramp/shared.js +130 -0
  117. package/dist/research/filingramp/shared.js.map +1 -0
  118. package/dist/research/filingramp-client.d.ts +1 -1
  119. package/dist/research/filingramp-client.d.ts.map +1 -1
  120. package/dist/research/filingramp-contract.d.ts.map +1 -1
  121. package/dist/research/filingramp-contract.js +8 -2
  122. package/dist/research/filingramp-contract.js.map +1 -1
  123. package/dist/research/filingramp-tools.d.ts +4 -8
  124. package/dist/research/filingramp-tools.d.ts.map +1 -1
  125. package/dist/research/filingramp-tools.js +19 -597
  126. package/dist/research/filingramp-tools.js.map +1 -1
  127. package/dist/research/filingramp-tools.test.js +138 -2
  128. package/dist/research/filingramp-tools.test.js.map +1 -1
  129. package/dist/research/prompt.d.ts +1 -1
  130. package/dist/research/prompt.d.ts.map +1 -1
  131. package/dist/research/prompt.js +16 -7
  132. package/dist/research/prompt.js.map +1 -1
  133. package/dist/research/scope.d.ts +1 -1
  134. package/dist/research/scope.d.ts.map +1 -1
  135. package/dist/runtime/cli.d.ts.map +1 -0
  136. package/dist/{cli.js → runtime/cli.js} +3 -3
  137. package/dist/runtime/cli.js.map +1 -0
  138. package/dist/{config.d.ts → runtime/config.d.ts} +1 -1
  139. package/dist/runtime/config.d.ts.map +1 -0
  140. package/dist/{config.js → runtime/config.js} +1 -1
  141. package/dist/runtime/config.js.map +1 -0
  142. package/dist/{runtime.d.ts → runtime/index.d.ts} +2 -2
  143. package/dist/runtime/index.d.ts.map +1 -0
  144. package/dist/{runtime.js → runtime/index.js} +7 -7
  145. package/dist/runtime/index.js.map +1 -0
  146. package/dist/runtime/lambda-microvm.d.ts +3 -0
  147. package/dist/runtime/lambda-microvm.d.ts.map +1 -0
  148. package/dist/{lambda-microvm-entrypoint.js → runtime/lambda-microvm.js} +4 -4
  149. package/dist/runtime/lambda-microvm.js.map +1 -0
  150. package/dist/runtime/lifecycle.test.d.ts.map +1 -0
  151. package/dist/{lifecycle.test.js → runtime/lifecycle.test.js} +5 -5
  152. package/dist/runtime/lifecycle.test.js.map +1 -0
  153. package/dist/session/checkpoint-timer.test.d.ts.map +1 -0
  154. package/dist/{checkpoint-timer.test.js → session/checkpoint-timer.test.js} +8 -8
  155. package/dist/session/checkpoint-timer.test.js.map +1 -0
  156. package/dist/session/conversation.d.ts +15 -0
  157. package/dist/session/conversation.d.ts.map +1 -0
  158. package/dist/session/conversation.js +61 -0
  159. package/dist/session/conversation.js.map +1 -0
  160. package/dist/session/conversation.test.d.ts +2 -0
  161. package/dist/session/conversation.test.d.ts.map +1 -0
  162. package/dist/session/conversation.test.js +53 -0
  163. package/dist/session/conversation.test.js.map +1 -0
  164. package/dist/session/idle-checkpoint.test.d.ts.map +1 -0
  165. package/dist/{idle-checkpoint.test.js → session/idle-checkpoint.test.js} +8 -4
  166. package/dist/session/idle-checkpoint.test.js.map +1 -0
  167. package/dist/session/index.d.ts +7 -0
  168. package/dist/session/index.d.ts.map +1 -0
  169. package/dist/session/index.js +16 -0
  170. package/dist/session/index.js.map +1 -0
  171. package/dist/session/runtime.d.ts +58 -0
  172. package/dist/session/runtime.d.ts.map +1 -0
  173. package/dist/session/runtime.js +292 -0
  174. package/dist/session/runtime.js.map +1 -0
  175. package/dist/session/runtime.test.d.ts +2 -0
  176. package/dist/session/runtime.test.d.ts.map +1 -0
  177. package/dist/session/runtime.test.js +201 -0
  178. package/dist/session/runtime.test.js.map +1 -0
  179. package/dist/session/tool-context.d.ts +12 -0
  180. package/dist/session/tool-context.d.ts.map +1 -0
  181. package/dist/session/tool-context.js +3 -0
  182. package/dist/session/tool-context.js.map +1 -0
  183. package/dist/session/tools.d.ts +6 -0
  184. package/dist/session/tools.d.ts.map +1 -0
  185. package/dist/session/tools.js +97 -0
  186. package/dist/session/tools.js.map +1 -0
  187. package/dist/session/tools.test.d.ts +2 -0
  188. package/dist/session/tools.test.d.ts.map +1 -0
  189. package/dist/session/tools.test.js +55 -0
  190. package/dist/session/tools.test.js.map +1 -0
  191. package/dist/task/loop.d.ts +6 -0
  192. package/dist/task/loop.d.ts.map +1 -0
  193. package/dist/{loop.js → task/loop.js} +6 -6
  194. package/dist/task/loop.js.map +1 -0
  195. package/dist/tool-call-repair.d.ts +11 -0
  196. package/dist/tool-call-repair.d.ts.map +1 -0
  197. package/dist/tool-call-repair.js +91 -0
  198. package/dist/tool-call-repair.js.map +1 -0
  199. package/dist/tool-call-repair.test.d.ts +2 -0
  200. package/dist/tool-call-repair.test.d.ts.map +1 -0
  201. package/dist/tool-call-repair.test.js +50 -0
  202. package/dist/tool-call-repair.test.js.map +1 -0
  203. package/dist/tools/exec-tools.d.ts +1 -0
  204. package/dist/tools/exec-tools.d.ts.map +1 -1
  205. package/dist/tools/exec-tools.js +23 -3
  206. package/dist/tools/exec-tools.js.map +1 -1
  207. package/dist/transport/link.d.ts.map +1 -0
  208. package/dist/transport/link.js.map +1 -0
  209. package/dist/{protocol.d.ts → transport/protocol.d.ts} +4 -0
  210. package/dist/transport/protocol.d.ts.map +1 -0
  211. package/dist/transport/protocol.js.map +1 -0
  212. package/dist/transport/protocol.test.d.ts.map +1 -0
  213. package/dist/transport/protocol.test.js.map +1 -0
  214. package/dist/{report.d.ts → transport/reporter.d.ts} +1 -1
  215. package/dist/transport/reporter.d.ts.map +1 -0
  216. package/dist/{report.js → transport/reporter.js} +1 -1
  217. package/dist/transport/reporter.js.map +1 -0
  218. package/package.json +11 -11
  219. package/dist/attribution.d.ts.map +0 -1
  220. package/dist/attribution.js.map +0 -1
  221. package/dist/checkpoint-timer.test.d.ts.map +0 -1
  222. package/dist/checkpoint-timer.test.js.map +0 -1
  223. package/dist/cli.d.ts.map +0 -1
  224. package/dist/cli.js.map +0 -1
  225. package/dist/config.d.ts.map +0 -1
  226. package/dist/config.js.map +0 -1
  227. package/dist/git-sync.d.ts.map +0 -1
  228. package/dist/git-sync.js.map +0 -1
  229. package/dist/git-sync.test.d.ts.map +0 -1
  230. package/dist/git-sync.test.js.map +0 -1
  231. package/dist/idle-checkpoint.test.d.ts.map +0 -1
  232. package/dist/idle-checkpoint.test.js.map +0 -1
  233. package/dist/lambda-microvm-entrypoint.d.ts +0 -3
  234. package/dist/lambda-microvm-entrypoint.d.ts.map +0 -1
  235. package/dist/lambda-microvm-entrypoint.js.map +0 -1
  236. package/dist/lifecycle.test.d.ts.map +0 -1
  237. package/dist/lifecycle.test.js.map +0 -1
  238. package/dist/link.d.ts.map +0 -1
  239. package/dist/link.js.map +0 -1
  240. package/dist/loop.d.ts +0 -6
  241. package/dist/loop.d.ts.map +0 -1
  242. package/dist/loop.js.map +0 -1
  243. package/dist/model.d.ts.map +0 -1
  244. package/dist/model.js.map +0 -1
  245. package/dist/protocol.d.ts.map +0 -1
  246. package/dist/protocol.js.map +0 -1
  247. package/dist/protocol.test.d.ts.map +0 -1
  248. package/dist/protocol.test.js.map +0 -1
  249. package/dist/report.d.ts.map +0 -1
  250. package/dist/report.js.map +0 -1
  251. package/dist/runtime.d.ts.map +0 -1
  252. package/dist/runtime.js.map +0 -1
  253. package/dist/session-storage-sync.d.ts.map +0 -1
  254. package/dist/session-storage-sync.js.map +0 -1
  255. package/dist/session-storage-sync.test.d.ts +0 -2
  256. package/dist/session-storage-sync.test.d.ts.map +0 -1
  257. package/dist/session-storage-sync.test.js.map +0 -1
  258. package/dist/session.d.ts +0 -46
  259. package/dist/session.d.ts.map +0 -1
  260. package/dist/session.js +0 -512
  261. package/dist/session.js.map +0 -1
  262. /package/dist/{attribution.d.ts → models/attribution.d.ts} +0 -0
  263. /package/dist/{attribution.js → models/attribution.js} +0 -0
  264. /package/dist/{git-sync.js → persistence/git-sync.js} +0 -0
  265. /package/dist/{git-sync.test.d.ts → persistence/git-sync.test.d.ts} +0 -0
  266. /package/dist/{cli.d.ts → runtime/cli.d.ts} +0 -0
  267. /package/dist/{lifecycle.test.d.ts → runtime/lifecycle.test.d.ts} +0 -0
  268. /package/dist/{checkpoint-timer.test.d.ts → session/checkpoint-timer.test.d.ts} +0 -0
  269. /package/dist/{idle-checkpoint.test.d.ts → session/idle-checkpoint.test.d.ts} +0 -0
  270. /package/dist/{link.d.ts → transport/link.d.ts} +0 -0
  271. /package/dist/{link.js → transport/link.js} +0 -0
  272. /package/dist/{protocol.js → transport/protocol.js} +0 -0
  273. /package/dist/{protocol.test.d.ts → transport/protocol.test.d.ts} +0 -0
  274. /package/dist/{protocol.test.js → transport/protocol.test.js} +0 -0
@@ -0,0 +1,231 @@
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.createDocumentSearchTool = createDocumentSearchTool;
7
+ // Document indexes have different filter vocabularies. Search each group independently so
8
+ // an unavailable index does not discard successful results from the other groups.
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const ai_1 = require("ai");
11
+ const zod_1 = require("zod");
12
+ const filingramp_client_1 = require("../filingramp-client");
13
+ const filingramp_contract_1 = require("../filingramp-contract");
14
+ const scope_1 = require("../scope");
15
+ const shared_1 = require("./shared");
16
+ /** Hits returned inline; more go to a saveHits file. */
17
+ const MAX_DOC_HITS = 50;
18
+ const MAX_HIGHLIGHTS = 3;
19
+ /** OpenSearch result window: offset + limit never exceeds it (ramp-model pagination.builder). */
20
+ const SEARCH_RESULT_WINDOW = 10000;
21
+ const SEARCH_PAGE_SIZE = 200;
22
+ function createDocumentSearchTool(options) {
23
+ const { client, workspaceDir, scope, onProgress } = options;
24
+ const industryData = client.industryData;
25
+ // Document search matches typeOfInsurance exactly, while the scope holds names or codes
26
+ // ("Homeowners", "04.0"); the filings summary says which exact labels those stand for in this
27
+ // account. Resolved once per process.
28
+ let lineLabels;
29
+ const scopeLineLabels = (searchType) => {
30
+ var _a;
31
+ if (!((_a = scope === null || scope === void 0 ? void 0 : scope.lines) === null || _a === void 0 ? void 0 : _a.length))
32
+ return Promise.resolve({ lines: [], subLines: [] });
33
+ lineLabels !== null && lineLabels !== void 0 ? lineLabels : (lineLabels = client
34
+ .request('/v2/search/filings/summary', {
35
+ method: 'POST',
36
+ body: { filters: (0, scope_1.scopeFilingsFilters)(scope), groupBy: ['typeOfInsurance', 'subTypeOfInsurance'], limit: 1000, searchType },
37
+ })
38
+ .then((payload) => {
39
+ var _a;
40
+ const keys = ((_a = payload === null || payload === void 0 ? void 0 : payload.items) !== null && _a !== void 0 ? _a : []).map((row) => { var _a; return (_a = row.key) !== null && _a !== void 0 ? _a : {}; });
41
+ const labels = (field) => [...new Set(keys.map((key) => key[field]).filter((value) => typeof value === 'string' && value.length > 0))];
42
+ return { lines: labels('typeOfInsurance'), subLines: labels('subTypeOfInsurance') };
43
+ })
44
+ .catch((error) => {
45
+ lineLabels = undefined;
46
+ throw error;
47
+ }));
48
+ return lineLabels;
49
+ };
50
+ /** One page of document hits; `total` is every match (it can exceed the 10,000-hit window), `count` what paging reaches. */
51
+ const requestDocuments = async (body) => {
52
+ try {
53
+ // ramp-web-api mounts the OpenSearch router at /content-search (POST /global).
54
+ const payload = await client.request('/v1/content-search/global', {
55
+ method: 'POST',
56
+ body,
57
+ timeoutMs: 120000,
58
+ });
59
+ if (Array.isArray(payload))
60
+ return { items: payload };
61
+ const number = (value) => (typeof value === 'number' ? value : undefined);
62
+ return { items: (0, shared_1.asRecordList)(payload), total: number(payload === null || payload === void 0 ? void 0 : payload.total), count: number(payload === null || payload === void 0 ? void 0 : payload.count) };
63
+ }
64
+ catch (error) {
65
+ if (error instanceof filingramp_client_1.FilingRampHttpError && error.status === 403) {
66
+ throw new Error(`Document search is not enabled for this account (FilingRamp "searchV2" feature): ${error.message}. Report it in the findings; filing metadata tools still work.`);
67
+ }
68
+ if (error instanceof filingramp_client_1.FilingRampHttpError && error.status === 400 && /must be|is not a valid|not allowed|required|invalid/i.test(error.message)) {
69
+ throw new Error(`Document search rejected the request: ${error.message}. Fix the filter (the tool description lists the fields and operators) and call again.`);
70
+ }
71
+ // FilingRamp hides OpenSearch failures (e.g. a missing document index) behind a generic
72
+ // "An error occurred": rephrasing the query will not help, falling back will.
73
+ if (error instanceof filingramp_client_1.FilingRampHttpError && (error.status === 400 || error.status >= 500)) {
74
+ throw new Error(`Document search is unavailable (FilingRamp ${error.status}: ${error.message}). Do not retry it with other wording. ` +
75
+ 'Find candidate filings with search_filings / summarize_filings, then read their documents with get_filing and download_attachment (extracted text lands in the workspace for grep). Note the gap in the findings.');
76
+ }
77
+ throw error;
78
+ }
79
+ };
80
+ return (0, ai_1.tool)({
81
+ description: 'Full-text or semantic search INSIDE documents (extracted PDF text of forms, rate and supporting documents, objection letters, responses, library forms and rates, circulars). This is how you find which filings contain a clause. Without saveHits it returns up to 50 hits inline with highlights. With saveHits it pages through every hit (KEYWORD and HYBRID reach up to 10,000 per query; SEMANTIC ranks only the top candidates, so do not use it to list a population), writes one JSONL row per hit (filingId, trackingNumber, state, name, attachmentKey, textPath…) and returns totals plus a few samples; the file works as a fetch_attachments / extract_from_texts manifest. Several calls with the same saveHits path add to it without duplicates. 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. Filters use OpenSearch\'s vocabulary: states, typeOfInsurance, subTypeOfInsurance, filingTypes, statuses, resourceTypes, productIds, projectIds take exact string arrays ("in"); authors, contacts, reviewers match a substring ("cn"); dateSubmitted, createdAt, updatedAt take one date (eq/gt/gte/lt/lte). The session scope is added for you. Library and circular indexes accept only their own fields (resourceTypes, formNumbers, editionDates, circularNumbers…), so neither the scope nor filing filters apply to them; the result reports what was not applied.',
82
+ inputSchema: zod_1.z.object({
83
+ query: zod_1.z.string().min(1).max(2000),
84
+ searchType: zod_1.z.enum(['KEYWORD', 'SEMANTIC', 'HYBRID']).optional().describe('KEYWORD for exact phrases (default), SEMANTIC for meaning, HYBRID for both'),
85
+ indexes: zod_1.z
86
+ .array(zod_1.z.enum(filingramp_contract_1.DOCUMENT_INDEXES))
87
+ .min(1)
88
+ .optional()
89
+ .describe('Which document collections; default ["filings"]. A collection this deployment has no index for fails on its own (requests[].failed) while the others still answer.'),
90
+ matchMode: zod_1.z.enum(['EXACT', 'ANY_WORD', 'PROXIMITY', 'PREFIX', 'FUZZY', 'BOOLEAN']).optional(),
91
+ filters: zod_1.z.array(shared_1.filterInputSchema).max(20).optional().describe('See the tool description for fields and operators'),
92
+ scope: zod_1.z.enum(['ACCOUNT', 'INDUSTRY']).optional(),
93
+ limit: zod_1.z.number().int().min(1).max(SEARCH_RESULT_WINDOW).optional().describe('Hits to collect: up to 50 inline; with saveHits up to 10,000 (default 2,000)'),
94
+ saveText: zod_1.z.boolean().optional(),
95
+ saveHits: zod_1.z.string().min(1).max(300).optional().describe('Workspace JSONL path for every hit, e.g. data/hits/water-valve.jsonl'),
96
+ }),
97
+ execute: async (input, { toolCallId }) => {
98
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z;
99
+ const searchType = (_a = input.searchType) !== null && _a !== void 0 ? _a : 'KEYWORD';
100
+ const suffix = searchType === 'KEYWORD' ? 'keyword_index' : 'semantic_index';
101
+ const matchMode = (_b = input.matchMode) !== null && _b !== void 0 ? _b : (searchType === 'KEYWORD' ? 'EXACT' : 'ANY_WORD');
102
+ const scopeValue = (0, scope_1.resolveSearchType)(scope, industryData, input.scope);
103
+ const labels = await scopeLineLabels(scopeValue);
104
+ const requests = [];
105
+ const hits = [];
106
+ const failures = [];
107
+ let answered = 0;
108
+ const wanted = input.saveHits ? Math.min((_c = input.limit) !== null && _c !== void 0 ? _c : 2000, SEARCH_RESULT_WINDOW) : Math.min((_d = input.limit) !== null && _d !== void 0 ? _d : MAX_DOC_HITS, 1000);
109
+ // One request per index group: each group has its own filter vocabulary, and one filter
110
+ // outside it fails the whole request. A group whose indexes an environment does not have
111
+ // (circulars on most deployments) fails alone; the other groups still answer.
112
+ for (const group of (0, filingramp_contract_1.documentIndexGroups)((_e = input.indexes) !== null && _e !== void 0 ? _e : ['filings'])) {
113
+ const own = (0, filingramp_contract_1.normalizeDocumentFilters)(input.filters, group);
114
+ const scoped = (0, scope_1.scopeDocumentFilters)(scope, own.filters, group.fields, labels);
115
+ const entry = { indexes: group.indexes, filters: scoped.filters, unscoped: scoped.unscoped, ignoredFilters: own.ignored };
116
+ if (scoped.emptyByLines) {
117
+ requests.push({ ...entry, skipped: "no filing in scope carries the scope's lines, so no document in these indexes can match" });
118
+ continue;
119
+ }
120
+ try {
121
+ // Inline: one page. saveHits: page by offset until `wanted` hits, a short page or the result window.
122
+ const pageSize = input.saveHits ? Math.min(SEARCH_PAGE_SIZE, wanted) : wanted;
123
+ let total;
124
+ for (let offset = 0, collected = 0; collected < wanted && offset + pageSize <= SEARCH_RESULT_WINDOW; offset += pageSize) {
125
+ const page = await requestDocuments({
126
+ searchType,
127
+ searchText: input.query,
128
+ matchMode,
129
+ indexNames: group.indexes.map((index) => `${index}_${suffix}`),
130
+ scope: scopeValue,
131
+ limit: pageSize,
132
+ ...(offset > 0 ? { offset } : {}),
133
+ filters: scoped.filters,
134
+ });
135
+ total !== null && total !== void 0 ? total : (total = page.total);
136
+ hits.push(...page.items);
137
+ collected += page.items.length;
138
+ if (input.saveHits)
139
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress(toolCallId, collected, Math.min(wanted, total !== null && total !== void 0 ? total : wanted), 'Collecting search hits');
140
+ if (!input.saveHits || page.items.length < pageSize || (total !== undefined && offset + pageSize >= total))
141
+ break;
142
+ }
143
+ requests.push({ ...entry, total });
144
+ answered += 1;
145
+ }
146
+ catch (error) {
147
+ const failure = error instanceof Error ? error : new Error(String(error));
148
+ failures.push(failure);
149
+ requests.push({ ...entry, failed: failure.message });
150
+ }
151
+ }
152
+ // Every group failed: the first failure carries the right instruction (fix the filter,
153
+ // or fall back to downloads). A partial failure is reported per group instead.
154
+ if (answered === 0 && failures.length > 0)
155
+ throw failures[0];
156
+ hits.sort((a, b) => { var _a, _b; return Number((_a = b._score) !== null && _a !== void 0 ? _a : 0) - Number((_b = a._score) !== null && _b !== void 0 ? _b : 0); });
157
+ const results = [];
158
+ for (const hit of input.saveHits ? hits : hits.slice(0, MAX_DOC_HITS)) {
159
+ const source = ((_f = hit._source) !== null && _f !== void 0 ? _f : {});
160
+ const highlight = ((_g = hit.highlight) !== null && _g !== void 0 ? _g : {});
161
+ const fragments = Object.values(highlight).flat().slice(0, MAX_HIGHLIGHTS);
162
+ // An indexed document is the filing's metadata at the top level plus one sub-object
163
+ // for the document itself (form, rate, supporting, attachment, disposition …) that
164
+ // carries attachmentKey / attachmentText; objection letters keep their text top-level.
165
+ const document = Object.values(source).find((value) => !!value && typeof value === 'object' && !Array.isArray(value) && ('attachmentText' in value || 'attachmentKey' in value));
166
+ const textValue = (_j = (_h = document === null || document === void 0 ? void 0 : document.attachmentText) !== null && _h !== void 0 ? _h : source.attachmentText) !== null && _j !== void 0 ? _j : source.allMetadataText;
167
+ const text = typeof textValue === 'string' && textValue.length > 0 ? textValue : undefined;
168
+ const keyValue = (_l = (_k = document === null || document === void 0 ? void 0 : document.attachmentKey) !== null && _k !== void 0 ? _k : source.attachmentKey) !== null && _l !== void 0 ? _l : source.key;
169
+ const attachmentKey = typeof keyValue === 'string' ? keyValue : undefined;
170
+ const trackingNumber = String((_q = (_p = (_o = (_m = source.trackingNumber) !== null && _m !== void 0 ? _m : source.filingTrackingNumber) !== null && _o !== void 0 ? _o : source.resourceId) !== null && _p !== void 0 ? _p : hit._id) !== null && _q !== void 0 ? _q : 'unknown');
171
+ const name = String((_x = (_w = (_v = (_u = (_t = (_s = (_r = (attachmentKey ? decodeURIComponent(attachmentKey.slice(attachmentKey.lastIndexOf('/') + 1)) : undefined)) !== null && _r !== void 0 ? _r : document === null || document === void 0 ? void 0 : document.formNumber) !== null && _s !== void 0 ? _s : source.name) !== null && _t !== void 0 ? _t : source.attachmentName) !== null && _u !== void 0 ? _u : source.formNumber) !== null && _v !== void 0 ? _v : source.title) !== null && _w !== void 0 ? _w : hit._id) !== null && _x !== void 0 ? _x : 'document');
172
+ let textPath;
173
+ if (input.saveText && text) {
174
+ // Same path download_attachment / fetch_attachments use, so a later fetch finds it.
175
+ textPath = `data/text/${(0, shared_1.safeName)(trackingNumber)}/${(0, shared_1.safeName)(name).replace(/\.pdf$/i, '')}.txt`;
176
+ await (0, shared_1.writeWorkspaceFile)(workspaceDir, textPath, text);
177
+ }
178
+ results.push({
179
+ id: hit._id,
180
+ index: hit._index,
181
+ score: hit._score,
182
+ resourceType: source.resourceType,
183
+ filingId: source.filingId,
184
+ trackingNumber,
185
+ state: source.state,
186
+ filingType: source.filingType,
187
+ dateSubmitted: source.dateSubmitted,
188
+ name,
189
+ formNumber: (_y = document === null || document === void 0 ? void 0 : document.formNumber) !== null && _y !== void 0 ? _y : source.formNumber,
190
+ attachmentKey,
191
+ textChars: (_z = text === null || text === void 0 ? void 0 : text.length) !== null && _z !== void 0 ? _z : 0,
192
+ textPath,
193
+ highlights: fragments.map((fragment) => fragment.replace(/<\/?em>/g, '**').slice(0, 300)),
194
+ });
195
+ }
196
+ const matches = requests.reduce((sum, request) => { var _a; return sum + ((_a = request.total) !== null && _a !== void 0 ? _a : 0); }, 0);
197
+ if (!input.saveHits) {
198
+ return {
199
+ hits: results,
200
+ collected: hits.length,
201
+ totalMatches: matches || undefined,
202
+ truncated: hits.length > MAX_DOC_HITS || matches > results.length,
203
+ next: matches > results.length ? 'More hits exist: repeat with saveHits to collect them into a file.' : undefined,
204
+ requests,
205
+ };
206
+ }
207
+ // Merge into the hits file: a document already there (from an earlier query) keeps its row.
208
+ const target = node_path_1.default.resolve(workspaceDir, input.saveHits);
209
+ const previous = (await (0, shared_1.exists)(target)) ? await (0, shared_1.readManifest)(workspaceDir, input.saveHits) : [];
210
+ const known = new Set(previous.map((row) => String(row.id)));
211
+ const added = results.filter((row) => !known.has(String(row.id)));
212
+ const merged = [...previous, ...added.map((row) => ({ ...row, query: input.query }))];
213
+ const saved = await (0, shared_1.writeWorkspaceFile)(workspaceDir, input.saveHits, merged.map((row) => JSON.stringify(row)).join('\n') + (merged.length ? '\n' : ''));
214
+ return {
215
+ saveHits: saved.path,
216
+ collected: results.length,
217
+ added: added.length,
218
+ rowsInFile: merged.length,
219
+ totalMatches: matches || undefined,
220
+ // Past the 10,000-hit window the rest is unreachable for this query: split it by state or company.
221
+ beyondWindow: matches > SEARCH_RESULT_WINDOW ? matches - SEARCH_RESULT_WINDOW : undefined,
222
+ filings: new Set(results.map((row) => { var _a; return (_a = row.filingId) !== null && _a !== void 0 ? _a : row.trackingNumber; })).size,
223
+ byState: (0, shared_1.countBy)(results, (row) => row.state),
224
+ withText: results.filter((row) => Number(row.textChars) > 0).length,
225
+ sample: results.slice(0, shared_1.SAMPLE_ROWS).map((row) => ({ trackingNumber: row.trackingNumber, name: row.name, highlights: row.highlights.slice(0, 1) })),
226
+ requests,
227
+ };
228
+ },
229
+ });
230
+ }
231
+ //# sourceMappingURL=document-search-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-search-tool.js","sourceRoot":"","sources":["../../../src/research/filingramp/document-search-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type Tool } from 'ai';
2
+ import { type FilingRampToolsOptions } from './shared';
3
+ /** Walks a filing record and lists every attachment with where it sits in the filing. */
4
+ export declare function collectAttachments(filing: Record<string, unknown>): Array<Record<string, unknown>>;
5
+ /** Filing _id for an id or a SERFF tracking number, resolved inside the session scope. */
6
+ export declare function createFilingIdResolver(options: FilingRampToolsOptions): (id: string) => Promise<string>;
7
+ export declare function createFilingDetailTool(options: FilingRampToolsOptions): Tool;
8
+ //# sourceMappingURL=filing-detail-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filing-detail-tool.d.ts","sourceRoot":"","sources":["../../../src/research/filingramp/filing-detail-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,IAAI,EAAE,MAAM,IAAI,CAAA;AAGpC,OAAO,EAAoF,KAAK,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAKxI,yFAAyF;AACzF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAkClG;AAED,0FAA0F;AAC1F,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,sBAAsB,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CA6BvG;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAgF5E"}
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.collectAttachments = collectAttachments;
4
+ exports.createFilingIdResolver = createFilingIdResolver;
5
+ exports.createFilingDetailTool = createFilingDetailTool;
6
+ const ai_1 = require("ai");
7
+ const zod_1 = require("zod");
8
+ const scope_1 = require("../scope");
9
+ const shared_1 = require("./shared");
10
+ /** A get_filing answer above this size is saved and summarized instead of returned inline. */
11
+ const MAX_INLINE_FILING_CHARS = 12000;
12
+ /** Walks a filing record and lists every attachment with where it sits in the filing. */
13
+ function collectAttachments(filing) {
14
+ var _b, _c;
15
+ const out = [];
16
+ const sections = [
17
+ ['forms', 'formNumber'],
18
+ ['rates', 'name'],
19
+ ['supportings', 'name'],
20
+ ['dispositions', 'status'],
21
+ ];
22
+ for (const [section, labelField] of sections) {
23
+ const items = filing[section];
24
+ if (!Array.isArray(items))
25
+ continue;
26
+ for (const item of items) {
27
+ const attachments = Array.isArray(item.attachments) ? item.attachments : [];
28
+ for (const attachment of attachments) {
29
+ out.push({
30
+ section,
31
+ item: (_c = (_b = item[labelField]) !== null && _b !== void 0 ? _b : item.name) !== null && _c !== void 0 ? _c : item.title,
32
+ itemId: item._id,
33
+ action: item.action,
34
+ key: attachment.key,
35
+ name: attachment.name,
36
+ type: attachment.type,
37
+ size: attachment.size,
38
+ });
39
+ }
40
+ }
41
+ }
42
+ const objections = Array.isArray(filing.objections) ? filing.objections : [];
43
+ for (const letter of objections) {
44
+ for (const attachment of Array.isArray(letter.attachments) ? letter.attachments : []) {
45
+ out.push({ section: 'objections', item: letter.letterDate, key: attachment.key, name: attachment.name, size: attachment.size });
46
+ }
47
+ }
48
+ return out;
49
+ }
50
+ /** Filing _id for an id or a SERFF tracking number, resolved inside the session scope. */
51
+ function createFilingIdResolver(options) {
52
+ const { client, scope } = options;
53
+ const industryData = client.industryData;
54
+ // GET /v1/filings/:id takes the Mongo id only; a SERFF tracking number is resolved through
55
+ // the scoped filing search first, so the model can read a filing straight from a document hit.
56
+ const OBJECT_ID = /^[0-9a-f]{24}$/i;
57
+ const resolveFilingId = async (id) => {
58
+ if (OBJECT_ID.test(id))
59
+ return id;
60
+ const searchType = (0, scope_1.resolveSearchType)(scope, industryData);
61
+ const filters = (0, scope_1.scopeFilingsFilters)(scope, [{ field: 'trackingNumbers', comparisonOperator: 'in', value: [id] }]);
62
+ const payload = searchType === 'INDUSTRY'
63
+ ? await client.request('/v1/search/filings', {
64
+ method: 'POST',
65
+ body: { filters, limit: 1, offset: 0, searchType, sortKey: '_id', sortDirection: 1 },
66
+ })
67
+ : await client.request('/v2/search/filings', {
68
+ method: 'POST',
69
+ body: { filters, fields: ['_id', 'trackingNumber'], limit: 1, sortKey: '_id', sortDirection: 1, searchType },
70
+ });
71
+ const match = (0, shared_1.asRecordList)(payload)[0];
72
+ if (!(match === null || match === void 0 ? void 0 : match._id)) {
73
+ throw new Error(`No filing with tracking number ${id} inside the session scope. Use the filing _id (filingId on search_documents hits, _id on search_filings rows).`);
74
+ }
75
+ return String(match._id);
76
+ };
77
+ return resolveFilingId;
78
+ }
79
+ function createFilingDetailTool(options) {
80
+ const { client, workspaceDir } = options;
81
+ const resolveFilingId = createFilingIdResolver(options);
82
+ return (0, ai_1.tool)({
83
+ description: 'One filing: general information, forms, rates, supporting documents, objection letters, dispositions and every attachment (with the `key` downloads need). A small filing comes back inline. A large one, or any call with saveAs, is written to the workspace: the answer is then section counts, a few sample rows and two paths, the full filing JSON (query it with jq/python) and an attachments manifest (JSONL) to pass to fetch_attachments.',
84
+ inputSchema: zod_1.z.object({
85
+ id: zod_1.z.string().min(1).max(100).describe('Filing _id (filingId on search_documents hits) or SERFF tracking number'),
86
+ include: zod_1.z.array(zod_1.z.enum(['general', 'forms', 'rates', 'supportings', 'objections', 'dispositions', 'attachments'])).optional(),
87
+ saveAs: zod_1.z.string().max(200).optional().describe('Workspace path for the full filing JSON (default data/filings/<trackingNumber>.json when the filing is large)'),
88
+ }),
89
+ execute: async (input) => {
90
+ var _b, _c, _d, _e;
91
+ const filingId = await resolveFilingId(input.id);
92
+ const filing = await client.request(`/v1/filings/${encodeURIComponent(filingId)}`);
93
+ const include = new Set((_b = input.include) !== null && _b !== void 0 ? _b : ['general', 'attachments']);
94
+ const header = {
95
+ _id: filing._id,
96
+ trackingNumber: filing.trackingNumber,
97
+ state: filing.state,
98
+ statusId: filing.statusId,
99
+ status: filing.status,
100
+ filingType: filing.filingType,
101
+ typeOfInsurance: filing.typeOfInsurance,
102
+ subTypeOfInsurance: filing.subTypeOfInsurance,
103
+ dateSubmitted: filing.dateSubmitted,
104
+ companyNames: Array.isArray(filing.companies) ? filing.companies.map((c) => c.name) : undefined,
105
+ };
106
+ const out = { ...header };
107
+ if (include.has('general'))
108
+ out.generalInformation = filing.generalInformation;
109
+ const sections = ['forms', 'rates', 'supportings', 'objections', 'dispositions'];
110
+ for (const section of sections) {
111
+ if (!include.has(section))
112
+ continue;
113
+ const items = Array.isArray(filing[section]) ? filing[section] : [];
114
+ out[section] = items.map((item) => {
115
+ const { attachments: _a, ...rest } = item;
116
+ return rest;
117
+ });
118
+ }
119
+ const attachments = collectAttachments(filing);
120
+ if (include.has('attachments'))
121
+ out.attachments = attachments;
122
+ if (!input.saveAs && JSON.stringify(out).length <= MAX_INLINE_FILING_CHARS)
123
+ return { filing: out };
124
+ // Large or explicitly saved: the data goes to disk, the conversation gets its shape.
125
+ const folder = (0, shared_1.safeName)(String((_c = filing.trackingNumber) !== null && _c !== void 0 ? _c : filingId));
126
+ const saved = await (0, shared_1.writeWorkspaceFile)(workspaceDir, (_d = input.saveAs) !== null && _d !== void 0 ? _d : `data/filings/${folder}.json`, JSON.stringify(filing, null, 2));
127
+ const manifestRows = attachments.map((attachment) => {
128
+ var _b;
129
+ return ({
130
+ filingId,
131
+ trackingNumber: filing.trackingNumber,
132
+ ...attachment,
133
+ stem: (0, shared_1.attachmentStem)(String((_b = attachment.name) !== null && _b !== void 0 ? _b : '')),
134
+ });
135
+ });
136
+ const manifest = await (0, shared_1.writeWorkspaceFile)(workspaceDir, `data/manifests/${folder}-attachments.jsonl`, manifestRows.map((row) => JSON.stringify(row)).join('\n') + (manifestRows.length ? '\n' : ''));
137
+ const stems = (0, shared_1.countBy)(manifestRows, (row) => row.stem);
138
+ const sectionCounts = Object.fromEntries(sections.map((section) => [section, Array.isArray(filing[section]) ? filing[section].length : 0]));
139
+ const generalChars = JSON.stringify((_e = filing.generalInformation) !== null && _e !== void 0 ? _e : null).length;
140
+ return {
141
+ filing: {
142
+ ...header,
143
+ // General information is the filing's own description; keep it when it is small.
144
+ generalInformation: include.has('general') && generalChars <= 4000 ? filing.generalInformation : undefined,
145
+ },
146
+ sections: sectionCounts,
147
+ attachments: {
148
+ count: manifestRows.length,
149
+ bySection: (0, shared_1.countBy)(manifestRows, (row) => row.section),
150
+ // Same stem, several files (form + mock, clean + redline): decide whether to read both.
151
+ variantGroups: Object.values(stems).filter((count) => count > 1).length,
152
+ sample: manifestRows.slice(0, shared_1.SAMPLE_ROWS).map((row) => ({ section: row.section, item: row.item, name: row.name })),
153
+ },
154
+ saved,
155
+ manifest,
156
+ next: 'Query the saved JSON with jq/python for details. To read the documents, call fetch_attachments with this manifest once; never download them one by one.',
157
+ };
158
+ },
159
+ });
160
+ }
161
+ //# sourceMappingURL=filing-detail-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filing-detail-tool.js","sourceRoot":"","sources":["../../../src/research/filingramp/filing-detail-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type Tool } from 'ai';
2
+ import { type FilingRampToolsOptions } from './shared';
3
+ export declare function createFilingSearchTools(options: FilingRampToolsOptions): Record<string, Tool>;
4
+ //# sourceMappingURL=filing-search-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filing-search-tools.d.ts","sourceRoot":"","sources":["../../../src/research/filingramp/filing-search-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,KAAK,IAAI,EAAE,MAAM,IAAI,CAAA;AAIpC,OAAO,EAAiF,KAAK,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAgCrI,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAoK7F"}