@zhixuan92/multi-model-agent-core 5.2.2 → 5.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/model-profile-registry.d.ts +0 -1
- package/dist/config/model-profile-registry.d.ts.map +1 -1
- package/dist/config/model-profile-registry.js +0 -3
- package/dist/config/model-profile-registry.js.map +1 -1
- package/dist/config/schema.d.ts +10 -17
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +11 -22
- package/dist/config/schema.js.map +1 -1
- package/dist/error-codes.d.ts +0 -2
- package/dist/error-codes.d.ts.map +1 -1
- package/dist/error-codes.js +0 -15
- package/dist/error-codes.js.map +1 -1
- package/dist/events/to-wire-record.d.ts.map +1 -1
- package/dist/events/to-wire-record.js +2 -4
- package/dist/events/to-wire-record.js.map +1 -1
- package/dist/research/adapters/crossref.d.ts +7 -0
- package/dist/research/adapters/crossref.d.ts.map +1 -0
- package/dist/research/adapters/crossref.js +80 -0
- package/dist/research/adapters/crossref.js.map +1 -0
- package/dist/research/adapters/index.d.ts +4 -0
- package/dist/research/adapters/index.d.ts.map +1 -1
- package/dist/research/adapters/index.js +10 -1
- package/dist/research/adapters/index.js.map +1 -1
- package/dist/research/adapters/openalex.d.ts +7 -0
- package/dist/research/adapters/openalex.d.ts.map +1 -0
- package/dist/research/adapters/openalex.js +77 -0
- package/dist/research/adapters/openalex.js.map +1 -0
- package/dist/research/adapters/pubmed.d.ts +7 -0
- package/dist/research/adapters/pubmed.d.ts.map +1 -0
- package/dist/research/adapters/pubmed.js +108 -0
- package/dist/research/adapters/pubmed.js.map +1 -0
- package/dist/research/adapters/redact-adapter-url.d.ts +3 -0
- package/dist/research/adapters/redact-adapter-url.d.ts.map +1 -0
- package/dist/research/adapters/redact-adapter-url.js +21 -0
- package/dist/research/adapters/redact-adapter-url.js.map +1 -0
- package/dist/research/adapters/types.d.ts +1 -1
- package/dist/research/adapters/types.d.ts.map +1 -1
- package/dist/research/evidence-pack.d.ts +2 -2
- package/dist/research/evidence-pack.d.ts.map +1 -1
- package/dist/research/evidence-pack.js +6 -3
- package/dist/research/evidence-pack.js.map +1 -1
- package/dist/research/index.d.ts +2 -2
- package/dist/research/index.d.ts.map +1 -1
- package/dist/research/index.js +1 -1
- package/dist/research/index.js.map +1 -1
- package/dist/research/orchestrator.d.ts +40 -2
- package/dist/research/orchestrator.d.ts.map +1 -1
- package/dist/research/orchestrator.js +102 -16
- package/dist/research/orchestrator.js.map +1 -1
- package/dist/research/query-plan.d.ts +17 -1
- package/dist/research/query-plan.d.ts.map +1 -1
- package/dist/research/query-plan.js +13 -3
- package/dist/research/query-plan.js.map +1 -1
- package/dist/research/web-search.d.ts +8 -1
- package/dist/research/web-search.d.ts.map +1 -1
- package/dist/research/web-search.js +16 -4
- package/dist/research/web-search.js.map +1 -1
- package/dist/unified/two-phase-pipeline.d.ts +2 -0
- package/dist/unified/two-phase-pipeline.d.ts.map +1 -1
- package/dist/unified/two-phase-pipeline.js +13 -1
- package/dist/unified/two-phase-pipeline.js.map +1 -1
- package/package.json +1 -5
- package/src/skills/journal_recall/implement.md +3 -3
- package/src/skills/journal_recall/review.md +1 -0
- package/src/skills/journal_record/implement.md +20 -4
- package/src/skills/journal_record/review.md +6 -3
- package/src/skills/research/implement.md +30 -2
|
@@ -1,34 +1,86 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Step 2 of the /research pipeline. Deterministic Node-only fan-out across
|
|
3
|
-
// enabled adapters + Brave, with per-adapter timeout, concurrency cap scoped
|
|
4
|
-
// to this single call, and post-budget evidence pack assembly.
|
|
5
1
|
import { applyBudget, } from './evidence-pack.js';
|
|
6
2
|
const TASK_TO_GROUP = {
|
|
7
3
|
brave: 'brave',
|
|
4
|
+
brave_news: 'brave_news',
|
|
8
5
|
arxiv: 'arxiv',
|
|
9
6
|
ss: 'semantic_scholar',
|
|
10
7
|
gh_repo: 'github_repo',
|
|
11
8
|
gh_code: 'github_code',
|
|
9
|
+
openalex: 'openalex',
|
|
10
|
+
crossref: 'crossref',
|
|
11
|
+
pubmed: 'pubmed',
|
|
12
12
|
};
|
|
13
13
|
function buildTasks(plan) {
|
|
14
14
|
const tasks = [];
|
|
15
|
-
for (const
|
|
16
|
-
|
|
15
|
+
for (const bq of plan.braveQueries) {
|
|
16
|
+
const query = bq.siteFilter ? `${bq.siteFilter} ${bq.q}` : bq.q;
|
|
17
|
+
if (bq.endpoint === 'news') {
|
|
18
|
+
tasks.push({ kind: 'brave_news', query, freshness: bq.freshness, siteFilter: bq.siteFilter });
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
tasks.push({ kind: 'brave', query, freshness: bq.freshness, siteFilter: bq.siteFilter });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
17
24
|
for (const q of plan.arxivQueries)
|
|
18
25
|
tasks.push({ kind: 'arxiv', query: q });
|
|
19
26
|
for (const q of plan.semanticScholarQueries)
|
|
20
27
|
tasks.push({ kind: 'ss', query: q });
|
|
21
28
|
for (const g of plan.githubQueries)
|
|
22
29
|
tasks.push({ kind: g.kind === 'repo' ? 'gh_repo' : 'gh_code', query: g.q });
|
|
30
|
+
for (const q of plan.openalexQueries)
|
|
31
|
+
tasks.push({ kind: 'openalex', query: q });
|
|
32
|
+
for (const q of plan.crossrefQueries)
|
|
33
|
+
tasks.push({ kind: 'crossref', query: q });
|
|
34
|
+
for (const q of plan.pubmedQueries)
|
|
35
|
+
tasks.push({ kind: 'pubmed', query: q });
|
|
23
36
|
return tasks;
|
|
24
37
|
}
|
|
25
38
|
function isAdapterEnabled(kind, enabled) {
|
|
26
39
|
switch (kind) {
|
|
40
|
+
case 'brave':
|
|
41
|
+
case 'brave_news': return true;
|
|
27
42
|
case 'arxiv': return enabled.includes('arxiv');
|
|
28
43
|
case 'ss': return enabled.includes('semantic_scholar');
|
|
29
44
|
case 'gh_repo':
|
|
30
45
|
case 'gh_code': return enabled.includes('github_search');
|
|
31
|
-
case '
|
|
46
|
+
case 'openalex': return enabled.includes('openalex');
|
|
47
|
+
case 'crossref': return enabled.includes('crossref');
|
|
48
|
+
case 'pubmed': return enabled.includes('pubmed');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Per-adapter concurrency limits per spec (rate-limiting, timeouts, and error recovery). */
|
|
52
|
+
const ADAPTER_CONCURRENCY = {
|
|
53
|
+
brave: 5,
|
|
54
|
+
brave_news: 5,
|
|
55
|
+
openalex: 10,
|
|
56
|
+
crossref: 5,
|
|
57
|
+
pubmed: 2, // 3 req/s hard limit without key; conservative
|
|
58
|
+
arxiv: 1, // arXiv asks for sequential access
|
|
59
|
+
ss: 3,
|
|
60
|
+
gh_repo: 3,
|
|
61
|
+
gh_code: 3,
|
|
62
|
+
};
|
|
63
|
+
/** Simple semaphore for per-adapter concurrency control. */
|
|
64
|
+
class Semaphore {
|
|
65
|
+
max;
|
|
66
|
+
running = 0;
|
|
67
|
+
queue = [];
|
|
68
|
+
constructor(max) {
|
|
69
|
+
this.max = max;
|
|
70
|
+
}
|
|
71
|
+
async acquire() {
|
|
72
|
+
if (this.running < this.max) {
|
|
73
|
+
this.running++;
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
await new Promise(resolve => this.queue.push(resolve));
|
|
77
|
+
this.running++;
|
|
78
|
+
}
|
|
79
|
+
release() {
|
|
80
|
+
this.running--;
|
|
81
|
+
const next = this.queue.shift();
|
|
82
|
+
if (next)
|
|
83
|
+
next();
|
|
32
84
|
}
|
|
33
85
|
}
|
|
34
86
|
function withTimeout(p, ms) {
|
|
@@ -37,7 +89,7 @@ function withTimeout(p, ms) {
|
|
|
37
89
|
p.then(v => { clearTimeout(t); resolve(v); }, e => { clearTimeout(t); reject(e); });
|
|
38
90
|
});
|
|
39
91
|
}
|
|
40
|
-
async function runOne(task, deps, sources, fails) {
|
|
92
|
+
async function runOne(task, deps, sources, fails, semaphores) {
|
|
41
93
|
if (!isAdapterEnabled(task.kind, deps.enabledAdapters)) {
|
|
42
94
|
fails.push({
|
|
43
95
|
source: TASK_TO_GROUP[task.kind],
|
|
@@ -47,12 +99,21 @@ async function runOne(task, deps, sources, fails) {
|
|
|
47
99
|
return;
|
|
48
100
|
}
|
|
49
101
|
const queryStr = task.query;
|
|
102
|
+
const sem = semaphores.get(task.kind);
|
|
103
|
+
await sem.acquire();
|
|
50
104
|
try {
|
|
51
105
|
let raw;
|
|
52
106
|
switch (task.kind) {
|
|
53
107
|
case 'brave':
|
|
54
|
-
|
|
108
|
+
case 'brave_news': {
|
|
109
|
+
const opts = {
|
|
110
|
+
endpoint: task.kind === 'brave_news' ? 'news' : 'web',
|
|
111
|
+
freshness: task.freshness,
|
|
112
|
+
extraSnippets: true,
|
|
113
|
+
};
|
|
114
|
+
raw = await withTimeout(deps.brave.search(task.query, opts), deps.perAdapterTimeoutMs);
|
|
55
115
|
break;
|
|
116
|
+
}
|
|
56
117
|
case 'arxiv':
|
|
57
118
|
raw = await withTimeout(deps.adapters.arxiv(task.query), deps.perAdapterTimeoutMs);
|
|
58
119
|
break;
|
|
@@ -65,14 +126,30 @@ async function runOne(task, deps, sources, fails) {
|
|
|
65
126
|
case 'gh_code':
|
|
66
127
|
raw = await withTimeout(deps.adapters.github(task.query, 'code'), deps.perAdapterTimeoutMs);
|
|
67
128
|
break;
|
|
129
|
+
case 'openalex':
|
|
130
|
+
raw = await withTimeout(deps.adapters.openalex(task.query), deps.perAdapterTimeoutMs);
|
|
131
|
+
break;
|
|
132
|
+
case 'crossref':
|
|
133
|
+
raw = await withTimeout(deps.adapters.crossref(task.query), deps.perAdapterTimeoutMs);
|
|
134
|
+
break;
|
|
135
|
+
case 'pubmed':
|
|
136
|
+
raw = await withTimeout(deps.adapters.pubmed(task.query), deps.perAdapterTimeoutMs);
|
|
137
|
+
break;
|
|
68
138
|
}
|
|
69
|
-
|
|
70
|
-
if (task.kind === 'brave') {
|
|
139
|
+
if (task.kind === 'brave' || task.kind === 'brave_news') {
|
|
71
140
|
const br = raw;
|
|
72
|
-
br.results.forEach((r, i) =>
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
141
|
+
br.results.forEach((r, i) => {
|
|
142
|
+
const snippetParts = [r.snippet];
|
|
143
|
+
if (r.extraSnippets)
|
|
144
|
+
snippetParts.push(...r.extraSnippets);
|
|
145
|
+
sources.push({
|
|
146
|
+
source: TASK_TO_GROUP[task.kind], query: queryStr,
|
|
147
|
+
title: r.title, url: r.url,
|
|
148
|
+
snippet: snippetParts.join('\n'),
|
|
149
|
+
publishedAt: r.pageAge,
|
|
150
|
+
rank: i,
|
|
151
|
+
});
|
|
152
|
+
});
|
|
76
153
|
}
|
|
77
154
|
else {
|
|
78
155
|
const arr = raw;
|
|
@@ -89,11 +166,19 @@ async function runOne(task, deps, sources, fails) {
|
|
|
89
166
|
reason: e.message || 'unknown',
|
|
90
167
|
});
|
|
91
168
|
}
|
|
169
|
+
finally {
|
|
170
|
+
sem.release();
|
|
171
|
+
}
|
|
92
172
|
}
|
|
93
173
|
export async function runOrchestrator(plan, deps) {
|
|
94
174
|
const tasks = buildTasks(plan);
|
|
95
175
|
const sources = [];
|
|
96
176
|
const fails = [];
|
|
177
|
+
// Per-adapter semaphores for concurrency enforcement
|
|
178
|
+
const semaphores = new Map();
|
|
179
|
+
for (const kind of Object.keys(ADAPTER_CONCURRENCY)) {
|
|
180
|
+
semaphores.set(kind, new Semaphore(ADAPTER_CONCURRENCY[kind]));
|
|
181
|
+
}
|
|
97
182
|
let cursor = 0;
|
|
98
183
|
const workers = [];
|
|
99
184
|
const worker = async () => {
|
|
@@ -101,7 +186,7 @@ export async function runOrchestrator(plan, deps) {
|
|
|
101
186
|
const idx = cursor++;
|
|
102
187
|
if (idx >= tasks.length)
|
|
103
188
|
return;
|
|
104
|
-
await runOne(tasks[idx], deps, sources, fails);
|
|
189
|
+
await runOne(tasks[idx], deps, sources, fails, semaphores);
|
|
105
190
|
}
|
|
106
191
|
};
|
|
107
192
|
for (let i = 0; i < Math.min(deps.concurrencyCap, tasks.length); i++) {
|
|
@@ -110,4 +195,5 @@ export async function runOrchestrator(plan, deps) {
|
|
|
110
195
|
await Promise.all(workers);
|
|
111
196
|
return applyBudget(sources, fails);
|
|
112
197
|
}
|
|
198
|
+
export { ADAPTER_CONCURRENCY };
|
|
113
199
|
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/research/orchestrator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/research/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
export declare const QueryPlanSchema: z.ZodObject<{
|
|
3
|
-
braveQueries: z.ZodArray<z.
|
|
3
|
+
braveQueries: z.ZodArray<z.ZodObject<{
|
|
4
|
+
q: z.ZodString;
|
|
5
|
+
freshness: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
|
|
6
|
+
pd: "pd";
|
|
7
|
+
pw: "pw";
|
|
8
|
+
pm: "pm";
|
|
9
|
+
py: "py";
|
|
10
|
+
}>, z.ZodString]>>;
|
|
11
|
+
endpoint: z.ZodDefault<z.ZodEnum<{
|
|
12
|
+
web: "web";
|
|
13
|
+
news: "news";
|
|
14
|
+
}>>;
|
|
15
|
+
siteFilter: z.ZodOptional<z.ZodString>;
|
|
16
|
+
}, z.core.$strip>>;
|
|
4
17
|
arxivQueries: z.ZodArray<z.ZodString>;
|
|
5
18
|
semanticScholarQueries: z.ZodArray<z.ZodString>;
|
|
6
19
|
githubQueries: z.ZodArray<z.ZodObject<{
|
|
@@ -10,6 +23,9 @@ export declare const QueryPlanSchema: z.ZodObject<{
|
|
|
10
23
|
repo: "repo";
|
|
11
24
|
}>;
|
|
12
25
|
}, z.core.$strip>>;
|
|
26
|
+
openalexQueries: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
27
|
+
crossrefQueries: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
28
|
+
pubmedQueries: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
13
29
|
}, z.core.$strict>;
|
|
14
30
|
export type QueryPlan = z.infer<typeof QueryPlanSchema>;
|
|
15
31
|
export declare function parseQueryPlan(json: string): QueryPlan;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-plan.d.ts","sourceRoot":"","sources":["../../src/research/query-plan.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"query-plan.d.ts","sourceRoot":"","sources":["../../src/research/query-plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAexB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAWjB,CAAC;AAEZ,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAYtD"}
|
|
@@ -1,16 +1,26 @@
|
|
|
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.
|
|
3
1
|
import { z } from 'zod';
|
|
4
2
|
const Query200 = z.string().min(1).max(200);
|
|
5
3
|
const Queries = z.array(Query200).max(8);
|
|
4
|
+
const BraveQuery = z.object({
|
|
5
|
+
q: Query200,
|
|
6
|
+
freshness: z.union([
|
|
7
|
+
z.enum(['pd', 'pw', 'pm', 'py']),
|
|
8
|
+
z.string().regex(/^\d{4}-\d{2}-\d{2}to\d{4}-\d{2}-\d{2}$/),
|
|
9
|
+
]).optional(),
|
|
10
|
+
endpoint: z.enum(['web', 'news']).default('web'),
|
|
11
|
+
siteFilter: z.string().max(100).optional(),
|
|
12
|
+
});
|
|
6
13
|
export const QueryPlanSchema = z.object({
|
|
7
|
-
braveQueries:
|
|
14
|
+
braveQueries: z.array(BraveQuery).max(8),
|
|
8
15
|
arxivQueries: Queries,
|
|
9
16
|
semanticScholarQueries: Queries,
|
|
10
17
|
githubQueries: z.array(z.object({
|
|
11
18
|
q: Query200,
|
|
12
19
|
kind: z.enum(['repo', 'code']),
|
|
13
20
|
})).max(8),
|
|
21
|
+
openalexQueries: Queries.default([]),
|
|
22
|
+
crossrefQueries: Queries.default([]),
|
|
23
|
+
pubmedQueries: Queries.default([]),
|
|
14
24
|
}).strict();
|
|
15
25
|
export function parseQueryPlan(json) {
|
|
16
26
|
let raw;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-plan.js","sourceRoot":"","sources":["../../src/research/query-plan.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"query-plan.js","sourceRoot":"","sources":["../../src/research/query-plan.ts"],"names":[],"mappings":"AAAA,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;AAEzC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,CAAC,EAAW,QAAQ;IACpB,SAAS,EAAG,CAAC,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,wCAAwC,CAAC;KAC3D,CAAC,CAAC,QAAQ,EAAE;IACb,QAAQ,EAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAClD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CAC3C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,YAAY,EAAY,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,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,eAAe,EAAS,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3C,eAAe,EAAS,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3C,aAAa,EAAW,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;CAC5C,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"}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import type { ResearchConfig } from '../config/schema.js';
|
|
2
|
+
export interface BraveSearchOptions {
|
|
3
|
+
freshness?: string;
|
|
4
|
+
endpoint?: 'web' | 'news';
|
|
5
|
+
extraSnippets?: boolean;
|
|
6
|
+
}
|
|
2
7
|
export interface BraveSearchResult {
|
|
3
8
|
title: string;
|
|
4
9
|
url: string;
|
|
5
10
|
snippet: string;
|
|
11
|
+
pageAge?: string;
|
|
12
|
+
extraSnippets?: string[];
|
|
6
13
|
}
|
|
7
14
|
export interface BraveSearchResponse {
|
|
8
15
|
results: BraveSearchResult[];
|
|
@@ -24,6 +31,6 @@ export declare class BraveClient {
|
|
|
24
31
|
random?: () => number;
|
|
25
32
|
});
|
|
26
33
|
private takeKeySlot;
|
|
27
|
-
search(query: string,
|
|
34
|
+
search(query: string, options?: BraveSearchOptions): Promise<BraveSearchResponse>;
|
|
28
35
|
}
|
|
29
36
|
//# sourceMappingURL=web-search.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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,kBAAkB;IACjC,SAAS,CAAC,EAAM,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAO,KAAK,GAAG,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AACD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AACD,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;AA2BD,qBAAa,WAAW;IAoBpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAnBtB,OAAO,CAAC,YAAY,CAAK;IAKzB,OAAO,CAAC,aAAa,CAAgB;IAOrC,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;YAY3D,WAAW;IA2BnB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAwFxF"}
|
|
@@ -15,10 +15,15 @@ function validateBraveResults(body) {
|
|
|
15
15
|
return { title: `[invalid entry ${i}]`, url: '', snippet: '' };
|
|
16
16
|
}
|
|
17
17
|
const item = r;
|
|
18
|
+
const extraSnippets = Array.isArray(item.extra_snippets)
|
|
19
|
+
? item.extra_snippets.filter((s) => typeof s === 'string')
|
|
20
|
+
: undefined;
|
|
18
21
|
return {
|
|
19
22
|
title: typeof item.title === 'string' ? item.title : `[missing title ${i}]`,
|
|
20
23
|
url: typeof item.url === 'string' ? item.url : '',
|
|
21
24
|
snippet: typeof item.snippet === 'string' ? item.snippet : '',
|
|
25
|
+
pageAge: typeof item.page_age === 'string' ? item.page_age : undefined,
|
|
26
|
+
extraSnippets: extraSnippets && extraSnippets.length > 0 ? extraSnippets : undefined,
|
|
22
27
|
};
|
|
23
28
|
});
|
|
24
29
|
}
|
|
@@ -77,13 +82,20 @@ export class BraveClient {
|
|
|
77
82
|
release();
|
|
78
83
|
}
|
|
79
84
|
}
|
|
80
|
-
async search(query,
|
|
85
|
+
async search(query, options) {
|
|
81
86
|
if (this.cfg.apiKeys.length === 0) {
|
|
82
87
|
throw new Error('brave_not_configured: no API keys configured');
|
|
83
88
|
}
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
89
|
+
const endpoint = options?.endpoint ?? 'web';
|
|
90
|
+
const basePath = endpoint === 'news' ? '/res/v1/news/search' : '/res/v1/web/search';
|
|
91
|
+
const count = endpoint === 'news' ? 50 : 20;
|
|
92
|
+
const url = new URL(`https://api.search.brave.com${basePath}`);
|
|
93
|
+
url.searchParams.set('q', query);
|
|
94
|
+
url.searchParams.set('count', String(count));
|
|
95
|
+
if (options?.freshness) {
|
|
96
|
+
url.searchParams.set('freshness', options.freshness);
|
|
97
|
+
}
|
|
98
|
+
url.searchParams.set('extra_snippets', 'true');
|
|
87
99
|
const maxAttempts = Math.min(this.cfg.apiKeys.length, 4);
|
|
88
100
|
const attempts = [];
|
|
89
101
|
const deadline = Date.now() + this.cfg.timeoutMs;
|
|
@@ -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;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/research/web-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAqB7C,SAAS,oBAAoB,CAAC,IAAa;IACzC,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACxD,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;IAClB,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACtD,MAAM,OAAO,GAAI,GAA+B,CAAC,OAAO,CAAC;IACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,CAAS,EAAE,EAAE;QAC3C,IAAI,CAAC,IAAI,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YACvC,OAAO,EAAE,KAAK,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACjE,CAAC;QACD,MAAM,IAAI,GAAG,CAA4B,CAAC;QAC1C,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC;YACtD,CAAC,CAAE,IAAI,CAAC,cAA4B,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;YACtF,CAAC,CAAC,SAAS,CAAC;QACd,OAAO;YACL,KAAK,EAAE,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,GAAG;YAC3E,GAAG,EAAE,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACjD,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAC7D,OAAO,EAAE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YACtE,aAAa,EAAE,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;SACrF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,OAAO,WAAW;IAoBH;IAnBX,YAAY,GAAG,CAAC,CAAC;IACzB,4EAA4E;IAC5E,uEAAuE;IACvE,2EAA2E;IAC3E,iEAAiE;IACzD,aAAa,GAAa,EAAE,CAAC;IACrC,iEAAiE;IACjE,2EAA2E;IAC3E,2EAA2E;IAC3E,qEAAqE;IACrE,oEAAoE;IACpE,4BAA4B;IACpB,SAAS,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAErD,yDAAyD;IACxC,MAAM,CAAgC;IACtC,OAAO,CAAe;IAEvC,YACmB,GAA4B,EAC7C,IAAuE;QADtD,QAAG,GAAH,GAAG,CAAyB;QAG7C,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7E,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,0EAA0E;IAC1E,yEAAyE;IACzE,wEAAwE;IACxE,0EAA0E;IAC1E,wEAAwE;IACxE,qCAAqC;IAC7B,KAAK,CAAC,WAAW;QACvB,IAAI,OAAoB,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC;YACX,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC5C,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC;YAC9B,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAEhD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,CAAC;YACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1C,mEAAmE;YACnE,oEAAoE;YACpE,MAAM,UAAU,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACvE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;YACrC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,GAAG,CAAC,EAAE,CAAC;QACxD,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,OAA4B;QACtD,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,KAAK,CAAC;QAC5C,MAAM,QAAQ,GAAG,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,oBAAoB,CAAC;QACpF,MAAM,KAAK,GAAG,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE5C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;QAC/D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7C,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;YACvB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACvD,CAAC;QACD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAE/C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAoC,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;QAEjD,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;QACnB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YACD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YACjD,SAAS,GAAG,GAAG,CAAC;YAEhB,wEAAwE;YACxE,2DAA2D;YAC3D,IAAI,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAClD,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;YAED,uEAAuE;YACvE,4DAA4D;YAC5D,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAE,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACxC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;YACxD,IAAI,GAAoD,CAAC;YACzD,IAAI,CAAC;gBACH,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;oBAClC,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE;wBACP,QAAQ,EAAE,kBAAkB;wBAC5B,YAAY,EAAE,UAAU;wBACxB,sBAAsB,EAAE,GAAG;qBAC5B;oBACD,MAAM,EAAE,IAAI,CAAC,MAAM;iBACpB,CAAC,CAAC;gBACH,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAC3B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,EAAa,CAAC;oBAC9C,OAAO;wBACL,OAAO,EAAE,oBAAoB,CAAC,IAAI,CAAC;wBACnC,QAAQ,EAAE,GAAG;wBACb,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;qBACxD,CAAC;gBACJ,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YAC3D,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAClC,IAAI,CAAC;wBAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;YAED,oCAAoC;YACpC,IAAI,OAAO,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC;gBACxD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,CAAC;gBACpD,sEAAsE;gBACtE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACpE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,kBAAkB,SAAS,EAAE,CAAC,CAAC;IAC3F,CAAC;CACF"}
|
|
@@ -24,6 +24,8 @@ export interface PipelineInput {
|
|
|
24
24
|
implementerGoal?: string;
|
|
25
25
|
/** Goal condition for the reviewer. */
|
|
26
26
|
reviewerGoal?: string;
|
|
27
|
+
/** EnvelopeBus for provider-level event streaming (stderr + JSONL + telemetry). */
|
|
28
|
+
bus?: object;
|
|
27
29
|
}
|
|
28
30
|
export interface SessionInfo {
|
|
29
31
|
tier: AgentType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"two-phase-pipeline.d.ts","sourceRoot":"","sources":["../../src/unified/two-phase-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAW,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE3E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,QAAQ,CAAC;IAC9B,gBAAgB,EAAE,QAAQ,CAAC;IAC3B,eAAe,EAAE,SAAS,CAAC;IAC3B,YAAY,EAAE,SAAS,CAAC;IACxB,YAAY,EAAE,UAAU,GAAG,MAAM,CAAC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,aAAa,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"two-phase-pipeline.d.ts","sourceRoot":"","sources":["../../src/unified/two-phase-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAW,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE3E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,QAAQ,CAAC;IAC9B,gBAAgB,EAAE,QAAQ,CAAC;IAC3B,eAAe,EAAE,SAAS,CAAC;IAC3B,YAAY,EAAE,SAAS,CAAC;IACxB,YAAY,EAAE,UAAU,GAAG,MAAM,CAAC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,aAAa,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,GAAG,oBAAoB,GAAG,QAAQ,CAAC;IACjD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,UAAU,CAAC;IAC5B,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,EAAE;QACR,WAAW,EAAE,WAAW,CAAC;QACzB,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;KAC9B,CAAC;IACF,IAAI,EAAE;QACJ,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC;IACF,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;CAC/B;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAmHvF"}
|
|
@@ -13,6 +13,16 @@ export async function runTwoPhasePipeline(input) {
|
|
|
13
13
|
effectiveCwd = created.path;
|
|
14
14
|
wtInfo = { branch: created.branch, path: created.path };
|
|
15
15
|
}
|
|
16
|
+
// --- Rewrite file paths in the payload to use the worktree cwd ---
|
|
17
|
+
// When a worktree is active, the taskPayload may contain absolute paths
|
|
18
|
+
// referencing the original cwd (e.g. plan file paths). The implementer's
|
|
19
|
+
// session cwd is the worktree, so it will infer the repo root from those
|
|
20
|
+
// paths and write files to the original repo instead of the worktree.
|
|
21
|
+
// Rewriting the paths removes this ambiguity.
|
|
22
|
+
let effectivePayload = input.taskPayload;
|
|
23
|
+
if (effectiveCwd !== input.cwd) {
|
|
24
|
+
effectivePayload = input.taskPayload.replaceAll(input.cwd, effectiveCwd);
|
|
25
|
+
}
|
|
16
26
|
const sessions = [];
|
|
17
27
|
// --- Worktree cleanup helper ---
|
|
18
28
|
const resolveWorktree = async () => {
|
|
@@ -32,9 +42,10 @@ export async function runTwoPhasePipeline(input) {
|
|
|
32
42
|
abortSignal: ac.signal,
|
|
33
43
|
taskId: input.taskId ?? 'pipeline',
|
|
34
44
|
taskIndex: 0,
|
|
45
|
+
bus: input.bus,
|
|
35
46
|
});
|
|
36
47
|
sessions.push(implSession);
|
|
37
|
-
const implPrompt = `${input.implementerSkill}\n\n---\n\n## Task\n\n${
|
|
48
|
+
const implPrompt = `${input.implementerSkill}\n\n---\n\n## Task\n\n${effectivePayload}`;
|
|
38
49
|
const implTurn = await implSession.send(implPrompt, {
|
|
39
50
|
...(input.implementerGoal && { goalCondition: input.implementerGoal }),
|
|
40
51
|
});
|
|
@@ -63,6 +74,7 @@ export async function runTwoPhasePipeline(input) {
|
|
|
63
74
|
abortSignal: ac.signal,
|
|
64
75
|
taskId: input.taskId ?? 'pipeline',
|
|
65
76
|
taskIndex: 1,
|
|
77
|
+
bus: input.bus,
|
|
66
78
|
});
|
|
67
79
|
sessions.push(revSession);
|
|
68
80
|
const revPrompt = `${input.reviewerSkill}\n\n---\n\n## Implementer Output\n\n${implTurn.output}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"two-phase-pipeline.js","sourceRoot":"","sources":["../../src/unified/two-phase-pipeline.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAuB,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,eAAe,EAAqB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"two-phase-pipeline.js","sourceRoot":"","sources":["../../src/unified/two-phase-pipeline.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhixuan92/multi-model-agent-core",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.3.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Core library for multi-model-agent: provider runners (Claude, Codex, OpenAI-compatible), routing logic, config schema, and tool/sandbox primitives.",
|
|
@@ -89,10 +89,6 @@
|
|
|
89
89
|
"types": "./dist/events/stderr-log-subscriber.d.ts",
|
|
90
90
|
"import": "./dist/events/stderr-log-subscriber.js"
|
|
91
91
|
},
|
|
92
|
-
"./bounded-execution/file-artifact-check": {
|
|
93
|
-
"types": "./dist/bounded-execution/file-artifact-check.d.ts",
|
|
94
|
-
"import": "./dist/bounded-execution/file-artifact-check.js"
|
|
95
|
-
},
|
|
96
92
|
"./events/consent-rules": {
|
|
97
93
|
"types": "./dist/events/consent-rules.d.ts",
|
|
98
94
|
"import": "./dist/events/consent-rules.js"
|
|
@@ -4,7 +4,7 @@ You search a project's learnings journal at `.mmagent/journal/` to answer a conc
|
|
|
4
4
|
|
|
5
5
|
## Why This Exists
|
|
6
6
|
|
|
7
|
-
mma-journal-recall is the read side of the
|
|
7
|
+
mma-journal-recall is the read side of the team knowledge graph. The caller is about to design, attempt, or decide something and wants to know what THIS project already learned — decisions made, design rationale, user behavior patterns, process learnings, research findings, and style conventions. Your output replaces their own journal search — they will take your synthesis at face value and use it to avoid re-treading ground already explored.
|
|
8
8
|
|
|
9
9
|
**Completion test:** would the caller, reading your synthesis and the cited nodes, reach the same conclusion if they searched the journal themselves — or would they find relevant nodes you missed, or nodes you cited that do not actually say what you claimed?
|
|
10
10
|
|
|
@@ -12,7 +12,7 @@ mma-journal-recall is the read side of the learnings graph. The caller is about
|
|
|
12
12
|
|
|
13
13
|
Apply ALL perspectives regardless of the question. Each may yield candidate answers:
|
|
14
14
|
|
|
15
|
-
1. **KEYWORD-MATCH** — Read `index.md` (or list `nodes/`), then open nodes whose title/tags/body share the query's key terms. Your candidate answers are those nodes, each cited with its id, status, and the lesson that answers the query.
|
|
15
|
+
1. **KEYWORD-MATCH** — Read `index.md` (or list `nodes/`), then open nodes whose title/tags/body/category share the query's key terms. When the query targets a specific knowledge type (e.g., "what conventions do we follow" → `style` category, "how does the user prefer to work" → `behavior` category), prioritize nodes in that category. Your candidate answers are those nodes, each cited with its id, category, status, and the lesson that answers the query.
|
|
16
16
|
|
|
17
17
|
2. **GRAPH-NEIGHBORHOOD** — From the nodes that match the query, follow `refines`/`depends-on`/`parent` edges and supersedes chains (to the current head) to gather connected context. Your candidate answers are the neighborhood nodes that explain or qualify the direct matches.
|
|
18
18
|
|
|
@@ -56,5 +56,5 @@ Before finishing, verify:
|
|
|
56
56
|
Output exactly one JSON block:
|
|
57
57
|
|
|
58
58
|
```json
|
|
59
|
-
{"results": [{"learning": "<lesson from node>", "context": "<surrounding edges and related nodes>", "relevance": "critical|high|medium|low", "nodeId": "<id>", "nodePath": "<file path>", "status": "<adopted|dropped|inconclusive|superseded>"}], "summary": "<synthesis answering the query, naming how nodes relate>"}
|
|
59
|
+
{"results": [{"learning": "<lesson from node>", "context": "<surrounding edges and related nodes>", "relevance": "critical|high|medium|low", "nodeId": "<id>", "nodePath": "<file path>", "category": "<decision|design|behavior|process|knowledge|style>", "status": "<adopted|dropped|inconclusive|superseded>"}], "summary": "<synthesis answering the query, naming how nodes relate>"}
|
|
60
60
|
```
|
|
@@ -20,6 +20,7 @@ Every cited node must be real and correctly quoted:
|
|
|
20
20
|
- Was each cited node actually read this session, or is the citation from memory/hallucination?
|
|
21
21
|
- Does the `learning` field accurately represent what the node says, or has it been paraphrased beyond recognition?
|
|
22
22
|
- Is the `status` field correct for each cited node?
|
|
23
|
+
- Is the `category` field correct for each cited node (matches the node's frontmatter)?
|
|
23
24
|
|
|
24
25
|
Remove findings that cite non-existent or unread nodes. This is the highest-priority check.
|
|
25
26
|
|
|
@@ -4,7 +4,7 @@ You maintain a project's learnings journal at `.mmagent/journal/`. Integrate one
|
|
|
4
4
|
|
|
5
5
|
## Why This Exists
|
|
6
6
|
|
|
7
|
-
The journal is a persistent graph of
|
|
7
|
+
The journal is a persistent graph of team knowledge — decisions, design rationale, user behavior patterns, process learnings, research findings, and style conventions. Each entry is a categorized node with typed edges to related nodes. The graph survives across sessions so future work can recall what this project already learned. Your job is to integrate new entries while maintaining graph integrity.
|
|
8
8
|
|
|
9
9
|
## Integration Procedure
|
|
10
10
|
|
|
@@ -20,9 +20,9 @@ Process learnings IN ORDER (learningIndex 0, 1, 2, ...). For EACH learning:
|
|
|
20
20
|
- **merge**: adds no new causal claim/constraint/consequence. Fold into the existing node.
|
|
21
21
|
- **create**: matches no existing node.
|
|
22
22
|
|
|
23
|
-
4. **Write node files** as `nodes/<id>-<kebab-title>.md` with YAML frontmatter (`id`, `title`, `status`, `tags` [lowercase-kebab], `date`, `links` [typed edges], `supersededBy`) + `## Context` and `## Consequences`. id = max(existing)+1, zero-padded 4 digits (collision-free because you integrate strictly in order).
|
|
23
|
+
4. **Write node files** as `nodes/<id>-<kebab-title>.md` with YAML frontmatter (`id`, `title`, `category`, `status`, `tags` [lowercase-kebab], `date`, `links` [typed edges], `supersededBy`) + `## Context` and `## Consequences`. id = max(existing)+1, zero-padded 4 digits (collision-free because you integrate strictly in order).
|
|
24
24
|
|
|
25
|
-
5. **Update catalog.** Append ONE `log.md` line (`<ISO-8601 date> <op> <id> <title>`), then update `index.md` (table: id | date | status | title | tags, sorted by id asc). FLUSH all writes for this learning to disk BEFORE starting the next learning.
|
|
25
|
+
5. **Update catalog.** Append ONE `log.md` line (`<ISO-8601 date> <op> <id> <title>`), then update `index.md` (table: id | date | category | status | title | tags, sorted by id asc). FLUSH all writes for this learning to disk BEFORE starting the next learning.
|
|
26
26
|
|
|
27
27
|
6. **Handle failures.** If a single learning cannot be integrated, record it in `failed` (see report format) and CONTINUE to the next learning — do not abort the batch.
|
|
28
28
|
|
|
@@ -34,8 +34,24 @@ Process learnings IN ORDER (learningIndex 0, 1, 2, ...). For EACH learning:
|
|
|
34
34
|
|
|
35
35
|
- **Edge types** (only): `supersedes`, `refines`, `relates`, `depends-on`, `contradicts`, `parent`.
|
|
36
36
|
- **Status values** (only): `adopted`, `dropped`, `inconclusive`, `superseded`.
|
|
37
|
+
- **Category values** (only): `decision`, `design`, `behavior`, `process`, `knowledge`, `style`.
|
|
37
38
|
|
|
38
|
-
Do not invent edge types
|
|
39
|
+
Do not invent edge types, status values, or categories outside these vocabularies.
|
|
40
|
+
|
|
41
|
+
## Category Classification
|
|
42
|
+
|
|
43
|
+
Every node MUST have a `category` field. Classify based on what the entry captures:
|
|
44
|
+
|
|
45
|
+
| Category | Signal words / patterns | `## Context` describes | `## Consequences` describes |
|
|
46
|
+
|----------|------------------------|------------------------|---------------------------|
|
|
47
|
+
| `decision` | tried, dropped, chose, trade-off, instead | What was tried and what happened | What to do instead, when this applies |
|
|
48
|
+
| `design` | architecture, pattern, why, rationale, layer | Why the system is structured this way | Constraints this creates, what breaks if violated |
|
|
49
|
+
| `behavior` | user, workflow, prefers, communication, style | What the user/team does and when | How to adapt, what to expect |
|
|
50
|
+
| `process` | SDLC, phase, audit, pipeline, release, gate | How the process works, what was observed | When to use this process, what to watch for |
|
|
51
|
+
| `knowledge` | found, API, library, feasibility, ecosystem | What was discovered, the evidence | How to apply it, where it's relevant |
|
|
52
|
+
| `style` | convention, naming, format, documentation | What the convention is, where it applies | When to follow it, exceptions |
|
|
53
|
+
|
|
54
|
+
When an entry spans categories (e.g., a design decision informed by user behavior), pick the **primary** category and use `relates` edges to connect to nodes in the other category.
|
|
39
55
|
|
|
40
56
|
## Trust Boundary
|
|
41
57
|
|
|
@@ -24,10 +24,12 @@ Reclassify when the existing graph contradicts the chosen operation.
|
|
|
24
24
|
|
|
25
25
|
### 3. Node Quality
|
|
26
26
|
|
|
27
|
-
- Does each node have correct YAML frontmatter (`id`, `title`, `status`, `tags`, `date`, `links`)?
|
|
27
|
+
- Does each node have correct YAML frontmatter (`id`, `title`, `category`, `status`, `tags`, `date`, `links`)?
|
|
28
|
+
- Is the `category` field one of the fixed enum values: `decision`, `design`, `behavior`, `process`, `knowledge`, `style`?
|
|
29
|
+
- Does the category match the content? A `decision` has a trade-off outcome; a `behavior` describes a user/team pattern; a `knowledge` states a factual finding; etc.
|
|
28
30
|
- Does each node have `## Context` and `## Consequences` sections?
|
|
29
31
|
- Are tags lowercase-kebab format?
|
|
30
|
-
- Is the node body
|
|
32
|
+
- Is the node body actionable (not just an observation)? Every category should state what to do with the knowledge — a `behavior` says how to adapt; a `knowledge` says how to apply it; a `decision` says what to do instead.
|
|
31
33
|
- Are secrets/credentials redacted from recorded content?
|
|
32
34
|
|
|
33
35
|
### 4. Catalog Consistency
|
|
@@ -51,8 +53,9 @@ Reclassify when the existing graph contradicts the chosen operation.
|
|
|
51
53
|
|
|
52
54
|
- Reclassify operations when the existing graph contradicts the chosen op.
|
|
53
55
|
- Fix edge types that use non-vocabulary terms.
|
|
56
|
+
- Fix missing or incorrect `category` fields.
|
|
54
57
|
- Add missing `supersededBy` links on superseded nodes.
|
|
55
|
-
- Flag
|
|
58
|
+
- Flag entries recorded as observations rather than actionable knowledge.
|
|
56
59
|
- Report any writes outside `.mmagent/journal/`.
|
|
57
60
|
- Fix catalog inconsistencies (missing index entries, out-of-order sorting).
|
|
58
61
|
|