@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
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// EvidencePack types + deterministic truncation policy per spec §5.3 / §5.4.
|
|
2
|
+
export const EVIDENCE_PACK_LIMITS = Object.freeze({
|
|
3
|
+
MAX_TOTAL_BYTES: 48 * 1024,
|
|
4
|
+
MAX_PER_GROUP: 10,
|
|
5
|
+
MAX_SNIPPET_CHARS: 500,
|
|
6
|
+
MAX_TOTAL_SOURCES: 50,
|
|
7
|
+
});
|
|
8
|
+
// Drop priority: lowest-priority group dropped first.
|
|
9
|
+
const DROP_PRIORITY = [
|
|
10
|
+
'brave', 'rss', 'web_fetch',
|
|
11
|
+
'github_code', 'github_repo', 'semantic_scholar', 'arxiv',
|
|
12
|
+
];
|
|
13
|
+
// Within a group, priority is preserved by input order (highest first).
|
|
14
|
+
function groupPriority(group) {
|
|
15
|
+
return DROP_PRIORITY.indexOf(group);
|
|
16
|
+
}
|
|
17
|
+
export function dedupSources(input) {
|
|
18
|
+
// Sort so highest-priority (latest in DROP_PRIORITY) wins on URL collision.
|
|
19
|
+
const sorted = [...input].sort((a, b) => groupPriority(b.source) - groupPriority(a.source));
|
|
20
|
+
const seen = new Set();
|
|
21
|
+
const kept = [];
|
|
22
|
+
for (const s of sorted) {
|
|
23
|
+
if (!s.url || seen.has(s.url))
|
|
24
|
+
continue;
|
|
25
|
+
seen.add(s.url);
|
|
26
|
+
kept.push(s);
|
|
27
|
+
}
|
|
28
|
+
return kept;
|
|
29
|
+
}
|
|
30
|
+
export function applyBudget(inputSources, failedAttempts) {
|
|
31
|
+
let budgetExceeded = false;
|
|
32
|
+
// 1. Dedup.
|
|
33
|
+
let sources = dedupSources(inputSources);
|
|
34
|
+
// 2. Per-group cap.
|
|
35
|
+
const perGroup = new Map();
|
|
36
|
+
for (const s of sources) {
|
|
37
|
+
if (!perGroup.has(s.source))
|
|
38
|
+
perGroup.set(s.source, []);
|
|
39
|
+
perGroup.get(s.source).push(s);
|
|
40
|
+
}
|
|
41
|
+
let totalAfterCap = 0;
|
|
42
|
+
for (const [, list] of perGroup) {
|
|
43
|
+
if (list.length > EVIDENCE_PACK_LIMITS.MAX_PER_GROUP) {
|
|
44
|
+
list.length = EVIDENCE_PACK_LIMITS.MAX_PER_GROUP;
|
|
45
|
+
budgetExceeded = true;
|
|
46
|
+
}
|
|
47
|
+
totalAfterCap += list.length;
|
|
48
|
+
}
|
|
49
|
+
sources = [].concat(...perGroup.values());
|
|
50
|
+
// 3. Total-sources cap. Drop lowest-priority groups first.
|
|
51
|
+
while (sources.length > EVIDENCE_PACK_LIMITS.MAX_TOTAL_SOURCES) {
|
|
52
|
+
budgetExceeded = true;
|
|
53
|
+
let dropped = false;
|
|
54
|
+
for (const g of DROP_PRIORITY) {
|
|
55
|
+
const idx = sources.findIndex(s => s.source === g);
|
|
56
|
+
if (idx >= 0) {
|
|
57
|
+
sources.splice(idx, 1);
|
|
58
|
+
dropped = true;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!dropped)
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
// 4. Total-bytes cap (on original data). Estimate serialized size; drop lowest-priority first.
|
|
66
|
+
function bytes(arr) {
|
|
67
|
+
let n = 0;
|
|
68
|
+
for (const s of arr) {
|
|
69
|
+
n += s.title.length + s.url.length + s.snippet.length + s.query.length + 100;
|
|
70
|
+
}
|
|
71
|
+
return n;
|
|
72
|
+
}
|
|
73
|
+
while (bytes(sources) > EVIDENCE_PACK_LIMITS.MAX_TOTAL_BYTES) {
|
|
74
|
+
budgetExceeded = true;
|
|
75
|
+
let dropped = false;
|
|
76
|
+
for (const g of DROP_PRIORITY) {
|
|
77
|
+
const idx = sources.findIndex(s => s.source === g);
|
|
78
|
+
if (idx >= 0) {
|
|
79
|
+
sources.splice(idx, 1);
|
|
80
|
+
dropped = true;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (!dropped)
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
// 5. Truncate snippets to MAX_SNIPPET_CHARS.
|
|
88
|
+
sources = sources.map(s => {
|
|
89
|
+
if (s.snippet.length <= EVIDENCE_PACK_LIMITS.MAX_SNIPPET_CHARS)
|
|
90
|
+
return s;
|
|
91
|
+
return {
|
|
92
|
+
...s,
|
|
93
|
+
snippet: s.snippet.slice(0, EVIDENCE_PACK_LIMITS.MAX_SNIPPET_CHARS) + '…',
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
return {
|
|
97
|
+
sources,
|
|
98
|
+
failedAttempts: [...failedAttempts],
|
|
99
|
+
generatedAt: new Date().toISOString(),
|
|
100
|
+
totalQueries: inputSources.length,
|
|
101
|
+
budgetExceeded,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
export function serializeEvidencePack(pack) {
|
|
105
|
+
const lines = [];
|
|
106
|
+
lines.push(`## Sources (${pack.sources.length})`);
|
|
107
|
+
if (pack.budgetExceeded) {
|
|
108
|
+
lines.push('> _Note: evidence-pack budget was exceeded; some sources were dropped per priority policy._');
|
|
109
|
+
}
|
|
110
|
+
lines.push('');
|
|
111
|
+
for (const s of pack.sources) {
|
|
112
|
+
lines.push(`### [${s.source}] ${s.title}`);
|
|
113
|
+
lines.push(`- URL: ${s.url}`);
|
|
114
|
+
lines.push(`- Query: ${s.query}`);
|
|
115
|
+
if (s.publishedAt)
|
|
116
|
+
lines.push(`- Published: ${s.publishedAt}`);
|
|
117
|
+
lines.push('');
|
|
118
|
+
lines.push(s.snippet);
|
|
119
|
+
lines.push('');
|
|
120
|
+
}
|
|
121
|
+
if (pack.failedAttempts.length > 0) {
|
|
122
|
+
lines.push('## Sources that failed');
|
|
123
|
+
lines.push('');
|
|
124
|
+
for (const f of pack.failedAttempts) {
|
|
125
|
+
const detail = f.detail ? ` — ${f.detail}` : '';
|
|
126
|
+
lines.push(`- [${f.source}] query="${f.query}" reason=${f.reason}${detail}`);
|
|
127
|
+
}
|
|
128
|
+
lines.push('');
|
|
129
|
+
}
|
|
130
|
+
return lines.join('\n');
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=evidence-pack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-pack.js","sourceRoot":"","sources":["../../src/research/evidence-pack.ts"],"names":[],"mappings":"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"}
|
package/dist/research/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/research/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/research/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC"}
|
package/dist/research/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/research/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/research/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { QueryPlan } from './query-plan.js';
|
|
2
|
+
import { type EvidencePack } from './evidence-pack.js';
|
|
3
|
+
import type { AdapterId, AdapterResult } from './adapters/types.js';
|
|
4
|
+
import type { BraveSearchResponse } from './web-search.js';
|
|
5
|
+
import type { WebFetchResult } from './web-fetch.js';
|
|
6
|
+
export interface OrchestratorDeps {
|
|
7
|
+
enabledAdapters: AdapterId[];
|
|
8
|
+
brave: {
|
|
9
|
+
search: (query: string) => Promise<BraveSearchResponse>;
|
|
10
|
+
};
|
|
11
|
+
adapters: {
|
|
12
|
+
arxiv: (query: string) => Promise<AdapterResult[]>;
|
|
13
|
+
semanticScholar: (query: string) => Promise<AdapterResult[]>;
|
|
14
|
+
github: (query: string, kind: 'repo' | 'code') => Promise<AdapterResult[]>;
|
|
15
|
+
rss: (url: string) => Promise<AdapterResult[]>;
|
|
16
|
+
};
|
|
17
|
+
webFetch: (url: string) => Promise<WebFetchResult>;
|
|
18
|
+
hostAllowlist: Set<string>;
|
|
19
|
+
perAdapterTimeoutMs: number;
|
|
20
|
+
totalDeadlineMs: number;
|
|
21
|
+
concurrencyCap: number;
|
|
22
|
+
}
|
|
23
|
+
export declare function runOrchestrator(plan: QueryPlan, deps: OrchestratorDeps): Promise<EvidencePack>;
|
|
24
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/research/orchestrator.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EACQ,KAAK,YAAY,EAE/B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,SAAS,EAAE,CAAC;IAC7B,KAAK,EAAK;QAAE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAA;KAAE,CAAC;IACtE,QAAQ,EAAE;QACR,KAAK,EAAY,CAAC,KAAK,EAAE,MAAM,KAA6B,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QACrF,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAA6B,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QACrF,MAAM,EAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QACpF,GAAG,EAAc,CAAC,GAAG,EAAE,MAAM,KAAgC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;KACvF,CAAC;IACF,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACnD,aAAa,EAAS,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,mBAAmB,EAAG,MAAM,CAAC;IAC7B,eAAe,EAAO,MAAM,CAAC;IAC7B,cAAc,EAAQ,MAAM,CAAC;CAC9B;AAmID,wBAAsB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAoBpG"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Step 2 of the /research pipeline. Deterministic Node-only fan-out across
|
|
3
|
+
// enabled adapters + Brave + webFetch + RSS, with per-adapter timeout,
|
|
4
|
+
// concurrency cap scoped to this single call, allowlist enforcement on
|
|
5
|
+
// every outbound hop (directFetches + rssFeeds), and post-budget evidence
|
|
6
|
+
// pack assembly.
|
|
7
|
+
import { applyBudget, } from './evidence-pack.js';
|
|
8
|
+
const TASK_TO_GROUP = {
|
|
9
|
+
brave: 'brave',
|
|
10
|
+
arxiv: 'arxiv',
|
|
11
|
+
ss: 'semantic_scholar',
|
|
12
|
+
gh_repo: 'github_repo',
|
|
13
|
+
gh_code: 'github_code',
|
|
14
|
+
rss: 'rss',
|
|
15
|
+
fetch: 'web_fetch',
|
|
16
|
+
};
|
|
17
|
+
function buildTasks(plan) {
|
|
18
|
+
const tasks = [];
|
|
19
|
+
for (const q of plan.braveQueries)
|
|
20
|
+
tasks.push({ kind: 'brave', query: q });
|
|
21
|
+
for (const q of plan.arxivQueries)
|
|
22
|
+
tasks.push({ kind: 'arxiv', query: q });
|
|
23
|
+
for (const q of plan.semanticScholarQueries)
|
|
24
|
+
tasks.push({ kind: 'ss', query: q });
|
|
25
|
+
for (const g of plan.githubQueries)
|
|
26
|
+
tasks.push({ kind: g.kind === 'repo' ? 'gh_repo' : 'gh_code', query: g.q });
|
|
27
|
+
for (const u of plan.rssFeeds)
|
|
28
|
+
tasks.push({ kind: 'rss', url: u });
|
|
29
|
+
for (const u of plan.directFetches)
|
|
30
|
+
tasks.push({ kind: 'fetch', url: u });
|
|
31
|
+
return tasks;
|
|
32
|
+
}
|
|
33
|
+
function isAdapterEnabled(kind, enabled) {
|
|
34
|
+
switch (kind) {
|
|
35
|
+
case 'arxiv': return enabled.includes('arxiv');
|
|
36
|
+
case 'ss': return enabled.includes('semantic_scholar');
|
|
37
|
+
case 'gh_repo':
|
|
38
|
+
case 'gh_code': return enabled.includes('github_search');
|
|
39
|
+
case 'rss': return enabled.includes('rss');
|
|
40
|
+
case 'brave': return true;
|
|
41
|
+
case 'fetch': return true;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function withTimeout(p, ms) {
|
|
45
|
+
return new Promise((resolve, reject) => {
|
|
46
|
+
const t = setTimeout(() => reject(new Error('timeout')), ms);
|
|
47
|
+
p.then(v => { clearTimeout(t); resolve(v); }, e => { clearTimeout(t); reject(e); });
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function isHostAllowed(url, allowlist) {
|
|
51
|
+
try {
|
|
52
|
+
const host = new URL(url).hostname.toLowerCase();
|
|
53
|
+
return allowlist.has(host);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function runOne(task, deps, sources, fails) {
|
|
60
|
+
if (!isAdapterEnabled(task.kind, deps.enabledAdapters)) {
|
|
61
|
+
fails.push({
|
|
62
|
+
source: TASK_TO_GROUP[task.kind],
|
|
63
|
+
query: 'query' in task ? task.query : task.url,
|
|
64
|
+
reason: 'no_api_key_configured',
|
|
65
|
+
});
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// Allowlist enforcement on outbound hops.
|
|
69
|
+
if (task.kind === 'rss' || task.kind === 'fetch') {
|
|
70
|
+
if (!isHostAllowed(task.url, deps.hostAllowlist)) {
|
|
71
|
+
fails.push({
|
|
72
|
+
source: TASK_TO_GROUP[task.kind],
|
|
73
|
+
query: task.url,
|
|
74
|
+
reason: 'host_not_allowlisted',
|
|
75
|
+
});
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const queryStr = 'query' in task ? task.query : task.url;
|
|
80
|
+
try {
|
|
81
|
+
let raw;
|
|
82
|
+
switch (task.kind) {
|
|
83
|
+
case 'brave':
|
|
84
|
+
raw = await withTimeout(deps.brave.search(task.query), deps.perAdapterTimeoutMs);
|
|
85
|
+
break;
|
|
86
|
+
case 'arxiv':
|
|
87
|
+
raw = await withTimeout(deps.adapters.arxiv(task.query), deps.perAdapterTimeoutMs);
|
|
88
|
+
break;
|
|
89
|
+
case 'ss':
|
|
90
|
+
raw = await withTimeout(deps.adapters.semanticScholar(task.query), deps.perAdapterTimeoutMs);
|
|
91
|
+
break;
|
|
92
|
+
case 'gh_repo':
|
|
93
|
+
raw = await withTimeout(deps.adapters.github(task.query, 'repo'), deps.perAdapterTimeoutMs);
|
|
94
|
+
break;
|
|
95
|
+
case 'gh_code':
|
|
96
|
+
raw = await withTimeout(deps.adapters.github(task.query, 'code'), deps.perAdapterTimeoutMs);
|
|
97
|
+
break;
|
|
98
|
+
case 'rss':
|
|
99
|
+
raw = await withTimeout(deps.adapters.rss(task.url), deps.perAdapterTimeoutMs);
|
|
100
|
+
break;
|
|
101
|
+
case 'fetch':
|
|
102
|
+
raw = await withTimeout(deps.webFetch(task.url), deps.perAdapterTimeoutMs);
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
// Normalize each task's result to EvidenceSource[].
|
|
106
|
+
if (task.kind === 'brave') {
|
|
107
|
+
const br = raw;
|
|
108
|
+
br.results.forEach((r, i) => sources.push({
|
|
109
|
+
source: 'brave', query: queryStr,
|
|
110
|
+
title: r.title, url: r.url, snippet: r.snippet, rank: i,
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
else if (task.kind === 'fetch') {
|
|
114
|
+
const r = raw;
|
|
115
|
+
if (r.status === 'ok') {
|
|
116
|
+
sources.push({
|
|
117
|
+
source: 'web_fetch', query: queryStr,
|
|
118
|
+
title: `[fetched ${r.host}]`, url: queryStr,
|
|
119
|
+
snippet: r.rawText.slice(0, 500), rank: 0,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
fails.push({ source: 'web_fetch', query: queryStr, reason: r.reasonCode });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
const arr = raw;
|
|
128
|
+
arr.forEach((a, i) => sources.push({
|
|
129
|
+
source: TASK_TO_GROUP[task.kind], query: queryStr,
|
|
130
|
+
title: a.title, url: a.url, snippet: a.snippet,
|
|
131
|
+
publishedAt: a.publishedAt, rank: i,
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
fails.push({
|
|
137
|
+
source: TASK_TO_GROUP[task.kind], query: queryStr,
|
|
138
|
+
reason: e.message || 'unknown',
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
export async function runOrchestrator(plan, deps) {
|
|
143
|
+
const tasks = buildTasks(plan);
|
|
144
|
+
const sources = [];
|
|
145
|
+
const fails = [];
|
|
146
|
+
let cursor = 0;
|
|
147
|
+
const workers = [];
|
|
148
|
+
const worker = async () => {
|
|
149
|
+
while (true) {
|
|
150
|
+
const idx = cursor++;
|
|
151
|
+
if (idx >= tasks.length)
|
|
152
|
+
return;
|
|
153
|
+
await runOne(tasks[idx], deps, sources, fails);
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
for (let i = 0; i < Math.min(deps.concurrencyCap, tasks.length); i++) {
|
|
157
|
+
workers.push(worker());
|
|
158
|
+
}
|
|
159
|
+
await Promise.all(workers);
|
|
160
|
+
return applyBudget(sources, fails);
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/research/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const QueryPlanSchema: z.ZodObject<{
|
|
3
|
+
braveQueries: z.ZodArray<z.ZodString>;
|
|
4
|
+
arxivQueries: z.ZodArray<z.ZodString>;
|
|
5
|
+
semanticScholarQueries: z.ZodArray<z.ZodString>;
|
|
6
|
+
githubQueries: z.ZodArray<z.ZodObject<{
|
|
7
|
+
q: z.ZodString;
|
|
8
|
+
kind: z.ZodEnum<{
|
|
9
|
+
code: "code";
|
|
10
|
+
repo: "repo";
|
|
11
|
+
}>;
|
|
12
|
+
}, z.core.$strip>>;
|
|
13
|
+
rssFeeds: z.ZodArray<z.ZodString>;
|
|
14
|
+
directFetches: z.ZodArray<z.ZodString>;
|
|
15
|
+
}, z.core.$strict>;
|
|
16
|
+
export type QueryPlan = z.infer<typeof QueryPlanSchema>;
|
|
17
|
+
export declare function parseQueryPlan(json: string): QueryPlan;
|
|
18
|
+
//# sourceMappingURL=query-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-plan.d.ts","sourceRoot":"","sources":["../../src/research/query-plan.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;kBAUjB,CAAC;AAEZ,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAYtD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Zod schema for the structured output the worker emits in turn 1.
|
|
2
|
+
// Bounds: 0..8 entries per query list, ≤ 200 chars per query, only
|
|
3
|
+
// absolute https URLs for rssFeeds and directFetches.
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
const Query200 = z.string().min(1).max(200);
|
|
6
|
+
const Queries = z.array(Query200).max(8);
|
|
7
|
+
const HttpsUrl = z.string().url().refine(u => u.startsWith('https://'), {
|
|
8
|
+
message: 'must be an absolute https:// URL',
|
|
9
|
+
});
|
|
10
|
+
const HttpsUrls = z.array(HttpsUrl).max(8);
|
|
11
|
+
export const QueryPlanSchema = z.object({
|
|
12
|
+
braveQueries: Queries,
|
|
13
|
+
arxivQueries: Queries,
|
|
14
|
+
semanticScholarQueries: Queries,
|
|
15
|
+
githubQueries: z.array(z.object({
|
|
16
|
+
q: Query200,
|
|
17
|
+
kind: z.enum(['repo', 'code']),
|
|
18
|
+
})).max(8),
|
|
19
|
+
rssFeeds: HttpsUrls,
|
|
20
|
+
directFetches: HttpsUrls,
|
|
21
|
+
}).strict();
|
|
22
|
+
export function parseQueryPlan(json) {
|
|
23
|
+
let raw;
|
|
24
|
+
try {
|
|
25
|
+
raw = JSON.parse(json);
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
throw new Error(`QueryPlan JSON parse failed: ${e.message}`);
|
|
29
|
+
}
|
|
30
|
+
const r = QueryPlanSchema.safeParse(raw);
|
|
31
|
+
if (!r.success) {
|
|
32
|
+
throw new Error(`QueryPlan schema validation failed: ${r.error.message}`);
|
|
33
|
+
}
|
|
34
|
+
return r.data;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=query-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-plan.js","sourceRoot":"","sources":["../../src/research/query-plan.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,mEAAmE;AACnE,sDAAsD;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC5C,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACzC,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;IACtE,OAAO,EAAE,kCAAkC;CAC5C,CAAC,CAAC;AACH,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,YAAY,EAAY,OAAO;IAC/B,YAAY,EAAY,OAAO;IAC/B,sBAAsB,EAAE,OAAO;IAC/B,aAAa,EAAW,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACvC,CAAC,EAAK,QAAQ;QACd,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACV,QAAQ,EAAgB,SAAS;IACjC,aAAa,EAAW,SAAS;CAClC,CAAC,CAAC,MAAM,EAAE,CAAC;AAIZ,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,gCAAiC,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,CAAC,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,CAAC,CAAC,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-agent.d.ts","sourceRoot":"","sources":["../../src/research/user-agent.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,UAAU,EAAE,MAAwD,CAAC;AAGlF,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Single source of truth for the User-Agent header sent by every outbound
|
|
2
|
+
// adapter, brave, and webFetch HTTP request from this package.
|
|
3
|
+
import pkg from '../../package.json' with { type: 'json' };
|
|
4
|
+
const SEMVER_RE = /^\d+\.\d+\.\d+/;
|
|
5
|
+
const FALLBACK = 'mma-research/0.0.0-unknown';
|
|
6
|
+
function compose(version) {
|
|
7
|
+
if (typeof version !== 'string' || !SEMVER_RE.test(version)) {
|
|
8
|
+
return FALLBACK;
|
|
9
|
+
}
|
|
10
|
+
return `mma-research/${version.match(SEMVER_RE)[0]}`;
|
|
11
|
+
}
|
|
12
|
+
export const USER_AGENT = compose(pkg.version);
|
|
13
|
+
// Test seam — exported only for unit tests; do not call from production code.
|
|
14
|
+
export async function _resetForTests(fakePkg) {
|
|
15
|
+
return compose(fakePkg.version);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=user-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-agent.js","sourceRoot":"","sources":["../../src/research/user-agent.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,+DAA+D;AAC/D,OAAO,GAAG,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAE3D,MAAM,SAAS,GAAG,gBAAgB,CAAC;AACnC,MAAM,QAAQ,GAAG,4BAA4B,CAAC;AAE9C,SAAS,OAAO,CAAC,OAAgB;IAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,gBAAgB,OAAO,CAAC,KAAK,CAAC,SAAS,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAW,OAAO,CAAE,GAA6B,CAAC,OAAO,CAAC,CAAC;AAElF,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA8B;IACjE,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -4,38 +4,21 @@ export interface WebFetchInput {
|
|
|
4
4
|
url: string;
|
|
5
5
|
cfg: ResearchConfig['fetch'];
|
|
6
6
|
hostAllowlist: ReadonlySet<string>;
|
|
7
|
-
/** Hosts in this set may resolve to RFC1918 private addresses (still rejects loopback/metadata). */
|
|
8
7
|
privateNetworkHosts?: ReadonlySet<string>;
|
|
9
|
-
/** Test seam — replaces DNS resolution. */
|
|
10
8
|
resolveIP?: (host: string) => Promise<string>;
|
|
11
|
-
/**
|
|
12
|
-
*
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
*
|
|
16
|
-
* Ownership: dispatchers returned by this hook are caller-owned/shared and
|
|
17
|
-
* will not be closed or destroyed by webFetch. The default dispatcher created
|
|
18
|
-
* by webFetch is one-shot and is disposed after its request completes.
|
|
19
|
-
*/
|
|
9
|
+
/** Test seam — when present, treated as the IP that the connect callback
|
|
10
|
+
* "resolved" at request time. Production must not pass this. */
|
|
11
|
+
_testConnectResolvedIp?: string;
|
|
12
|
+
/** @deprecated kept for callers that explicitly opt out; unused in prod */
|
|
20
13
|
createDispatcher?: (host: string, pinnedIP: string, cfg: ResearchConfig['fetch']) => import('undici').Dispatcher | undefined;
|
|
21
14
|
}
|
|
22
|
-
export declare const defaultIPPinningDispatcher: (host: string, pinnedIP: string, cfg: ResearchConfig["fetch"]) => Agent;
|
|
23
15
|
export type WebFetchOk = {
|
|
24
16
|
status: 'ok';
|
|
25
|
-
/** Worker-facing string: <external-content …>extracted-text</external-content> */
|
|
26
17
|
body: string;
|
|
27
|
-
/** Adapter-facing raw text (HTML stripped to main-text for HTML; raw bytes for XML/JSON). NOT wrapped. */
|
|
28
18
|
rawText: string;
|
|
29
19
|
host: string;
|
|
30
20
|
bytesReturned: number;
|
|
31
|
-
/** True if the wire-level read was capped by cfg.maxBodyBytes (raw response truncated). */
|
|
32
21
|
truncated: boolean;
|
|
33
|
-
/**
|
|
34
|
-
* True if the post-extraction text was capped by RETURNED_TEXT_CAP (default 64 KiB).
|
|
35
|
-
* Adapters that parse rawText (e.g. rss) MUST inspect this flag — a true value
|
|
36
|
-
* means the XML/JSON body may be syntactically incomplete and parsing should be skipped.
|
|
37
|
-
* This is independent of truncated; both can be true if both caps tripped.
|
|
38
|
-
*/
|
|
39
22
|
textTruncated: boolean;
|
|
40
23
|
credentialsStripped: boolean;
|
|
41
24
|
};
|
|
@@ -46,5 +29,7 @@ export type WebFetchErr = {
|
|
|
46
29
|
credentialsStripped: boolean;
|
|
47
30
|
};
|
|
48
31
|
export type WebFetchResult = WebFetchOk | WebFetchErr;
|
|
32
|
+
/** @deprecated — kept for test compatibility; no longer used in production. */
|
|
33
|
+
export declare const defaultIPPinningDispatcher: (host: string, pinnedIP: string, cfg: ResearchConfig["fetch"]) => Agent;
|
|
49
34
|
export declare function webFetch(input: WebFetchInput): Promise<WebFetchResult>;
|
|
50
35
|
//# sourceMappingURL=web-fetch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-fetch.d.ts","sourceRoot":"","sources":["../../src/research/web-fetch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"web-fetch.d.ts","sourceRoot":"","sources":["../../src/research/web-fetch.ts"],"names":[],"mappings":"AASA,OAAO,EAAW,KAAK,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAW1D,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAkB,MAAM,CAAC;IAC5B,GAAG,EAAkB,cAAc,CAAC,OAAO,CAAC,CAAC;IAC7C,aAAa,EAAQ,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAW,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD;qEACiE;IACjE,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,OAAO,QAAQ,EAAE,UAAU,GAAG,SAAS,CAAC;CAC9H;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAC1D,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAClE,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,OAAO,CAAC;CAClF,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,WAAW,CAAC;AAStD,+EAA+E;AAC/E,eAAO,MAAM,0BAA0B,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,EAAE,KAAK,cAAc,CAAC,OAAO,CAAC,UAQnG,CAAC;AA6CL,wBAAsB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAoJ5E"}
|