@zhixuan92/multi-model-agent-core 4.7.8 → 4.7.9
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/config/schema.d.ts +6 -2
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +6 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/events/to-wire-record.d.ts.map +1 -1
- package/dist/events/to-wire-record.js +24 -2
- package/dist/events/to-wire-record.js.map +1 -1
- package/dist/events/wire-schema.d.ts +10 -10
- package/dist/lifecycle/handlers/annotate-stage.d.ts.map +1 -1
- package/dist/lifecycle/handlers/annotate-stage.js +9 -1
- package/dist/lifecycle/handlers/annotate-stage.js.map +1 -1
- package/dist/lifecycle/handlers/review-stage.js +7 -2
- package/dist/lifecycle/handlers/review-stage.js.map +1 -1
- package/dist/lifecycle/perform-implementation.d.ts.map +1 -1
- package/dist/lifecycle/perform-implementation.js +38 -5
- package/dist/lifecycle/perform-implementation.js.map +1 -1
- package/dist/lifecycle/research-pre-loop.d.ts +21 -0
- package/dist/lifecycle/research-pre-loop.d.ts.map +1 -0
- package/dist/lifecycle/research-pre-loop.js +54 -0
- package/dist/lifecycle/research-pre-loop.js.map +1 -0
- package/dist/lifecycle/task-executor.js +1 -1
- package/dist/lifecycle/task-executor.js.map +1 -1
- package/dist/lifecycle/tool-config-types.d.ts +1 -1
- package/dist/lifecycle/tool-config-types.d.ts.map +1 -1
- package/dist/providers/runner-types.d.ts +0 -6
- package/dist/providers/runner-types.d.ts.map +1 -1
- package/dist/research/adapters/arxiv.d.ts.map +1 -1
- package/dist/research/adapters/arxiv.js +5 -1
- package/dist/research/adapters/arxiv.js.map +1 -1
- package/dist/research/adapters/github-search.d.ts +1 -0
- package/dist/research/adapters/github-search.d.ts.map +1 -1
- package/dist/research/adapters/github-search.js +15 -12
- package/dist/research/adapters/github-search.js.map +1 -1
- package/dist/research/adapters/index.d.ts +5 -1
- package/dist/research/adapters/index.d.ts.map +1 -1
- package/dist/research/adapters/index.js +7 -3
- package/dist/research/adapters/index.js.map +1 -1
- package/dist/research/adapters/semantic-scholar.d.ts +1 -0
- package/dist/research/adapters/semantic-scholar.d.ts.map +1 -1
- package/dist/research/adapters/semantic-scholar.js +11 -1
- package/dist/research/adapters/semantic-scholar.js.map +1 -1
- package/dist/research/evidence-pack.d.ts +33 -0
- package/dist/research/evidence-pack.d.ts.map +1 -0
- package/dist/research/evidence-pack.js +132 -0
- package/dist/research/evidence-pack.js.map +1 -0
- package/dist/research/index.d.ts +1 -2
- package/dist/research/index.d.ts.map +1 -1
- package/dist/research/index.js +1 -3
- package/dist/research/index.js.map +1 -1
- package/dist/research/orchestrator.d.ts +24 -0
- package/dist/research/orchestrator.d.ts.map +1 -0
- package/dist/research/orchestrator.js +162 -0
- package/dist/research/orchestrator.js.map +1 -0
- package/dist/research/query-plan.d.ts +18 -0
- package/dist/research/query-plan.d.ts.map +1 -0
- package/dist/research/query-plan.js +36 -0
- package/dist/research/query-plan.js.map +1 -0
- package/dist/research/user-agent.d.ts +5 -0
- package/dist/research/user-agent.d.ts.map +1 -0
- package/dist/research/user-agent.js +17 -0
- package/dist/research/user-agent.js.map +1 -0
- package/dist/research/web-fetch.d.ts +6 -21
- package/dist/research/web-fetch.d.ts.map +1 -1
- package/dist/research/web-fetch.js +97 -58
- package/dist/research/web-fetch.js.map +1 -1
- package/dist/research/web-search.d.ts.map +1 -1
- package/dist/research/web-search.js +2 -0
- package/dist/research/web-search.js.map +1 -1
- package/dist/review/parse-review-report.d.ts.map +1 -1
- package/dist/review/parse-review-report.js +9 -2
- package/dist/review/parse-review-report.js.map +1 -1
- package/dist/tools/research/brief-slot.d.ts +17 -0
- package/dist/tools/research/brief-slot.d.ts.map +1 -1
- package/dist/tools/research/brief-slot.js +61 -0
- package/dist/tools/research/brief-slot.js.map +1 -1
- package/dist/tools/research/implementer-criteria.d.ts +4 -11
- package/dist/tools/research/implementer-criteria.d.ts.map +1 -1
- package/dist/tools/research/implementer-criteria.js +77 -14
- package/dist/tools/research/implementer-criteria.js.map +1 -1
- package/dist/tools/research/tool-config.d.ts.map +1 -1
- package/dist/tools/research/tool-config.js +10 -2
- package/dist/tools/research/tool-config.js.map +1 -1
- package/dist/tools/research/two-turn-driver.d.ts +20 -0
- package/dist/tools/research/two-turn-driver.d.ts.map +1 -0
- package/dist/tools/research/two-turn-driver.js +41 -0
- package/dist/tools/research/two-turn-driver.js.map +1 -0
- package/dist/types/config.d.ts +2 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/enums.d.ts +3 -3
- package/dist/types/task-spec.d.ts +14 -10
- package/dist/types/task-spec.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/research/types.d.ts +0 -14
- package/dist/research/types.d.ts.map +0 -1
- package/dist/research/types.js +0 -2
- package/dist/research/types.js.map +0 -1
|
@@ -1,6 +1,23 @@
|
|
|
1
|
+
// packages/core/src/research/web-fetch.ts
|
|
2
|
+
//
|
|
3
|
+
// Replaces the previous IP-pinning dispatcher (which failed 100% of real
|
|
4
|
+
// requests on Node 25 / undici current) with a connect-callback re-validation
|
|
5
|
+
// SSRF guard: undici resolves the host normally; the connect callback compares
|
|
6
|
+
// the resolved IP against ssrf-guard's public-IP classification and aborts
|
|
7
|
+
// the connection if it's private/loopback/metadata. validateAndPinURL still
|
|
8
|
+
// runs first as the pre-request defense.
|
|
1
9
|
import { request, Agent } from 'undici';
|
|
10
|
+
import { USER_AGENT } from './user-agent.js';
|
|
2
11
|
import { wrapFetchedContent } from './untrusted-content.js';
|
|
3
|
-
import {
|
|
12
|
+
import { classifyIP } from './ssrf-guard.js';
|
|
13
|
+
import { REDIRECT_ERR_CODE_MAP, validateAndPinURL, extractContentType, isRedirect, extractLocation, extractBodyFromHTML, stripCredentialsFromURL, readBody, drainBody, mapRequestError, } from './web-fetch-helpers.js';
|
|
14
|
+
const ALLOWED_CT = new Set([
|
|
15
|
+
'text/html', 'text/plain',
|
|
16
|
+
'application/xml', 'application/atom+xml', 'application/rss+xml',
|
|
17
|
+
'application/json',
|
|
18
|
+
]);
|
|
19
|
+
const RETURNED_TEXT_CAP = 64 * 1024;
|
|
20
|
+
/** @deprecated — kept for test compatibility; no longer used in production. */
|
|
4
21
|
export const defaultIPPinningDispatcher = (host, pinnedIP, cfg) => new Agent({
|
|
5
22
|
connect: {
|
|
6
23
|
lookup: (_h, _o, cb) => cb(null, pinnedIP, pinnedIP.includes(':') ? 6 : 4),
|
|
@@ -8,21 +25,51 @@ export const defaultIPPinningDispatcher = (host, pinnedIP, cfg) => new Agent({
|
|
|
8
25
|
},
|
|
9
26
|
connectTimeout: cfg.connectTimeoutMs,
|
|
10
27
|
});
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
28
|
+
/** Build a shared agent that re-validates the resolved IP at connect time. */
|
|
29
|
+
function makeConnectGuardAgent(allowPrivateNetwork, testResolvedIp, connectTimeoutMs) {
|
|
30
|
+
return new Agent({
|
|
31
|
+
connect: {
|
|
32
|
+
lookup: (host, _opts, cb) => {
|
|
33
|
+
// If test seam present, return that IP; otherwise let Node resolve.
|
|
34
|
+
if (testResolvedIp) {
|
|
35
|
+
const fam = testResolvedIp.includes(':') ? 6 : 4;
|
|
36
|
+
// Re-validate test IP via ssrf-guard classification.
|
|
37
|
+
if (!allowPrivateNetwork) {
|
|
38
|
+
const klass = classifyIP(testResolvedIp);
|
|
39
|
+
if (klass !== 'public') {
|
|
40
|
+
cb(new Error('web_fetch_ssrf_postresolve_block'), '', 4);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
cb(null, testResolvedIp, fam);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// Production path: defer to Node's default lookup then re-validate.
|
|
48
|
+
import('node:dns').then(({ lookup }) => {
|
|
49
|
+
lookup(host, (err, address, family) => {
|
|
50
|
+
if (err) {
|
|
51
|
+
cb(err, '', 4);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (!allowPrivateNetwork) {
|
|
55
|
+
const klass = classifyIP(address);
|
|
56
|
+
if (klass !== 'public') {
|
|
57
|
+
cb(new Error('web_fetch_ssrf_postresolve_block'), '', 4);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
cb(null, address, family);
|
|
62
|
+
});
|
|
63
|
+
}).catch(e => cb(e, '', 4));
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
connectTimeout: connectTimeoutMs,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
21
69
|
export async function webFetch(input) {
|
|
22
70
|
const { cfg, hostAllowlist } = input;
|
|
23
71
|
const privateNetworkHosts = input.privateNetworkHosts ?? new Set();
|
|
24
72
|
let credentialsStripped = false;
|
|
25
|
-
// Strip credentials BEFORE any logging. Mutate to avoid leaking via toString.
|
|
26
73
|
let initial;
|
|
27
74
|
try {
|
|
28
75
|
initial = new URL(input.url);
|
|
@@ -31,15 +78,12 @@ export async function webFetch(input) {
|
|
|
31
78
|
return { status: 'error', reasonCode: 'web_fetch_invalid_url', credentialsStripped };
|
|
32
79
|
}
|
|
33
80
|
credentialsStripped = stripCredentialsFromURL(initial);
|
|
34
|
-
// Total-deadline AbortController scopes the entire op (including DNS, redirects, body reads).
|
|
35
81
|
const totalCtrl = new AbortController();
|
|
36
82
|
const totalTimer = setTimeout(() => totalCtrl.abort(), cfg.totalDeadlineMs);
|
|
37
83
|
try {
|
|
38
84
|
let currentURL = initial.toString();
|
|
39
85
|
let redirects = 0;
|
|
40
86
|
while (true) {
|
|
41
|
-
// validateAndPinURL is raced against totalCtrl.signal so a hanging DNS
|
|
42
|
-
// resolver (including injected resolveIP) cannot exceed totalDeadlineMs.
|
|
43
87
|
let v;
|
|
44
88
|
try {
|
|
45
89
|
v = await validateAndPinURL(currentURL, hostAllowlist, privateNetworkHosts, input.resolveIP, totalCtrl.signal);
|
|
@@ -57,38 +101,53 @@ export async function webFetch(input) {
|
|
|
57
101
|
}
|
|
58
102
|
return { status: 'error', reasonCode: v.reasonCode, host: v.host, credentialsStripped };
|
|
59
103
|
}
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
|
|
63
|
-
|
|
104
|
+
// Honor createDispatcher hook for tests: when present, use whatever it
|
|
105
|
+
// returns (or skip dispatcher entirely if undefined → MockAgent
|
|
106
|
+
// intercepts via global). In production, fall back to the connect-guard
|
|
107
|
+
// agent for post-resolve SSRF re-validation.
|
|
108
|
+
let agent;
|
|
109
|
+
if (input.createDispatcher !== undefined) {
|
|
110
|
+
agent = input.createDispatcher(v.host, v.pinnedIP, cfg);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
agent = makeConnectGuardAgent(cfg.allowPrivateNetwork ?? false, input._testConnectResolvedIp, cfg.connectTimeoutMs);
|
|
114
|
+
}
|
|
115
|
+
const closeAgent = async () => {
|
|
116
|
+
if (agent && typeof agent.close === 'function') {
|
|
117
|
+
try {
|
|
118
|
+
await agent.close();
|
|
119
|
+
}
|
|
120
|
+
catch { /* ignore */ }
|
|
121
|
+
}
|
|
122
|
+
};
|
|
64
123
|
let res;
|
|
65
124
|
try {
|
|
66
|
-
// undici 8 `request()` does not follow redirects by default; we handle
|
|
67
|
-
// them manually below to re-validate against the per-task allowlist.
|
|
68
125
|
res = await request(v.url.toString(), {
|
|
69
126
|
method: 'GET',
|
|
70
127
|
headersTimeout: cfg.connectTimeoutMs,
|
|
71
|
-
|
|
128
|
+
headers: { 'user-agent': USER_AGENT },
|
|
129
|
+
...(agent ? { dispatcher: agent } : {}),
|
|
72
130
|
signal: totalCtrl.signal,
|
|
73
131
|
});
|
|
74
132
|
}
|
|
75
133
|
catch (e) {
|
|
76
|
-
|
|
77
|
-
|
|
134
|
+
await closeAgent();
|
|
135
|
+
// Map our connect-callback abort to a stable reasonCode.
|
|
136
|
+
const msg = e?.message ?? '';
|
|
137
|
+
if (msg.includes('web_fetch_ssrf_postresolve_block')) {
|
|
138
|
+
return { status: 'error', reasonCode: 'web_fetch_ssrf_postresolve_block', host: v.host, credentialsStripped };
|
|
139
|
+
}
|
|
78
140
|
return { ...mapRequestError(e, totalCtrl.signal, v.host), credentialsStripped };
|
|
79
141
|
}
|
|
80
|
-
// Handle redirects manually (maxRedirections: 0 on undici)
|
|
81
142
|
if (isRedirect(res.statusCode)) {
|
|
82
143
|
redirects++;
|
|
83
144
|
if (redirects > cfg.maxRedirects) {
|
|
84
|
-
|
|
85
|
-
closeDispatcher(dispatcher);
|
|
145
|
+
await closeAgent();
|
|
86
146
|
return { status: 'error', reasonCode: 'web_fetch_too_many_redirects', host: v.host, credentialsStripped };
|
|
87
147
|
}
|
|
88
148
|
const location = extractLocation(res.headers);
|
|
89
149
|
if (!location) {
|
|
90
|
-
|
|
91
|
-
closeDispatcher(dispatcher);
|
|
150
|
+
await closeAgent();
|
|
92
151
|
return { status: 'error', reasonCode: 'web_fetch_redirect_missing_location', host: v.host, credentialsStripped };
|
|
93
152
|
}
|
|
94
153
|
let nextURL;
|
|
@@ -96,34 +155,27 @@ export async function webFetch(input) {
|
|
|
96
155
|
nextURL = new URL(location, v.url);
|
|
97
156
|
}
|
|
98
157
|
catch {
|
|
99
|
-
|
|
100
|
-
closeDispatcher(dispatcher);
|
|
158
|
+
await closeAgent();
|
|
101
159
|
return { status: 'error', reasonCode: 'web_fetch_redirect_invalid_url', host: v.host, credentialsStripped };
|
|
102
160
|
}
|
|
103
161
|
credentialsStripped = stripCredentialsFromURL(nextURL) || credentialsStripped;
|
|
104
162
|
currentURL = nextURL.toString();
|
|
105
|
-
// Drain redirect body with cap to free connection
|
|
106
163
|
await drainBody(res.body, totalCtrl.signal);
|
|
107
|
-
|
|
108
|
-
closeDispatcher(dispatcher);
|
|
164
|
+
await closeAgent();
|
|
109
165
|
if (totalCtrl.signal.aborted) {
|
|
110
166
|
return { status: 'error', reasonCode: 'web_fetch_timeout', host: v.host, credentialsStripped };
|
|
111
167
|
}
|
|
112
168
|
continue;
|
|
113
169
|
}
|
|
114
|
-
// Check content type. Missing content-type (empty) is allowed through;
|
|
115
|
-
// only explicit unsupported types are rejected.
|
|
116
170
|
const contentType = extractContentType(res.headers);
|
|
117
171
|
if (contentType && !ALLOWED_CT.has(contentType)) {
|
|
118
172
|
await drainBody(res.body, totalCtrl.signal);
|
|
119
|
-
|
|
120
|
-
closeDispatcher(dispatcher);
|
|
173
|
+
await closeAgent();
|
|
121
174
|
if (totalCtrl.signal.aborted) {
|
|
122
175
|
return { status: 'error', reasonCode: 'web_fetch_timeout', host: v.host, credentialsStripped };
|
|
123
176
|
}
|
|
124
177
|
return { status: 'error', reasonCode: 'web_fetch_unsupported_content_type', host: v.host, credentialsStripped };
|
|
125
178
|
}
|
|
126
|
-
// Read body with size cap. Stream errors map to web_fetch_body_read_failed.
|
|
127
179
|
let rawText;
|
|
128
180
|
let bytesReturned;
|
|
129
181
|
let truncated;
|
|
@@ -135,8 +187,7 @@ export async function webFetch(input) {
|
|
|
135
187
|
truncated = result.truncated;
|
|
136
188
|
}
|
|
137
189
|
catch (e) {
|
|
138
|
-
|
|
139
|
-
closeDispatcher(dispatcher);
|
|
190
|
+
await closeAgent();
|
|
140
191
|
if (e instanceof DOMException && e.name === 'AbortError') {
|
|
141
192
|
return { status: 'error', reasonCode: 'web_fetch_timeout', host: v.host, credentialsStripped };
|
|
142
193
|
}
|
|
@@ -145,33 +196,21 @@ export async function webFetch(input) {
|
|
|
145
196
|
}
|
|
146
197
|
return { status: 'error', reasonCode: 'web_fetch_body_read_failed', host: v.host, credentialsStripped };
|
|
147
198
|
}
|
|
148
|
-
|
|
149
|
-
closeDispatcher(dispatcher);
|
|
150
|
-
// Extract content for the worker-facing body
|
|
199
|
+
await closeAgent();
|
|
151
200
|
let extracted = rawText;
|
|
152
|
-
if (contentType === 'text/html')
|
|
201
|
+
if (contentType === 'text/html')
|
|
153
202
|
extracted = extractBodyFromHTML(rawText);
|
|
154
|
-
}
|
|
155
|
-
// Apply post-extraction text cap
|
|
156
203
|
let textTruncated = false;
|
|
157
204
|
if (extracted.length > RETURNED_TEXT_CAP) {
|
|
158
205
|
extracted = extracted.slice(0, RETURNED_TEXT_CAP);
|
|
159
206
|
textTruncated = true;
|
|
160
207
|
}
|
|
161
208
|
const wrapped = wrapFetchedContent({
|
|
162
|
-
url: v.url.toString(),
|
|
163
|
-
host: v.host,
|
|
164
|
-
content: extracted,
|
|
209
|
+
url: v.url.toString(), host: v.host, content: extracted,
|
|
165
210
|
});
|
|
166
211
|
return {
|
|
167
|
-
status: 'ok',
|
|
168
|
-
|
|
169
|
-
rawText,
|
|
170
|
-
host: v.host,
|
|
171
|
-
bytesReturned,
|
|
172
|
-
truncated,
|
|
173
|
-
textTruncated,
|
|
174
|
-
credentialsStripped,
|
|
212
|
+
status: 'ok', body: wrapped, rawText, host: v.host,
|
|
213
|
+
bytesReturned, truncated, textTruncated, credentialsStripped,
|
|
175
214
|
};
|
|
176
215
|
}
|
|
177
216
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../src/research/web-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EACL,qBAAqB,
|
|
1
|
+
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../src/research/web-fetch.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,yEAAyE;AACzE,8EAA8E;AAC9E,+EAA+E;AAC/E,2EAA2E;AAC3E,4EAA4E;AAC5E,yCAAyC;AAEzC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,qBAAqB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,UAAU,EACxE,eAAe,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,QAAQ,EACvE,SAAS,EAAE,eAAe,GAE3B,MAAM,wBAAwB,CAAC;AA2BhC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,WAAW,EAAE,YAAY;IACzB,iBAAiB,EAAE,sBAAsB,EAAE,qBAAqB;IAChE,kBAAkB;CACnB,CAAC,CAAC;AACH,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,CAAC;AAEpC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAE,GAA4B,EAAE,EAAE,CACzG,IAAI,KAAK,CAAC;IACR,OAAO,EAAE;QACP,MAAM,EAAE,CAAC,EAAU,EAAE,EAAW,EAAE,EAA+D,EAAE,EAAE,CACnG,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,UAAU,EAAE,IAAI;KACjB;IACD,cAAc,EAAE,GAAG,CAAC,gBAAgB;CACrC,CAAC,CAAC;AAEL,8EAA8E;AAC9E,SAAS,qBAAqB,CAC5B,mBAA4B,EAC5B,cAAkC,EAClC,gBAAwB;IAExB,OAAO,IAAI,KAAK,CAAC;QACf,OAAO,EAAE;YACP,MAAM,EAAE,CAAC,IAAY,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBAClC,oEAAoE;gBACpE,IAAI,cAAc,EAAE,CAAC;oBACnB,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACjD,qDAAqD;oBACrD,IAAI,CAAC,mBAAmB,EAAE,CAAC;wBACzB,MAAM,KAAK,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;wBACzC,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;4BACvB,EAAE,CAAC,IAAI,KAAK,CAAC,kCAAkC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;4BACzD,OAAO;wBACT,CAAC;oBACH,CAAC;oBACD,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,GAAY,CAAC,CAAC;oBACvC,OAAO;gBACT,CAAC;gBACD,oEAAoE;gBACpE,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;oBACrC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;wBACpC,IAAI,GAAG,EAAE,CAAC;4BAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;4BAAC,OAAO;wBAAC,CAAC;wBACpC,IAAI,CAAC,mBAAmB,EAAE,CAAC;4BACzB,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;4BAClC,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gCACvB,EAAE,CAAC,IAAI,KAAK,CAAC,kCAAkC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;gCACzD,OAAO;4BACT,CAAC;wBACH,CAAC;wBACD,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAe,CAAC,CAAC;oBACrC,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC;SACF;QACD,cAAc,EAAE,gBAAgB;KACjC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAoB;IACjD,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC;IACrC,MAAM,mBAAmB,GAAG,KAAK,CAAC,mBAAmB,IAAI,IAAI,GAAG,EAAU,CAAC;IAC3E,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAEhC,IAAI,OAAY,CAAC;IACjB,IAAI,CAAC;QAAC,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IACrC,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,CAAC;IAAC,CAAC;IAC/F,mBAAmB,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAEvD,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;IAE5E,IAAI,CAAC;QACH,IAAI,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QACpC,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAkC,CAAC;YACvC,IAAI,CAAC;gBACH,CAAC,GAAG,MAAM,iBAAiB,CACzB,UAAU,EAAE,aAAa,EAAE,mBAAmB,EAC9C,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,CAClC,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,YAAY,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBACzD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,CAAC;gBACnF,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,iCAAiC,EAAE,mBAAmB,EAAE,CAAC;YACjG,CAAC;YACD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBACV,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;oBAClB,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;oBACnE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC;gBACpF,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC;YAC1F,CAAC;YAED,uEAAuE;YACvE,gEAAgE;YAChE,wEAAwE;YACxE,6CAA6C;YAC7C,IAAI,KAA8C,CAAC;YACnD,IAAI,KAAK,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACzC,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,qBAAqB,CAC3B,GAAG,CAAC,mBAAmB,IAAI,KAAK,EAChC,KAAK,CAAC,sBAAsB,EAC5B,GAAG,CAAC,gBAAgB,CACrB,CAAC;YACJ,CAAC;YACD,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;gBAC5B,IAAI,KAAK,IAAI,OAAQ,KAAyC,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;oBACpF,IAAI,CAAC;wBAAC,MAAO,KAAwC,CAAC,KAAK,EAAE,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;gBACzF,CAAC;YACH,CAAC,CAAC;YAEF,IAAI,GAAG,CAAC;YACR,IAAI,CAAC;gBACH,GAAG,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;oBACpC,MAAM,EAAE,KAAK;oBACb,cAAc,EAAE,GAAG,CAAC,gBAAgB;oBACpC,OAAO,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE;oBACrC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvC,MAAM,EAAE,SAAS,CAAC,MAAM;iBACzB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBACpB,MAAM,UAAU,EAAE,CAAC;gBACnB,yDAAyD;gBACzD,MAAM,GAAG,GAAI,CAA0B,EAAE,OAAO,IAAI,EAAE,CAAC;gBACvD,IAAI,GAAG,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE,CAAC;oBACrD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,kCAAkC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC;gBAChH,CAAC;gBACD,OAAO,EAAE,GAAG,eAAe,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,mBAAmB,EAAE,CAAC;YAClF,CAAC;YAED,IAAI,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/B,SAAS,EAAE,CAAC;gBACZ,IAAI,SAAS,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;oBACjC,MAAM,UAAU,EAAE,CAAC;oBACnB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,8BAA8B,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC;gBAC5G,CAAC;gBACD,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,OAA4C,CAAC,CAAC;gBACnF,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,UAAU,EAAE,CAAC;oBACnB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,qCAAqC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC;gBACnH,CAAC;gBACD,IAAI,OAAY,CAAC;gBACjB,IAAI,CAAC;oBAAC,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;gBAAC,CAAC;gBAC3C,MAAM,CAAC;oBAAC,MAAM,UAAU,EAAE,CAAC;oBAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,gCAAgC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC;gBAAC,CAAC;gBAC1I,mBAAmB,GAAG,uBAAuB,CAAC,OAAO,CAAC,IAAI,mBAAmB,CAAC;gBAC9E,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAChC,MAAM,SAAS,CAAC,GAAG,CAAC,IAAqC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC7E,MAAM,UAAU,EAAE,CAAC;gBACnB,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBAC7B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC;gBACjG,CAAC;gBACD,SAAS;YACX,CAAC;YAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAA4C,CAAC,CAAC;YACzF,IAAI,WAAW,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChD,MAAM,SAAS,CAAC,GAAG,CAAC,IAAqC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC7E,MAAM,UAAU,EAAE,CAAC;gBACnB,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBAC7B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC;gBACjG,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,oCAAoC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC;YAClH,CAAC;YAED,IAAI,OAAe,CAAC;YAAC,IAAI,aAAqB,CAAC;YAAC,IAAI,SAAkB,CAAC;YACvE,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,GAAG,CAAC,IAAwC,CAAC;gBAC7D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC3E,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;gBAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;gBAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;YAC5F,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,UAAU,EAAE,CAAC;gBACnB,IAAI,CAAC,YAAY,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBACzD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC;gBACjG,CAAC;gBACD,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBAC7B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC;gBACjG,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,4BAA4B,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC;YAC1G,CAAC;YACD,MAAM,UAAU,EAAE,CAAC;YAEnB,IAAI,SAAS,GAAG,OAAO,CAAC;YACxB,IAAI,WAAW,KAAK,WAAW;gBAAE,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAE1E,IAAI,aAAa,GAAG,KAAK,CAAC;YAC1B,IAAI,SAAS,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;gBACzC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;gBAClD,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;YAED,MAAM,OAAO,GAAG,kBAAkB,CAAC;gBACjC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS;aACxD,CAAC,CAAC;YACH,OAAO;gBACL,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;gBAClD,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,mBAAmB;aAC7D,CAAC;QACJ,CAAC;IACH,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/research/web-search.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/research/web-search.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,WAAW,iBAAiB;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;CAAE;AACnF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;CACjE;AAsBD,qBAAa,WAAW;IAcpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAbtB,OAAO,CAAC,YAAY,CAAK;IAMzB,OAAO,CAAC,SAAS,CAAoC;IAGrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;gBAGpB,GAAG,EAAE,cAAc,CAAC,OAAO,CAAC,EAC7C,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAA;KAAE;YAM3D,gBAAgB;IAmBxB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CA0E/E"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { request } from 'undici';
|
|
2
|
+
import { USER_AGENT } from './user-agent.js';
|
|
2
3
|
function validateBraveResults(body) {
|
|
3
4
|
if (body == null || typeof body !== 'object')
|
|
4
5
|
return [];
|
|
@@ -92,6 +93,7 @@ export class BraveClient {
|
|
|
92
93
|
method: 'GET',
|
|
93
94
|
headers: {
|
|
94
95
|
'accept': 'application/json',
|
|
96
|
+
'user-agent': USER_AGENT,
|
|
95
97
|
'x-subscription-token': key,
|
|
96
98
|
},
|
|
97
99
|
signal: ctrl.signal,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/research/web-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/research/web-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-review-report.d.ts","sourceRoot":"","sources":["../../src/review/parse-review-report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,UAAU,GAAG,kBAAkB,CAAC;IACzC,QAAQ,EAAE,KAAK,CAAC;QACd,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;QACjD,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;CACJ;AAKD,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;AAEvE,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,aAAa,GAAE,SAAS,mBAAmB,EAAyC,EACpF,QAAQ,CAAC,EAAE,QAAQ,GAClB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"parse-review-report.d.ts","sourceRoot":"","sources":["../../src/review/parse-review-report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,UAAU,GAAG,kBAAkB,CAAC;IACzC,QAAQ,EAAE,KAAK,CAAC;QACd,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;QACjD,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;CACJ;AAKD,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;AAEvE,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,aAAa,GAAE,SAAS,mBAAmB,EAAyC,EACpF,QAAQ,CAAC,EAAE,QAAQ,GAClB,kBAAkB,CAsCpB"}
|
|
@@ -24,8 +24,15 @@ export function parseReviewReport(text, legalOutcomes = ['found', 'clean', 'not_
|
|
|
24
24
|
: '';
|
|
25
25
|
const result = parseFindings(findingsSection, 'reviewer', legalOutcomes, warnSink);
|
|
26
26
|
const findings = result.findings;
|
|
27
|
-
//
|
|
28
|
-
|
|
27
|
+
// Severity-gated verdict override. The reviewer prompt is explicit that
|
|
28
|
+
// "approved" means ship-able and that medium/low findings are nice-to-fix,
|
|
29
|
+
// not blockers (see review/templates/quality-review.ts:23-24). A blanket
|
|
30
|
+
// "any finding flips approved → changes_required" rule contradicted that
|
|
31
|
+
// contract and triggered a full rework cycle for a single low-severity
|
|
32
|
+
// nit. Only critical/high findings are blockers, matching the ladder the
|
|
33
|
+
// LLM was instructed to use.
|
|
34
|
+
if (verdict === 'approved'
|
|
35
|
+
&& findings.some(f => f.severity === 'critical' || f.severity === 'high')) {
|
|
29
36
|
verdict = 'changes_required';
|
|
30
37
|
}
|
|
31
38
|
return { verdict, findings };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-review-report.js","sourceRoot":"","sources":["../../src/review/parse-review-report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAchE,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAC7C,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAI/C,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,gBAAgD,CAAC,OAAO,EAAE,OAAO,EAAE,gBAAgB,CAAC,EACpF,QAAmB;IAEnB,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAElD,IAAI,OAAO,GAAoC,kBAAkB,CAAC;IAClE,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACrF,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/D,OAAO,GAAG,UAAU,CAAC;QACvB,CAAC;IACH,CAAC;SAAM,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/E,OAAO,GAAG,UAAU,CAAC;IACvB,CAAC;IAED,qEAAqE;IACrE,2EAA2E;IAC3E,+EAA+E;IAC/E,MAAM,eAAe,GAAG,aAAa;QACnC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5D,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,MAAM,GAAG,aAAa,CAAC,eAAe,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;IACnF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEjC,
|
|
1
|
+
{"version":3,"file":"parse-review-report.js","sourceRoot":"","sources":["../../src/review/parse-review-report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAchE,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAC7C,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAI/C,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,gBAAgD,CAAC,OAAO,EAAE,OAAO,EAAE,gBAAgB,CAAC,EACpF,QAAmB;IAEnB,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAElD,IAAI,OAAO,GAAoC,kBAAkB,CAAC;IAClE,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACrF,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/D,OAAO,GAAG,UAAU,CAAC;QACvB,CAAC;IACH,CAAC;SAAM,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/E,OAAO,GAAG,UAAU,CAAC;IACvB,CAAC;IAED,qEAAqE;IACrE,2EAA2E;IAC3E,+EAA+E;IAC/E,MAAM,eAAe,GAAG,aAAa;QACnC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5D,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,MAAM,GAAG,aAAa,CAAC,eAAe,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;IACnF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEjC,wEAAwE;IACxE,2EAA2E;IAC3E,yEAAyE;IACzE,yEAAyE;IACzE,uEAAuE;IACvE,yEAAyE;IACzE,6BAA6B;IAC7B,IAAI,OAAO,KAAK,UAAU;WACnB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,CAAC;QAC9E,OAAO,GAAG,kBAAkB,CAAC;IAC/B,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -16,4 +16,21 @@ export interface ResearchBrief {
|
|
|
16
16
|
contextBlockIds: string[];
|
|
17
17
|
}
|
|
18
18
|
export declare const researchBriefSlot: (input: EnrichedResearchInput) => ResearchBrief[];
|
|
19
|
+
import { type EvidencePack } from '../../research/evidence-pack.js';
|
|
20
|
+
export declare const TOTAL_PREFIX_BUDGET_BYTES: number;
|
|
21
|
+
export interface Turn1Inputs {
|
|
22
|
+
researchQuestion: string;
|
|
23
|
+
background?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface PrefixInputs {
|
|
26
|
+
researchQuestion: string;
|
|
27
|
+
background?: string;
|
|
28
|
+
pack: EvidencePack;
|
|
29
|
+
contextBlocks: Array<{
|
|
30
|
+
id: string;
|
|
31
|
+
content: string;
|
|
32
|
+
}>;
|
|
33
|
+
}
|
|
34
|
+
export declare function compileTurn1PlanPrompt(inp: Turn1Inputs): string;
|
|
35
|
+
export declare function compileResearchImplementerPrefix(inp: PrefixInputs): string;
|
|
19
36
|
//# sourceMappingURL=brief-slot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brief-slot.d.ts","sourceRoot":"","sources":["../../../src/tools/research/brief-slot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAYzC,MAAM,WAAW,oBAAoB;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;CAAE;AAEtE,MAAM,WAAW,qBAAsB,SAAQ,KAAK;IAClD,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;IAC9C,qEAAqE;IACrE,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B;+CAC2C;IAC3C,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAuCD,eAAO,MAAM,iBAAiB,GAAI,OAAO,qBAAqB,KAAG,aAAa,EAS7E,CAAC"}
|
|
1
|
+
{"version":3,"file":"brief-slot.d.ts","sourceRoot":"","sources":["../../../src/tools/research/brief-slot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAYzC,MAAM,WAAW,oBAAoB;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;CAAE;AAEtE,MAAM,WAAW,qBAAsB,SAAQ,KAAK;IAClD,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;IAC9C,qEAAqE;IACrE,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B;+CAC2C;IAC3C,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAuCD,eAAO,MAAM,iBAAiB,GAAI,OAAO,qBAAqB,KAAG,aAAa,EAS7E,CAAC;AAaF,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE3F,eAAO,MAAM,yBAAyB,QAAY,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAO,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAO,MAAM,CAAC;IACzB,IAAI,EAAc,YAAY,CAAC;IAC/B,aAAa,EAAK,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1D;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAI/D;AA6CD,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAU1E"}
|
|
@@ -34,4 +34,65 @@ export const researchBriefSlot = (input) => {
|
|
|
34
34
|
contextBlockIds: input.contextBlockIds ?? [],
|
|
35
35
|
}];
|
|
36
36
|
};
|
|
37
|
+
// ── 2-turn additions (Task 11) ────────────────────────────────────────────
|
|
38
|
+
// `compileTurn1PlanPrompt` produces the QueryPlan-emitting prompt.
|
|
39
|
+
// `compileResearchImplementerPrefix` produces the implementer cachedPrefix
|
|
40
|
+
// that the existing read-route-implementer N-criterion loop consumes when
|
|
41
|
+
// /research is the route — embeds the question + EvidencePack so each of
|
|
42
|
+
// the 5 criterion sub-turns synthesises against the same evidence.
|
|
43
|
+
import { TURN1_PLAN_PROMPT_TEMPLATE, RESEARCH_IMPLEMENTER_PREFIX_TEMPLATE, } from './implementer-criteria.js';
|
|
44
|
+
import { serializeEvidencePack } from '../../research/evidence-pack.js';
|
|
45
|
+
export const TOTAL_PREFIX_BUDGET_BYTES = 96 * 1024;
|
|
46
|
+
export function compileTurn1PlanPrompt(inp) {
|
|
47
|
+
return TURN1_PLAN_PROMPT_TEMPLATE
|
|
48
|
+
.replace('<RESEARCH_QUESTION_PLACEHOLDER>', inp.researchQuestion)
|
|
49
|
+
.replace('<BACKGROUND_PLACEHOLDER>', inp.background ?? '(none)');
|
|
50
|
+
}
|
|
51
|
+
function trimToFitBudget(question, background, packMd, blocks) {
|
|
52
|
+
const compose = (q, bg, pack, blks) => RESEARCH_IMPLEMENTER_PREFIX_TEMPLATE
|
|
53
|
+
.replace('<EVIDENCE_PACK_PLACEHOLDER>', pack + (blks ? '\n\n' + blks : ''))
|
|
54
|
+
.replace('<RESEARCH_QUESTION_PLACEHOLDER>', q)
|
|
55
|
+
.replace('<BACKGROUND_PLACEHOLDER>', bg);
|
|
56
|
+
let prefix = compose(question, background, packMd, blocks);
|
|
57
|
+
if (Buffer.byteLength(prefix, 'utf8') <= TOTAL_PREFIX_BUDGET_BYTES) {
|
|
58
|
+
return { prefix, trimNote: '' };
|
|
59
|
+
}
|
|
60
|
+
let trimNote = '';
|
|
61
|
+
// 1. Trim EvidencePack snippets.
|
|
62
|
+
let trimmedPack = packMd;
|
|
63
|
+
while (Buffer.byteLength(prefix, 'utf8') > TOTAL_PREFIX_BUDGET_BYTES && trimmedPack.length > 500) {
|
|
64
|
+
trimmedPack = trimmedPack.slice(0, Math.floor(trimmedPack.length * 0.7));
|
|
65
|
+
trimNote = '> _Note: evidence-pack snippets trimmed to fit prompt budget._';
|
|
66
|
+
prefix = compose(question, background, trimmedPack + '\n…\n', blocks);
|
|
67
|
+
}
|
|
68
|
+
// 2. Trim contextBlocks.
|
|
69
|
+
let trimmedBlocks = blocks;
|
|
70
|
+
while (Buffer.byteLength(prefix, 'utf8') > TOTAL_PREFIX_BUDGET_BYTES && trimmedBlocks.length > 0) {
|
|
71
|
+
trimmedBlocks = trimmedBlocks.slice(0, Math.floor(trimmedBlocks.length * 0.5));
|
|
72
|
+
trimNote = '> _Note: context blocks trimmed to fit prompt budget._';
|
|
73
|
+
prefix = compose(question, background, trimmedPack, trimmedBlocks);
|
|
74
|
+
}
|
|
75
|
+
// 3. Trim background.
|
|
76
|
+
let trimmedBg = background;
|
|
77
|
+
while (Buffer.byteLength(prefix, 'utf8') > TOTAL_PREFIX_BUDGET_BYTES && trimmedBg.length > 200) {
|
|
78
|
+
trimmedBg = trimmedBg.slice(0, Math.floor(trimmedBg.length * 0.5)) + '…';
|
|
79
|
+
trimNote = '> _Note: background trimmed to fit prompt budget._';
|
|
80
|
+
prefix = compose(question, trimmedBg, trimmedPack, trimmedBlocks);
|
|
81
|
+
}
|
|
82
|
+
// 4. Hard guarantee: if still over budget, truncate prefix directly.
|
|
83
|
+
if (Buffer.byteLength(prefix, 'utf8') > TOTAL_PREFIX_BUDGET_BYTES) {
|
|
84
|
+
prefix = prefix.slice(0, TOTAL_PREFIX_BUDGET_BYTES);
|
|
85
|
+
trimNote = '> _Note: prefix truncated to fit prompt budget._';
|
|
86
|
+
}
|
|
87
|
+
return { prefix, trimNote };
|
|
88
|
+
}
|
|
89
|
+
export function compileResearchImplementerPrefix(inp) {
|
|
90
|
+
const packMd = serializeEvidencePack(inp.pack);
|
|
91
|
+
const blocksMd = inp.contextBlocks.length === 0
|
|
92
|
+
? ''
|
|
93
|
+
: '## Context blocks\n\n' + inp.contextBlocks
|
|
94
|
+
.map(b => `### ${b.id}\n\n${b.content}`).join('\n\n');
|
|
95
|
+
const { prefix, trimNote } = trimToFitBudget(inp.researchQuestion, inp.background ?? '(none)', packMd, blocksMd);
|
|
96
|
+
return trimNote ? `${trimNote}\n\n${prefix}` : prefix;
|
|
97
|
+
}
|
|
37
98
|
//# sourceMappingURL=brief-slot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brief-slot.js","sourceRoot":"","sources":["../../../src/tools/research/brief-slot.ts"],"names":[],"mappings":"AACA,OAAO,EACL,sBAAsB,EACtB,oCAAoC,EACpC,qCAAqC,EACrC,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AA0BnC,SAAS,qBAAqB,CAC5B,KAAY,EACZ,qBAA6C,EAC7C,MAAqB;IAErB,MAAM,YAAY,GAAG,qBAAqB,CAAC,MAAM;QAC/C,CAAC,CAAC,mCAAmC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM;QACxG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM;QAChD,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3D,CAAC,CAAC,mBAAmB,CAAC;IAExB,OAAO,GAAG,YAAY;;kBAEN,KAAK,CAAC,UAAU;yBACT,KAAK,CAAC,gBAAgB;;;EAG7C,gBAAgB;;EAEhB,oCAAoC;;EAEpC,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC;;EAErC,qCAAqC;;EAErC,uBAAuB;;EAEvB,sBAAsB,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAA4B,EAAmB,EAAE;IACjF,MAAM,cAAc,GAAG,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,qBAAqB,EAAE;QAC/E,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAC;IACH,OAAO,CAAC;YACN,cAAc;YACd,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,EAAE;SAC7C,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"brief-slot.js","sourceRoot":"","sources":["../../../src/tools/research/brief-slot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Research-specific implementer criteria.
|
|
3
|
-
*
|
|
4
|
-
* /research is a read-only tool with `reviewPolicy: 'none'`. After v4.4.x
|
|
5
|
-
* it joins the sequential-criteria loop alongside audit / review / debug /
|
|
6
|
-
* investigate — 5 criterion perspectives, each producing one or more
|
|
7
|
-
* findings citing external sources. The `## Sources used` table is parsed
|
|
8
|
-
* separately by `reporting/report-parser-slots/research-report.ts` and
|
|
9
|
-
* surfaced on the structuredReport as `sourcesUsed` (research-only field).
|
|
10
|
-
*/
|
|
11
1
|
import type { CriterionEntry } from '../criteria-types.js';
|
|
2
|
+
export declare const CANONICAL_CATEGORY_IDS: readonly ["primary-sources", "practitioner-consensus", "recent-developments", "counter-perspectives", "cross-domain"];
|
|
3
|
+
export declare const RESEARCH_CRITERIA: readonly CriterionEntry[];
|
|
12
4
|
export declare const EVIDENCE_RULE_RESEARCH: string;
|
|
13
5
|
export declare const TRUST_BOUNDARY_USER_SOURCES_RESEARCH: string;
|
|
14
6
|
export declare const TRUST_BOUNDARY_EXTERNAL_DATA_RESEARCH: string;
|
|
@@ -17,6 +9,7 @@ export declare function strategyRuleResearch(hasBrave: boolean): string;
|
|
|
17
9
|
export declare const RESEARCH_PURPOSE_ORIENTATION: string;
|
|
18
10
|
export declare const SCOPE_RULE_RESEARCH: string;
|
|
19
11
|
export declare const ANNOTATOR_AWARENESS_RESEARCH: string;
|
|
20
|
-
export declare const RESEARCH_CRITERIA: readonly CriterionEntry[];
|
|
21
12
|
export declare const EVIDENCE_RULE_RESEARCH_COMPOSED: string;
|
|
13
|
+
export declare const RESEARCH_IMPLEMENTER_PREFIX_TEMPLATE: string;
|
|
14
|
+
export declare const TURN1_PLAN_PROMPT_TEMPLATE: string;
|
|
22
15
|
//# sourceMappingURL=implementer-criteria.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"implementer-criteria.d.ts","sourceRoot":"","sources":["../../../src/tools/research/implementer-criteria.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"implementer-criteria.d.ts","sourceRoot":"","sources":["../../../src/tools/research/implementer-criteria.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,eAAO,MAAM,sBAAsB,uHAMzB,CAAC;AAUX,eAAO,MAAM,iBAAiB,EAAE,SAAS,cAAc,EAA0C,CAAC;AAIlG,eAAO,MAAM,sBAAsB,QAEvB,CAAC;AAEb,eAAO,MAAM,oCAAoC,QAMrC,CAAC;AAEb,eAAO,MAAM,qCAAqC,QAEtC,CAAC;AAEb,eAAO,MAAM,uBAAuB,QAExB,CAAC;AAEb,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAS9D;AAED,eAAO,MAAM,4BAA4B,QAS7B,CAAC;AAEb,eAAO,MAAM,mBAAmB,QAKpB,CAAC;AAEb,eAAO,MAAM,4BAA4B,QAE7B,CAAC;AAEb,eAAO,MAAM,+BAA+B,QAQhC,CAAC;AAIb,eAAO,MAAM,oCAAoC,QAgBrC,CAAC;AAEb,eAAO,MAAM,0BAA0B,QA+B3B,CAAC"}
|