nexus-agents 8.18.0 → 8.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ast-rule-runner-AJAWZQNS.js → ast-rule-runner-27XDHRZH.js} +3 -3
- package/dist/{child-mcp-config-JQCVNB3Y.js → child-mcp-config-ONSFGNNH.js} +2 -2
- package/dist/{chunk-V2XWRKIJ.js → chunk-2WAF3ZFK.js} +8 -8
- package/dist/{chunk-A62DB47B.js → chunk-3P5H74AV.js} +8 -8
- package/dist/{chunk-JYMFL4M6.js → chunk-3YC6CEI5.js} +2 -2
- package/dist/{chunk-LMJ7BKIL.js → chunk-4XNZKWKQ.js} +2 -2
- package/dist/{chunk-5OTOOVOF.js → chunk-4YMUPCRS.js} +5 -5
- package/dist/{chunk-EPVPVG25.js → chunk-5LAPFTNG.js} +36 -36
- package/dist/{chunk-N3TMUOHG.js → chunk-6B7E372N.js} +3 -3
- package/dist/{chunk-6T3EPABN.js → chunk-7LP6VJRP.js} +6 -1
- package/dist/{chunk-6T3EPABN.js.map → chunk-7LP6VJRP.js.map} +1 -1
- package/dist/{chunk-2LQAHGNZ.js → chunk-C7CSLODO.js} +7 -7
- package/dist/{chunk-KQRF4ZHX.js → chunk-CFAN2FPY.js} +2 -2
- package/dist/{chunk-KUKQ7UHD.js → chunk-DLWCNFEX.js} +4 -4
- package/dist/{chunk-ETMIOP3R.js → chunk-GNB4GPLQ.js} +2 -2
- package/dist/{chunk-KJFX7JUP.js → chunk-HN7EDIAH.js} +6 -6
- package/dist/{chunk-R3QNEXOU.js → chunk-ICKUT5LH.js} +2 -2
- package/dist/{chunk-GWQE5MBQ.js → chunk-K7QRRVKW.js} +2 -2
- package/dist/{chunk-KUR6TV4G.js → chunk-KJN5RWXY.js} +68 -7
- package/dist/chunk-KJN5RWXY.js.map +1 -0
- package/dist/{chunk-CQK5SIEX.js → chunk-KY3U2XEW.js} +3 -3
- package/dist/{chunk-XVAXLGKZ.js → chunk-LB7DDJOG.js} +325 -125
- package/dist/chunk-LB7DDJOG.js.map +1 -0
- package/dist/{chunk-NBXYA5O6.js → chunk-LZ6WZJRH.js} +3 -3
- package/dist/{chunk-6ZU3FUAX.js → chunk-LZU4O6RT.js} +2 -2
- package/dist/{chunk-46V3G76B.js → chunk-P7FSB7X2.js} +4 -4
- package/dist/{chunk-PBVNGI67.js → chunk-Q2M77IPR.js} +2 -2
- package/dist/{chunk-D7WQNTAK.js → chunk-Q76C5PG7.js} +2 -2
- package/dist/{chunk-JEOQY42Z.js → chunk-QFI5WT2Y.js} +5 -5
- package/dist/{chunk-IJH2U2QL.js → chunk-RIIWLQYM.js} +2 -2
- package/dist/{chunk-QBU2RG7U.js → chunk-SLLW6DVZ.js} +2 -2
- package/dist/{chunk-I4EHDJTI.js → chunk-TCTKOFNL.js} +2 -2
- package/dist/{chunk-ZB7XPHFZ.js → chunk-UCIRVMOZ.js} +2 -2
- package/dist/{chunk-4U555SVX.js → chunk-UNDZPTSD.js} +16 -8
- package/dist/chunk-UNDZPTSD.js.map +1 -0
- package/dist/{chunk-DBGIP6GK.js → chunk-VLNPDWIW.js} +2 -2
- package/dist/{chunk-ZXLF3NDV.js → chunk-WGYETY6P.js} +2 -2
- package/dist/chunk-XFDT265H.js +7 -0
- package/dist/{chunk-R7V4C5UL.js → chunk-ZECI6UI2.js} +2 -2
- package/dist/{chunk-JXHRZRKU.js → chunk-ZTB4Z23O.js} +4 -4
- package/dist/{chunk-2T2MSN7B.js → chunk-ZUK5BG3Q.js} +2 -2
- package/dist/{cli-circuit-breaker-2LQZLFVP.js → cli-circuit-breaker-FOPLEQK6.js} +3 -3
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +90 -104
- package/dist/cli.js.map +1 -1
- package/dist/{composite-router-XNVULYDV.js → composite-router-OSASGOMV.js} +2 -2
- package/dist/{consensus-vote-2WLWZOVR.js → consensus-vote-QS72DIWI.js} +18 -18
- package/dist/{consensus-vote-types-Br1h5IMv.d.ts → consensus-vote-types-BlEp-vlK.d.ts} +5 -0
- package/dist/{context-retriever-GWAJG6XT.js → context-retriever-7VPUIRVT.js} +9 -9
- package/dist/{doctor-deep-ZATGXGNC.js → doctor-deep-ZBNAR3QG.js} +3 -3
- package/dist/{doctor-live-L264NFJO.js → doctor-live-VIHVWQGF.js} +9 -9
- package/dist/{expert-bridge-KCQ457YZ.js → expert-bridge-ESJHWQ2Z.js} +4 -4
- package/dist/{factory-S2SVFA6W.js → factory-HFHYJ4P6.js} +9 -9
- package/dist/{factory-FFKHIV6Q.js → factory-HUUB4OWA.js} +5 -5
- package/dist/{improvement-review-ASVQR6VY.js → improvement-review-JRUO6SOJ.js} +6 -6
- package/dist/index.d.ts +34 -14
- package/dist/index.js +33 -33
- package/dist/{init-opencode-CDW4DAWF.js → init-opencode-VZKXSO72.js} +6 -6
- package/dist/issue-triage-77QQQXYR.js +17 -0
- package/dist/{pr-reviewer-helpers-PMRGV7IL.js → pr-reviewer-helpers-BINKSJSV.js} +8 -4
- package/dist/{registry-command-4Y7RJH47.js → registry-command-GCO7IPDP.js} +2 -2
- package/dist/{repo-security-plan-XZ6YBLUE.js → repo-security-plan-QTGNCDI7.js} +3 -3
- package/dist/{research-helpers-synthesize-OKCOMCE2.js → research-helpers-synthesize-KYDHWP7C.js} +4 -4
- package/dist/{routing-memory-QUA5ORUA.js → routing-memory-VMCHRNSE.js} +2 -2
- package/dist/{session-memory-XKHKWRP3.js → session-memory-MX2G4K2A.js} +3 -3
- package/dist/{setup-config-NMVR2OBN.js → setup-config-QKYFUR3C.js} +3 -3
- package/dist/{setup-custom-api-VV3FT66F.js → setup-custom-api-5CDXK3RY.js} +4 -4
- package/dist/setup-data-dir-4AUIRLO4.js +29 -0
- package/dist/{tool-memory-MCIIYDQR.js → tool-memory-WUZ66O4K.js} +6 -6
- package/dist/{unified-registry-LPSJ2KMV.js → unified-registry-EZ3QUCIO.js} +10 -10
- package/dist/{weather-report-KHFJ756C.js → weather-report-MUUYKM7C.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-4U555SVX.js.map +0 -1
- package/dist/chunk-KUR6TV4G.js.map +0 -1
- package/dist/chunk-WIG2XETC.js +0 -7
- package/dist/chunk-XVAXLGKZ.js.map +0 -1
- package/dist/issue-triage-4RX3UV2B.js +0 -17
- package/dist/setup-data-dir-OYYLDXTP.js +0 -29
- /package/dist/{ast-rule-runner-AJAWZQNS.js.map → ast-rule-runner-27XDHRZH.js.map} +0 -0
- /package/dist/{child-mcp-config-JQCVNB3Y.js.map → child-mcp-config-ONSFGNNH.js.map} +0 -0
- /package/dist/{chunk-V2XWRKIJ.js.map → chunk-2WAF3ZFK.js.map} +0 -0
- /package/dist/{chunk-A62DB47B.js.map → chunk-3P5H74AV.js.map} +0 -0
- /package/dist/{chunk-JYMFL4M6.js.map → chunk-3YC6CEI5.js.map} +0 -0
- /package/dist/{chunk-LMJ7BKIL.js.map → chunk-4XNZKWKQ.js.map} +0 -0
- /package/dist/{chunk-5OTOOVOF.js.map → chunk-4YMUPCRS.js.map} +0 -0
- /package/dist/{chunk-EPVPVG25.js.map → chunk-5LAPFTNG.js.map} +0 -0
- /package/dist/{chunk-N3TMUOHG.js.map → chunk-6B7E372N.js.map} +0 -0
- /package/dist/{chunk-2LQAHGNZ.js.map → chunk-C7CSLODO.js.map} +0 -0
- /package/dist/{chunk-KQRF4ZHX.js.map → chunk-CFAN2FPY.js.map} +0 -0
- /package/dist/{chunk-KUKQ7UHD.js.map → chunk-DLWCNFEX.js.map} +0 -0
- /package/dist/{chunk-ETMIOP3R.js.map → chunk-GNB4GPLQ.js.map} +0 -0
- /package/dist/{chunk-KJFX7JUP.js.map → chunk-HN7EDIAH.js.map} +0 -0
- /package/dist/{chunk-R3QNEXOU.js.map → chunk-ICKUT5LH.js.map} +0 -0
- /package/dist/{chunk-GWQE5MBQ.js.map → chunk-K7QRRVKW.js.map} +0 -0
- /package/dist/{chunk-CQK5SIEX.js.map → chunk-KY3U2XEW.js.map} +0 -0
- /package/dist/{chunk-NBXYA5O6.js.map → chunk-LZ6WZJRH.js.map} +0 -0
- /package/dist/{chunk-6ZU3FUAX.js.map → chunk-LZU4O6RT.js.map} +0 -0
- /package/dist/{chunk-46V3G76B.js.map → chunk-P7FSB7X2.js.map} +0 -0
- /package/dist/{chunk-PBVNGI67.js.map → chunk-Q2M77IPR.js.map} +0 -0
- /package/dist/{chunk-D7WQNTAK.js.map → chunk-Q76C5PG7.js.map} +0 -0
- /package/dist/{chunk-JEOQY42Z.js.map → chunk-QFI5WT2Y.js.map} +0 -0
- /package/dist/{chunk-IJH2U2QL.js.map → chunk-RIIWLQYM.js.map} +0 -0
- /package/dist/{chunk-QBU2RG7U.js.map → chunk-SLLW6DVZ.js.map} +0 -0
- /package/dist/{chunk-I4EHDJTI.js.map → chunk-TCTKOFNL.js.map} +0 -0
- /package/dist/{chunk-ZB7XPHFZ.js.map → chunk-UCIRVMOZ.js.map} +0 -0
- /package/dist/{chunk-DBGIP6GK.js.map → chunk-VLNPDWIW.js.map} +0 -0
- /package/dist/{chunk-ZXLF3NDV.js.map → chunk-WGYETY6P.js.map} +0 -0
- /package/dist/{chunk-WIG2XETC.js.map → chunk-XFDT265H.js.map} +0 -0
- /package/dist/{chunk-R7V4C5UL.js.map → chunk-ZECI6UI2.js.map} +0 -0
- /package/dist/{chunk-JXHRZRKU.js.map → chunk-ZTB4Z23O.js.map} +0 -0
- /package/dist/{chunk-2T2MSN7B.js.map → chunk-ZUK5BG3Q.js.map} +0 -0
- /package/dist/{cli-circuit-breaker-2LQZLFVP.js.map → cli-circuit-breaker-FOPLEQK6.js.map} +0 -0
- /package/dist/{composite-router-XNVULYDV.js.map → composite-router-OSASGOMV.js.map} +0 -0
- /package/dist/{consensus-vote-2WLWZOVR.js.map → consensus-vote-QS72DIWI.js.map} +0 -0
- /package/dist/{context-retriever-GWAJG6XT.js.map → context-retriever-7VPUIRVT.js.map} +0 -0
- /package/dist/{doctor-deep-ZATGXGNC.js.map → doctor-deep-ZBNAR3QG.js.map} +0 -0
- /package/dist/{doctor-live-L264NFJO.js.map → doctor-live-VIHVWQGF.js.map} +0 -0
- /package/dist/{expert-bridge-KCQ457YZ.js.map → expert-bridge-ESJHWQ2Z.js.map} +0 -0
- /package/dist/{factory-FFKHIV6Q.js.map → factory-HFHYJ4P6.js.map} +0 -0
- /package/dist/{factory-S2SVFA6W.js.map → factory-HUUB4OWA.js.map} +0 -0
- /package/dist/{improvement-review-ASVQR6VY.js.map → improvement-review-JRUO6SOJ.js.map} +0 -0
- /package/dist/{init-opencode-CDW4DAWF.js.map → init-opencode-VZKXSO72.js.map} +0 -0
- /package/dist/{issue-triage-4RX3UV2B.js.map → issue-triage-77QQQXYR.js.map} +0 -0
- /package/dist/{pr-reviewer-helpers-PMRGV7IL.js.map → pr-reviewer-helpers-BINKSJSV.js.map} +0 -0
- /package/dist/{registry-command-4Y7RJH47.js.map → registry-command-GCO7IPDP.js.map} +0 -0
- /package/dist/{repo-security-plan-XZ6YBLUE.js.map → repo-security-plan-QTGNCDI7.js.map} +0 -0
- /package/dist/{research-helpers-synthesize-OKCOMCE2.js.map → research-helpers-synthesize-KYDHWP7C.js.map} +0 -0
- /package/dist/{routing-memory-QUA5ORUA.js.map → routing-memory-VMCHRNSE.js.map} +0 -0
- /package/dist/{session-memory-XKHKWRP3.js.map → session-memory-MX2G4K2A.js.map} +0 -0
- /package/dist/{setup-config-NMVR2OBN.js.map → setup-config-QKYFUR3C.js.map} +0 -0
- /package/dist/{setup-custom-api-VV3FT66F.js.map → setup-custom-api-5CDXK3RY.js.map} +0 -0
- /package/dist/{setup-data-dir-OYYLDXTP.js.map → setup-data-dir-4AUIRLO4.js.map} +0 -0
- /package/dist/{tool-memory-MCIIYDQR.js.map → tool-memory-WUZ66O4K.js.map} +0 -0
- /package/dist/{unified-registry-LPSJ2KMV.js.map → unified-registry-EZ3QUCIO.js.map} +0 -0
- /package/dist/{weather-report-KHFJ756C.js.map → weather-report-MUUYKM7C.js.map} +0 -0
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
GitHubProvider,
|
|
3
3
|
ScmError
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-GNB4GPLQ.js";
|
|
5
5
|
import {
|
|
6
6
|
resolveToken
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-3YC6CEI5.js";
|
|
8
8
|
import {
|
|
9
9
|
err,
|
|
10
10
|
ok
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-LZ6WZJRH.js";
|
|
12
12
|
|
|
13
13
|
// src/scm/factory.ts
|
|
14
14
|
async function createScmProvider(config) {
|
|
@@ -41,4 +41,4 @@ export {
|
|
|
41
41
|
createScmProvider,
|
|
42
42
|
createGitHubProvider
|
|
43
43
|
};
|
|
44
|
-
//# sourceMappingURL=chunk-
|
|
44
|
+
//# sourceMappingURL=chunk-DLWCNFEX.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
err,
|
|
5
5
|
getErrorMessage,
|
|
6
6
|
ok
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-LZ6WZJRH.js";
|
|
8
8
|
|
|
9
9
|
// src/scm/types.ts
|
|
10
10
|
var ScmError = class extends Error {
|
|
@@ -263,4 +263,4 @@ export {
|
|
|
263
263
|
ScmError,
|
|
264
264
|
GitHubProvider
|
|
265
265
|
};
|
|
266
|
-
//# sourceMappingURL=chunk-
|
|
266
|
+
//# sourceMappingURL=chunk-GNB4GPLQ.js.map
|
|
@@ -5,18 +5,18 @@ import {
|
|
|
5
5
|
loadTechniquesRegistry,
|
|
6
6
|
resolveInsideRoot,
|
|
7
7
|
savePapersRegistry
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-K7QRRVKW.js";
|
|
9
9
|
import {
|
|
10
10
|
resolveToken
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-3YC6CEI5.js";
|
|
12
12
|
import {
|
|
13
13
|
getToolMemory
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-4YMUPCRS.js";
|
|
15
15
|
import {
|
|
16
16
|
capitalizeWords,
|
|
17
17
|
tokenizeFiltered,
|
|
18
18
|
truncateSentence
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-7LP6VJRP.js";
|
|
20
20
|
import {
|
|
21
21
|
extractSystemPrompt,
|
|
22
22
|
generateCacheKey,
|
|
@@ -40,7 +40,7 @@ import {
|
|
|
40
40
|
ok,
|
|
41
41
|
registerPersistentDistillerFactory,
|
|
42
42
|
sigmoidConfidence
|
|
43
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-LZ6WZJRH.js";
|
|
44
44
|
import {
|
|
45
45
|
ensureLearningDir,
|
|
46
46
|
getRulesFile
|
|
@@ -4186,4 +4186,4 @@ export {
|
|
|
4186
4186
|
DEFAULT_CONTEXT_BUDGET_TOKENS,
|
|
4187
4187
|
getContextPromptPrefix
|
|
4188
4188
|
};
|
|
4189
|
-
//# sourceMappingURL=chunk-
|
|
4189
|
+
//# sourceMappingURL=chunk-HN7EDIAH.js.map
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
createGetRetryConfig,
|
|
12
12
|
createGetTimeout,
|
|
13
13
|
createGetToolRateLimit
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-LZ6WZJRH.js";
|
|
15
15
|
|
|
16
16
|
// src/config/defaults.ts
|
|
17
17
|
var CUSTOM_API_DEFAULT_MODEL = "gpt-5.5";
|
|
@@ -230,4 +230,4 @@ export {
|
|
|
230
230
|
CUSTOM_API_DEFAULT_MODEL,
|
|
231
231
|
DEFAULTS
|
|
232
232
|
};
|
|
233
|
-
//# sourceMappingURL=chunk-
|
|
233
|
+
//# sourceMappingURL=chunk-ICKUT5LH.js.map
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
getErrorMessage,
|
|
7
7
|
ok,
|
|
8
8
|
parseBoolEnv
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-LZ6WZJRH.js";
|
|
10
10
|
import {
|
|
11
11
|
findRepoRoot,
|
|
12
12
|
getActiveWorkspaceRoot,
|
|
@@ -223,4 +223,4 @@ export {
|
|
|
223
223
|
loadPapersRegistry,
|
|
224
224
|
savePapersRegistry
|
|
225
225
|
};
|
|
226
|
-
//# sourceMappingURL=chunk-
|
|
226
|
+
//# sourceMappingURL=chunk-K7QRRVKW.js.map
|
|
@@ -10,13 +10,13 @@ import {
|
|
|
10
10
|
import {
|
|
11
11
|
assessReputation,
|
|
12
12
|
sanitizeInput
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-ZUK5BG3Q.js";
|
|
14
14
|
import {
|
|
15
15
|
createLogger,
|
|
16
16
|
err,
|
|
17
17
|
getTimeProvider,
|
|
18
18
|
ok
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-LZ6WZJRH.js";
|
|
20
20
|
|
|
21
21
|
// src/dogfooding/pr-reviewer-helpers.ts
|
|
22
22
|
import { randomUUID } from "node:crypto";
|
|
@@ -107,6 +107,26 @@ function extractStringField(record, ...keys) {
|
|
|
107
107
|
}
|
|
108
108
|
return void 0;
|
|
109
109
|
}
|
|
110
|
+
function formatDiffs(pr) {
|
|
111
|
+
const maxDiffLength = 2e3;
|
|
112
|
+
let totalLength = 0;
|
|
113
|
+
const diffs = [];
|
|
114
|
+
for (const file of pr.files) {
|
|
115
|
+
if (file.patch === void 0) continue;
|
|
116
|
+
const diff = `\`\`\`diff
|
|
117
|
+
# ${file.filename}
|
|
118
|
+
${file.patch}
|
|
119
|
+
\`\`\``;
|
|
120
|
+
if (totalLength + diff.length > maxDiffLength * pr.files.length) {
|
|
121
|
+
diffs.push(`# ${file.filename}
|
|
122
|
+
(diff truncated)`);
|
|
123
|
+
} else {
|
|
124
|
+
diffs.push(diff);
|
|
125
|
+
totalLength += diff.length;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return diffs.join("\n\n");
|
|
129
|
+
}
|
|
110
130
|
function parseFindings(output, expertId, minSeverity) {
|
|
111
131
|
const minOrder = SEVERITY_ORDER[minSeverity];
|
|
112
132
|
const sources = collectSources(output);
|
|
@@ -118,6 +138,10 @@ function parseFindings(output, expertId, minSeverity) {
|
|
|
118
138
|
if (finding !== null) findings.push(finding);
|
|
119
139
|
}
|
|
120
140
|
}
|
|
141
|
+
for (const warning of parseWarnings(output.warnings)) {
|
|
142
|
+
const finding = parseWarningFinding(warning, expertId, minOrder);
|
|
143
|
+
if (finding !== null) findings.push(finding);
|
|
144
|
+
}
|
|
121
145
|
return findings;
|
|
122
146
|
}
|
|
123
147
|
function collectSources(output) {
|
|
@@ -146,19 +170,54 @@ function parseOneFinding(item, expertId, minOrder) {
|
|
|
146
170
|
confidence: typeof record.confidence === "number" ? record.confidence : 0.7
|
|
147
171
|
};
|
|
148
172
|
}
|
|
149
|
-
function
|
|
173
|
+
function parseWarnings(value) {
|
|
174
|
+
if (!Array.isArray(value)) return [];
|
|
175
|
+
return value.filter((warning) => typeof warning === "string");
|
|
176
|
+
}
|
|
177
|
+
function parseWarningFinding(warning, expertId, minOrder) {
|
|
178
|
+
const severity = parseSeverity(
|
|
179
|
+
warning.match(/\b(critical|high|medium|low|info)-?severity\b/i)?.[1]
|
|
180
|
+
);
|
|
181
|
+
return parseOneFinding(
|
|
182
|
+
{
|
|
183
|
+
title: "Expert warning",
|
|
184
|
+
description: warning,
|
|
185
|
+
severity,
|
|
186
|
+
category: parseCategory(expertId.replace(/-expert$/, ""))
|
|
187
|
+
},
|
|
188
|
+
expertId,
|
|
189
|
+
minOrder
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
function parseVerdictMarker(value) {
|
|
193
|
+
if (typeof value !== "string") return void 0;
|
|
194
|
+
const normalized = value.toUpperCase().replaceAll("-", "_").replaceAll(" ", "_");
|
|
195
|
+
if (/\b(?:CHANGES_REQUESTED|REQUEST_CHANGES)\b/.test(normalized)) return "changes_requested";
|
|
196
|
+
if (/\b(?:APPROVED|APPROVE)\b/.test(normalized)) return "approved";
|
|
197
|
+
return void 0;
|
|
198
|
+
}
|
|
199
|
+
function parseExpertReview(output, expertId, minSeverity) {
|
|
200
|
+
const findings = parseFindings(output, expertId, minSeverity);
|
|
201
|
+
const verdict = parseVerdictMarker(output.verdict) ?? parseVerdictMarker(output.content);
|
|
202
|
+
if (verdict !== void 0) return { findings, verdict };
|
|
203
|
+
const hasFindingShape = collectSources(output).some((source) => Array.isArray(source));
|
|
204
|
+
const hasWarningShape = parseWarnings(output.warnings).length > 0;
|
|
205
|
+
return { findings, verdict: hasFindingShape || hasWarningShape ? "findings" : "errored" };
|
|
206
|
+
}
|
|
207
|
+
function determineApproval(findings, verdict = "findings") {
|
|
208
|
+
if (verdict === "errored" || verdict === "changes_requested") return false;
|
|
150
209
|
const hasBlocking = findings.some((f) => f.severity === "critical" || f.severity === "high");
|
|
151
210
|
return !hasBlocking;
|
|
152
211
|
}
|
|
153
212
|
function determineDecision(reviews, findings) {
|
|
154
|
-
const
|
|
213
|
+
const completedReviews = reviews.filter((r) => r.errored !== true);
|
|
155
214
|
const hasCritical = findings.some((f) => f.severity === "critical");
|
|
156
215
|
const hasHigh = findings.some((f) => f.severity === "high");
|
|
157
|
-
const allApproved = allOf(
|
|
216
|
+
const allApproved = allOf(reviews, (r) => r.errored !== true && r.approved, false);
|
|
158
217
|
if (hasCritical) return "request_changes";
|
|
159
218
|
if (hasHigh && !allApproved) return "request_changes";
|
|
160
219
|
if (findings.length > 0) return "comment";
|
|
161
|
-
if (
|
|
220
|
+
if (completedReviews.length === 0 || !allApproved) return "comment";
|
|
162
221
|
return "approve";
|
|
163
222
|
}
|
|
164
223
|
function calculateConsensus(reviews) {
|
|
@@ -293,7 +352,9 @@ export {
|
|
|
293
352
|
parseCategory,
|
|
294
353
|
extractSummary,
|
|
295
354
|
extractStringField,
|
|
355
|
+
formatDiffs,
|
|
296
356
|
parseFindings,
|
|
357
|
+
parseExpertReview,
|
|
297
358
|
determineApproval,
|
|
298
359
|
determineDecision,
|
|
299
360
|
calculateConsensus,
|
|
@@ -305,4 +366,4 @@ export {
|
|
|
305
366
|
createFailedReview,
|
|
306
367
|
reviewPostingBlock
|
|
307
368
|
};
|
|
308
|
-
//# sourceMappingURL=chunk-
|
|
369
|
+
//# sourceMappingURL=chunk-KJN5RWXY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dogfooding/pr-reviewer-helpers.ts"],"sourcesContent":["/**\n * nexus-agents/dogfooding - PR Reviewer Helpers\n *\n * Helper functions for PR review formatting and aggregation.\n *\n * @module dogfooding/pr-reviewer-helpers\n * (Source: Issue #161, Alignment Roadmap Phase 3)\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type { Result } from '../core/index.js';\nimport { getTimeProvider, createLogger, ok, err } from '../core/index.js';\nimport type { ScmUserMetadata } from '../scm/types.js';\nimport type {\n PRMetadata,\n PRReviewDraft,\n PRTrustAssessment,\n ExpertReviewResult,\n ReviewFinding,\n ReviewCategory,\n ReviewSeverity,\n ReviewDecision,\n} from './pr-review-types.js';\nimport {\n SEVERITY_ORDER,\n CATEGORY_DISPLAY_NAMES,\n SEVERITY_EMOJI,\n DECISION_EMOJI,\n} from './pr-review-types.js';\nimport { sanitizeInput } from '../security/input-sanitizer.js';\nimport { allOf } from '../utils/verdict-aggregation.js';\nimport { assessReputation } from '../security/reputation-model.js';\nimport type {\n ReputationCache,\n ReputationGateDecision,\n ReputationAssessment,\n GitHubUserMetadata,\n} from '../security/reputation-model.js';\nimport type { FirewallResult } from '../security/firewall/firewall-pipeline.js';\n\nconst repLogger = createLogger({ component: 'PRReviewer.reputation' });\n\n// =============================================================================\n// Reputation Gating Helpers (#3123, epic #3118 Phase 5)\n// =============================================================================\n\n/**\n * Best-effort account-age lookup for a PR author (#3133, Phase-3 equivalent for\n * the PR path). Returns the author's real account age in days via the provider's\n * `fetchUserMetadata`, or `undefined` on any failure (err Result, unparseable\n * `createdAt`, or an unexpected rejection) — never fabricated, never throws, so\n * the review is never blocked by this lookup.\n */\nexport async function fetchAccountAgeDays(\n provider: { fetchUserMetadata: (u: string) => Promise<Result<ScmUserMetadata, Error>> },\n username: string\n): Promise<number | undefined> {\n try {\n const result = await provider.fetchUserMetadata(username);\n if (!result.ok) return undefined;\n const createdMs = Date.parse(result.value.createdAt);\n if (!Number.isFinite(createdMs)) return undefined;\n return Math.floor((getTimeProvider().now() - createdMs) / 86_400_000);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Assesses the PR author's reputation from the signals available in the PR\n * event: author association + injection flags from the (sanitized) PR body, plus\n * the author's real account age when it was fetched (#3133). `accountAgeDays` is\n * OMITTED when the lookup failed — never fabricated, so the engine skips the\n * `new_account` signal. Returns undefined when reputation is disabled.\n */\nexport function assessPRReputation(\n pr: PRMetadata,\n cache: ReputationCache,\n enableReputation: boolean,\n accountAgeDays: number | undefined\n): ReputationAssessment | undefined {\n if (!enableReputation) return undefined;\n // Only `injectionFlags` is consumed here, and injection detection is\n // role-independent — the userRole arg ('unknown') and the sanitizer's own\n // trustTier output are intentionally irrelevant to this call.\n const sanitizeResult = sanitizeInput(pr.body, 'unknown', pr.author);\n const metadata: GitHubUserMetadata = {\n username: pr.author,\n ...(accountAgeDays !== undefined ? { accountAgeDays } : {}),\n authorAssociation: pr.authorAssociation,\n injectionFlags: sanitizeResult.injectionFlags,\n };\n return assessReputation(metadata, cache);\n}\n\n/** Builds the observability assessment surfaced on the review result (#3123). */\nexport function buildPRTrustAssessment(\n firewall: Pick<FirewallResult, 'trust' | 'isAllowlisted' | 'auditSink'>,\n reputation: ReputationAssessment | undefined,\n gateDecision: ReputationGateDecision\n): PRTrustAssessment {\n const trustResult = firewall.trust;\n // Tier-1 (owner/allowlisted) authors cannot be suspicious.\n const isTier1 = trustResult.trustTier === '1';\n return {\n trustTier: trustResult.trustTier,\n userRole: trustResult.userRole,\n // Measured or absent (#4992): never the classifier's default `false`.\n ...(firewall.isAllowlisted !== undefined ? { isAllowlisted: firewall.isAllowlisted } : {}),\n auditSink: firewall.auditSink,\n reputationScore: reputation?.reputationScore,\n suspiciousSignals: isTier1 ? [] : (reputation?.suspiciousSignals ?? []),\n isSuspicious: isTier1 ? false : (reputation?.isSuspicious ?? false),\n enforcedTrustTier: gateDecision.enforcedTier,\n reputationReconciledTier: gateDecision.reconciledTier,\n gatingMode: gateDecision.mode,\n };\n}\n\n/**\n * Reads the reputation gate decision the firewall computed for this PR (#3123\n * gating; #4992 review: ONE gate, shared with the firewall's Rule-of-Two\n * signal) and builds the assessment surfaced on the result. A suppressed\n * demotion (audit/off) is logged. Fails closed when the firewall returned no\n * gate — structurally unreachable, since the caller always supplies the\n * reputation option, but the classifier tier must never stand in for it.\n */\nexport function gatePRAuthor(\n pr: PRMetadata,\n firewall: Pick<FirewallResult, 'trust' | 'isAllowlisted' | 'auditSink' | 'reputationGate'>,\n reputation: ReputationAssessment | undefined\n): Result<{ gateDecision: ReputationGateDecision; trustAssessment: PRTrustAssessment }, Error> {\n const trustResult = firewall.trust;\n const gateDecision = firewall.reputationGate;\n if (gateDecision === undefined) {\n return err(new Error('Untrusted-input firewall returned no reputation gate decision'));\n }\n if (gateDecision.demotionSuppressed) {\n repLogger.warn('Reputation demotion suppressed by gating mode (would block under enforce)', {\n prNumber: pr.number,\n author: pr.author,\n mode: gateDecision.mode,\n classifierTier: trustResult.trustTier,\n reconciledTier: gateDecision.reconciledTier,\n });\n }\n return ok({\n gateDecision,\n trustAssessment: buildPRTrustAssessment(firewall, reputation, gateDecision),\n });\n}\n\n// =============================================================================\n// Parsing Helpers\n// =============================================================================\n\nexport function parseSeverity(value: unknown): ReviewSeverity {\n if (typeof value === 'string') {\n const lower = value.toLowerCase();\n if (lower in SEVERITY_ORDER) return lower as ReviewSeverity;\n }\n return 'medium';\n}\n\nexport function parseCategory(value: unknown): ReviewCategory {\n if (typeof value === 'string') {\n const lower = value.toLowerCase();\n if (lower in CATEGORY_DISPLAY_NAMES) return lower as ReviewCategory;\n }\n return 'code_quality';\n}\n\nexport function extractSummary(output: Record<string, unknown>): string {\n if (typeof output.summary === 'string') return output.summary;\n if (typeof output.content === 'string') return output.content;\n if (typeof output.message === 'string') return output.message;\n return 'Review completed';\n}\n\nexport function extractStringField(\n record: Record<string, unknown>,\n ...keys: string[]\n): string | undefined {\n for (const key of keys) {\n const value = record[key];\n if (typeof value === 'string') return value;\n }\n return undefined;\n}\n\nexport function formatDiffs(pr: PRMetadata): string {\n const maxDiffLength = 2000;\n let totalLength = 0;\n const diffs: string[] = [];\n for (const file of pr.files) {\n if (file.patch === undefined) continue;\n const diff = `\\`\\`\\`diff\\n# ${file.filename}\\n${file.patch}\\n\\`\\`\\``;\n if (totalLength + diff.length > maxDiffLength * pr.files.length) {\n diffs.push(`# ${file.filename}\\n(diff truncated)`);\n } else {\n diffs.push(diff);\n totalLength += diff.length;\n }\n }\n return diffs.join('\\n\\n');\n}\n\n// =============================================================================\n// Finding Parsing\n// =============================================================================\n\nexport function parseFindings(\n output: Record<string, unknown>,\n expertId: string,\n minSeverity: ReviewSeverity\n): ReviewFinding[] {\n const minOrder = SEVERITY_ORDER[minSeverity];\n const sources = collectSources(output);\n\n const findings: ReviewFinding[] = [];\n for (const source of sources) {\n if (!Array.isArray(source)) continue;\n for (const item of source) {\n const finding = parseOneFinding(item, expertId, minOrder);\n if (finding !== null) findings.push(finding);\n }\n }\n for (const warning of parseWarnings(output.warnings)) {\n const finding = parseWarningFinding(warning, expertId, minOrder);\n if (finding !== null) findings.push(finding);\n }\n return findings;\n}\n\nfunction collectSources(output: Record<string, unknown>): unknown[] {\n return [\n output.findings,\n output.vulnerabilities,\n output.issues,\n (output as { content?: { findings?: unknown } }).content,\n ];\n}\n\nfunction parseOneFinding(item: unknown, expertId: string, minOrder: number): ReviewFinding | null {\n if (typeof item !== 'object' || item === null) return null;\n\n const record = item as Record<string, unknown>;\n const severity = parseSeverity(record.severity);\n if (SEVERITY_ORDER[severity] < minOrder) return null;\n\n return {\n id: randomUUID(),\n category: parseCategory(record.category),\n severity,\n title: extractStringField(record, 'title', 'name') ?? 'Finding',\n description: extractStringField(record, 'description', 'message') ?? '',\n file: typeof record.file === 'string' ? record.file : undefined,\n line: typeof record.line === 'number' ? record.line : undefined,\n suggestion: typeof record.suggestion === 'string' ? record.suggestion : undefined,\n expertId,\n confidence: typeof record.confidence === 'number' ? record.confidence : 0.7,\n };\n}\n\nfunction parseWarnings(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((warning): warning is string => typeof warning === 'string');\n}\n\nfunction parseWarningFinding(\n warning: string,\n expertId: string,\n minOrder: number\n): ReviewFinding | null {\n const severity = parseSeverity(\n warning.match(/\\b(critical|high|medium|low|info)-?severity\\b/i)?.[1]\n );\n return parseOneFinding(\n {\n title: 'Expert warning',\n description: warning,\n severity,\n category: parseCategory(expertId.replace(/-expert$/, '')),\n },\n expertId,\n minOrder\n );\n}\n\ntype ExpertVerdict = 'approved' | 'changes_requested' | 'findings' | 'errored';\n\ninterface ParsedExpertReview {\n readonly findings: ReviewFinding[];\n readonly verdict: ExpertVerdict;\n}\n\nfunction parseVerdictMarker(\n value: unknown\n): Exclude<ExpertVerdict, 'findings' | 'errored'> | undefined {\n if (typeof value !== 'string') return undefined;\n const normalized = value.toUpperCase().replaceAll('-', '_').replaceAll(' ', '_');\n if (/\\b(?:CHANGES_REQUESTED|REQUEST_CHANGES)\\b/.test(normalized)) return 'changes_requested';\n if (/\\b(?:APPROVED|APPROVE)\\b/.test(normalized)) return 'approved';\n return undefined;\n}\n\n/** Parses one expert output into a single, validated review verdict. */\nexport function parseExpertReview(\n output: Record<string, unknown>,\n expertId: string,\n minSeverity: ReviewSeverity\n): ParsedExpertReview {\n const findings = parseFindings(output, expertId, minSeverity);\n const verdict = parseVerdictMarker(output.verdict) ?? parseVerdictMarker(output.content);\n if (verdict !== undefined) return { findings, verdict };\n const hasFindingShape = collectSources(output).some((source) => Array.isArray(source));\n const hasWarningShape = parseWarnings(output.warnings).length > 0;\n return { findings, verdict: hasFindingShape || hasWarningShape ? 'findings' : 'errored' };\n}\n\n// =============================================================================\n// Decision Helpers\n// =============================================================================\n\nexport function determineApproval(\n findings: ReviewFinding[],\n verdict: ExpertVerdict = 'findings'\n): boolean {\n if (verdict === 'errored' || verdict === 'changes_requested') return false;\n const hasBlocking = findings.some((f) => f.severity === 'critical' || f.severity === 'high');\n return !hasBlocking;\n}\n\nexport function determineDecision(\n reviews: ExpertReviewResult[],\n findings: ReviewFinding[]\n): ReviewDecision {\n // #5012: an expert that errored produced no verdict, so it can neither\n // approve nor object. `allOf(reviews, …, false)` already refuses to call\n // ZERO reviews unanimous approval (#4581); feeding it synthetic approvals\n // for failed experts defeated that guard by making the list non-empty.\n const completedReviews = reviews.filter((r) => r.errored !== true);\n const hasCritical = findings.some((f) => f.severity === 'critical');\n const hasHigh = findings.some((f) => f.severity === 'high');\n // Zero expert reviews is not unanimous approval (#4581): with `true` here the\n // `hasHigh && !allApproved` branch could never fire on an unreviewed PR, so a\n // HIGH finding silently downgraded from request_changes to comment.\n const allApproved = allOf(reviews, (r) => r.errored !== true && r.approved, false);\n\n if (hasCritical) return 'request_changes';\n if (hasHigh && !allApproved) return 'request_changes';\n if (findings.length > 0) return 'comment';\n // Nothing read the diff, so there is nothing to approve. `comment` posts the\n // failure summaries without asserting the change is fine.\n if (completedReviews.length === 0 || !allApproved) return 'comment';\n return 'approve';\n}\n\nexport function calculateConsensus(reviews: ExpertReviewResult[]): number {\n if (reviews.length === 0) return 1;\n const approvals = reviews.filter((r) => r.approved).length;\n return approvals / reviews.length;\n}\n\n// =============================================================================\n// Counting Helpers\n// =============================================================================\n\nexport function countBySeverity(findings: ReviewFinding[]): Record<ReviewSeverity, number> {\n const counts: Record<ReviewSeverity, number> = {\n critical: 0,\n high: 0,\n medium: 0,\n low: 0,\n info: 0,\n };\n\n for (const f of findings) {\n counts[f.severity]++;\n }\n\n return counts;\n}\n\nexport function countByCategory(findings: ReviewFinding[]): Record<ReviewCategory, number> {\n const counts: Record<ReviewCategory, number> = {\n security: 0,\n performance: 0,\n code_quality: 0,\n testing: 0,\n documentation: 0,\n architecture: 0,\n };\n\n for (const f of findings) {\n counts[f.category]++;\n }\n\n return counts;\n}\n\nexport function sumFindings(counts: Record<ReviewSeverity, number>): number {\n return Object.values(counts).reduce((a, b) => a + b, 0);\n}\n\n// =============================================================================\n// Summary Generation\n// =============================================================================\n\nexport function generateSummary(\n pr: PRMetadata,\n reviews: ExpertReviewResult[],\n decision: ReviewDecision\n): string {\n const expertSummaries = reviews\n .map((r) => `- **${CATEGORY_DISPLAY_NAMES[r.expertType as ReviewCategory]}**: ${r.summary}`)\n .join('\\n');\n\n return `Reviewed PR #${String(pr.number)}: ${pr.title}\n\n**Decision:** ${decision.replaceAll('_', ' ')}\n**Experts consulted:** ${String(reviews.length)}\n\n${expertSummaries}`;\n}\n\n// =============================================================================\n// GitHub Comment Formatting\n// =============================================================================\n\n/**\n * Formats the review result as a GitHub comment.\n */\nexport function formatReviewComment(result: PRReviewDraft): string {\n const emoji = DECISION_EMOJI[result.decision];\n const decisionText = result.decision.replaceAll('_', ' ').toUpperCase();\n\n const findingsSection = formatFindingsSection(result);\n const statsSection = formatStatsSection(result);\n\n return `## ${emoji} Nexus Agents Review: ${decisionText}\n\n${result.summary}\n\n${findingsSection}\n\n${statsSection}\n\n---\n*Reviewed by [nexus-agents](https://github.com/nexus-substrate/nexus-agents) in ${String(result.totalDurationMs)}ms*`;\n}\n\nfunction formatFindingsSection(result: PRReviewDraft): string {\n const allFindings = result.expertReviews.flatMap((r) => r.findings);\n\n if (allFindings.length === 0) {\n return '_No issues found._';\n }\n\n const sorted = [...allFindings].sort(\n (a, b) => SEVERITY_ORDER[b.severity] - SEVERITY_ORDER[a.severity]\n );\n\n const lines = ['### Findings', ''];\n\n for (const f of sorted) {\n const emoji = SEVERITY_EMOJI[f.severity];\n const loc =\n f.file !== undefined\n ? ` (\\`${f.file}${f.line !== undefined ? `:${String(f.line)}` : ''}\\`)`\n : '';\n lines.push(`${emoji} **${f.title}**${loc}`);\n lines.push(`> ${f.description}`);\n if (f.suggestion !== undefined) {\n lines.push(`> 💡 ${f.suggestion}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nfunction formatStatsSection(result: PRReviewDraft): string {\n const { findingsBySeverity } = result;\n const total = sumFindings(findingsBySeverity);\n\n const parts: string[] = [];\n for (const severity of ['critical', 'high', 'medium', 'low', 'info'] as ReviewSeverity[]) {\n const count = findingsBySeverity[severity];\n if (count > 0) {\n parts.push(`${SEVERITY_EMOJI[severity]} ${String(count)} ${severity}`);\n }\n }\n\n return `<details>\n<summary>Review Statistics (${String(total)} findings)</summary>\n\n- Experts: ${String(result.expertCount)}\n- Consensus: ${(result.consensusScore * 100).toFixed(0)}%\n- Duration: ${String(result.totalDurationMs)}ms\n- Findings: ${parts.join(', ') || 'none'}\n\n</details>`;\n}\n\n// =============================================================================\n// Failed Review Factory\n// =============================================================================\n\nexport function createFailedReview(\n expertId: string,\n category: ReviewCategory,\n durationMs: number,\n error: string\n): ExpertReviewResult {\n return {\n expertId,\n expertType: category,\n // #5012: NOT `approved: true`. \"Don't block on failures\" made an expert\n // that never ran indistinguishable from one that read the diff and had no\n // objection, and `determineDecision` turned three of those into an APPROVE\n // posted to GitHub.\n approved: false,\n errored: true,\n summary: `Review failed: ${error}`,\n findings: [],\n durationMs,\n confidence: 0,\n };\n}\n\n/** The policy gate's verdict on posting a review, as the caller needs it. */\nexport interface ReviewPostingVerdict {\n readonly allowed: boolean;\n readonly hasRuleOfTwoViolation: boolean;\n readonly violations: readonly { rule: string; message?: string }[];\n}\n\n/**\n * Decide whether review posting is blocked, and how to describe it.\n *\n * Consumes the gate's own `allowed` rather than re-deriving a narrower\n * condition. The caller previously blocked on `hasRuleOfTwoViolation` alone\n * while `evaluatePolicy` had already computed `allowed`.\n *\n * For the action `auditReviewAction` builds, the two are currently EQUIVALENT:\n * tiers 1-2 yield no violations, tiers 3-4 yield INSUFFICIENT_TRUST +\n * UNTRUSTED_INFLUENCE + RULE_OF_TWO together. So this changes no behaviour\n * today. It makes the equivalence guaranteed rather than accidental — it holds\n * only because that context hardcodes `hasWriteAccess` and `hasSecretAccess`\n * to true, which is what makes `checkRuleOfTwo` fire at tier 3+. Make either\n * conditional and RULE_OF_TWO stops firing while the other two blocking rules\n * still do, and a review would post against `allowed: false`.\n *\n * Returns `undefined` when posting may proceed. Rule of Two keeps its own\n * label: it is the distinctive condition (untrusted input + write access +\n * secrets at once) and reads very differently from a trust-tier block.\n */\nexport function reviewPostingBlock(\n verdict: ReviewPostingVerdict\n): { label: string; reason: string } | undefined {\n if (verdict.allowed) return undefined;\n const label = verdict.hasRuleOfTwoViolation ? 'Rule of Two' : 'Policy gate';\n return { label, reason: `${label}: ${verdict.violations.map((v) => v.rule).join(', ')}` };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AASA,SAAS,kBAAkB;AA+B3B,IAAM,YAAY,aAAa,EAAE,WAAW,wBAAwB,CAAC;AAarE,eAAsB,oBACpB,UACA,UAC6B;AAC7B,MAAI;AACF,UAAM,SAAS,MAAM,SAAS,kBAAkB,QAAQ;AACxD,QAAI,CAAC,OAAO,GAAI,QAAO;AACvB,UAAM,YAAY,KAAK,MAAM,OAAO,MAAM,SAAS;AACnD,QAAI,CAAC,OAAO,SAAS,SAAS,EAAG,QAAO;AACxC,WAAO,KAAK,OAAO,gBAAgB,EAAE,IAAI,IAAI,aAAa,KAAU;AAAA,EACtE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AASO,SAAS,mBACd,IACA,OACA,kBACA,gBACkC;AAClC,MAAI,CAAC,iBAAkB,QAAO;AAI9B,QAAM,iBAAiB,cAAc,GAAG,MAAM,WAAW,GAAG,MAAM;AAClE,QAAM,WAA+B;AAAA,IACnC,UAAU,GAAG;AAAA,IACb,GAAI,mBAAmB,SAAY,EAAE,eAAe,IAAI,CAAC;AAAA,IACzD,mBAAmB,GAAG;AAAA,IACtB,gBAAgB,eAAe;AAAA,EACjC;AACA,SAAO,iBAAiB,UAAU,KAAK;AACzC;AAGO,SAAS,uBACd,UACA,YACA,cACmB;AACnB,QAAM,cAAc,SAAS;AAE7B,QAAM,UAAU,YAAY,cAAc;AAC1C,SAAO;AAAA,IACL,WAAW,YAAY;AAAA,IACvB,UAAU,YAAY;AAAA;AAAA,IAEtB,GAAI,SAAS,kBAAkB,SAAY,EAAE,eAAe,SAAS,cAAc,IAAI,CAAC;AAAA,IACxF,WAAW,SAAS;AAAA,IACpB,iBAAiB,YAAY;AAAA,IAC7B,mBAAmB,UAAU,CAAC,IAAK,YAAY,qBAAqB,CAAC;AAAA,IACrE,cAAc,UAAU,QAAS,YAAY,gBAAgB;AAAA,IAC7D,mBAAmB,aAAa;AAAA,IAChC,0BAA0B,aAAa;AAAA,IACvC,YAAY,aAAa;AAAA,EAC3B;AACF;AAUO,SAAS,aACd,IACA,UACA,YAC6F;AAC7F,QAAM,cAAc,SAAS;AAC7B,QAAM,eAAe,SAAS;AAC9B,MAAI,iBAAiB,QAAW;AAC9B,WAAO,IAAI,IAAI,MAAM,+DAA+D,CAAC;AAAA,EACvF;AACA,MAAI,aAAa,oBAAoB;AACnC,cAAU,KAAK,6EAA6E;AAAA,MAC1F,UAAU,GAAG;AAAA,MACb,QAAQ,GAAG;AAAA,MACX,MAAM,aAAa;AAAA,MACnB,gBAAgB,YAAY;AAAA,MAC5B,gBAAgB,aAAa;AAAA,IAC/B,CAAC;AAAA,EACH;AACA,SAAO,GAAG;AAAA,IACR;AAAA,IACA,iBAAiB,uBAAuB,UAAU,YAAY,YAAY;AAAA,EAC5E,CAAC;AACH;AAMO,SAAS,cAAc,OAAgC;AAC5D,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,QAAQ,MAAM,YAAY;AAChC,QAAI,SAAS,eAAgB,QAAO;AAAA,EACtC;AACA,SAAO;AACT;AAEO,SAAS,cAAc,OAAgC;AAC5D,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,QAAQ,MAAM,YAAY;AAChC,QAAI,SAAS,uBAAwB,QAAO;AAAA,EAC9C;AACA,SAAO;AACT;AAEO,SAAS,eAAe,QAAyC;AACtE,MAAI,OAAO,OAAO,YAAY,SAAU,QAAO,OAAO;AACtD,MAAI,OAAO,OAAO,YAAY,SAAU,QAAO,OAAO;AACtD,MAAI,OAAO,OAAO,YAAY,SAAU,QAAO,OAAO;AACtD,SAAO;AACT;AAEO,SAAS,mBACd,WACG,MACiB;AACpB,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,OAAO,UAAU,SAAU,QAAO;AAAA,EACxC;AACA,SAAO;AACT;AAEO,SAAS,YAAY,IAAwB;AAClD,QAAM,gBAAgB;AACtB,MAAI,cAAc;AAClB,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,GAAG,OAAO;AAC3B,QAAI,KAAK,UAAU,OAAW;AAC9B,UAAM,OAAO;AAAA,IAAiB,KAAK,QAAQ;AAAA,EAAK,KAAK,KAAK;AAAA;AAC1D,QAAI,cAAc,KAAK,SAAS,gBAAgB,GAAG,MAAM,QAAQ;AAC/D,YAAM,KAAK,KAAK,KAAK,QAAQ;AAAA,iBAAoB;AAAA,IACnD,OAAO;AACL,YAAM,KAAK,IAAI;AACf,qBAAe,KAAK;AAAA,IACtB;AAAA,EACF;AACA,SAAO,MAAM,KAAK,MAAM;AAC1B;AAMO,SAAS,cACd,QACA,UACA,aACiB;AACjB,QAAM,WAAW,eAAe,WAAW;AAC3C,QAAM,UAAU,eAAe,MAAM;AAErC,QAAM,WAA4B,CAAC;AACnC,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,MAAM,QAAQ,MAAM,EAAG;AAC5B,eAAW,QAAQ,QAAQ;AACzB,YAAM,UAAU,gBAAgB,MAAM,UAAU,QAAQ;AACxD,UAAI,YAAY,KAAM,UAAS,KAAK,OAAO;AAAA,IAC7C;AAAA,EACF;AACA,aAAW,WAAW,cAAc,OAAO,QAAQ,GAAG;AACpD,UAAM,UAAU,oBAAoB,SAAS,UAAU,QAAQ;AAC/D,QAAI,YAAY,KAAM,UAAS,KAAK,OAAO;AAAA,EAC7C;AACA,SAAO;AACT;AAEA,SAAS,eAAe,QAA4C;AAClE,SAAO;AAAA,IACL,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACN,OAAgD;AAAA,EACnD;AACF;AAEA,SAAS,gBAAgB,MAAe,UAAkB,UAAwC;AAChG,MAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AAEtD,QAAM,SAAS;AACf,QAAM,WAAW,cAAc,OAAO,QAAQ;AAC9C,MAAI,eAAe,QAAQ,IAAI,SAAU,QAAO;AAEhD,SAAO;AAAA,IACL,IAAI,WAAW;AAAA,IACf,UAAU,cAAc,OAAO,QAAQ;AAAA,IACvC;AAAA,IACA,OAAO,mBAAmB,QAAQ,SAAS,MAAM,KAAK;AAAA,IACtD,aAAa,mBAAmB,QAAQ,eAAe,SAAS,KAAK;AAAA,IACrE,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,IACtD,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,IACtD,YAAY,OAAO,OAAO,eAAe,WAAW,OAAO,aAAa;AAAA,IACxE;AAAA,IACA,YAAY,OAAO,OAAO,eAAe,WAAW,OAAO,aAAa;AAAA,EAC1E;AACF;AAEA,SAAS,cAAc,OAA0B;AAC/C,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,SAAO,MAAM,OAAO,CAAC,YAA+B,OAAO,YAAY,QAAQ;AACjF;AAEA,SAAS,oBACP,SACA,UACA,UACsB;AACtB,QAAM,WAAW;AAAA,IACf,QAAQ,MAAM,gDAAgD,IAAI,CAAC;AAAA,EACrE;AACA,SAAO;AAAA,IACL;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb;AAAA,MACA,UAAU,cAAc,SAAS,QAAQ,YAAY,EAAE,CAAC;AAAA,IAC1D;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AASA,SAAS,mBACP,OAC4D;AAC5D,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,aAAa,MAAM,YAAY,EAAE,WAAW,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG;AAC/E,MAAI,4CAA4C,KAAK,UAAU,EAAG,QAAO;AACzE,MAAI,2BAA2B,KAAK,UAAU,EAAG,QAAO;AACxD,SAAO;AACT;AAGO,SAAS,kBACd,QACA,UACA,aACoB;AACpB,QAAM,WAAW,cAAc,QAAQ,UAAU,WAAW;AAC5D,QAAM,UAAU,mBAAmB,OAAO,OAAO,KAAK,mBAAmB,OAAO,OAAO;AACvF,MAAI,YAAY,OAAW,QAAO,EAAE,UAAU,QAAQ;AACtD,QAAM,kBAAkB,eAAe,MAAM,EAAE,KAAK,CAAC,WAAW,MAAM,QAAQ,MAAM,CAAC;AACrF,QAAM,kBAAkB,cAAc,OAAO,QAAQ,EAAE,SAAS;AAChE,SAAO,EAAE,UAAU,SAAS,mBAAmB,kBAAkB,aAAa,UAAU;AAC1F;AAMO,SAAS,kBACd,UACA,UAAyB,YAChB;AACT,MAAI,YAAY,aAAa,YAAY,oBAAqB,QAAO;AACrE,QAAM,cAAc,SAAS,KAAK,CAAC,MAAM,EAAE,aAAa,cAAc,EAAE,aAAa,MAAM;AAC3F,SAAO,CAAC;AACV;AAEO,SAAS,kBACd,SACA,UACgB;AAKhB,QAAM,mBAAmB,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY,IAAI;AACjE,QAAM,cAAc,SAAS,KAAK,CAAC,MAAM,EAAE,aAAa,UAAU;AAClE,QAAM,UAAU,SAAS,KAAK,CAAC,MAAM,EAAE,aAAa,MAAM;AAI1D,QAAM,cAAc,MAAM,SAAS,CAAC,MAAM,EAAE,YAAY,QAAQ,EAAE,UAAU,KAAK;AAEjF,MAAI,YAAa,QAAO;AACxB,MAAI,WAAW,CAAC,YAAa,QAAO;AACpC,MAAI,SAAS,SAAS,EAAG,QAAO;AAGhC,MAAI,iBAAiB,WAAW,KAAK,CAAC,YAAa,QAAO;AAC1D,SAAO;AACT;AAEO,SAAS,mBAAmB,SAAuC;AACxE,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAM,YAAY,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE;AACpD,SAAO,YAAY,QAAQ;AAC7B;AAMO,SAAS,gBAAgB,UAA2D;AACzF,QAAM,SAAyC;AAAA,IAC7C,UAAU;AAAA,IACV,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AAEA,aAAW,KAAK,UAAU;AACxB,WAAO,EAAE,QAAQ;AAAA,EACnB;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,UAA2D;AACzF,QAAM,SAAyC;AAAA,IAC7C,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,SAAS;AAAA,IACT,eAAe;AAAA,IACf,cAAc;AAAA,EAChB;AAEA,aAAW,KAAK,UAAU;AACxB,WAAO,EAAE,QAAQ;AAAA,EACnB;AAEA,SAAO;AACT;AAEO,SAAS,YAAY,QAAgD;AAC1E,SAAO,OAAO,OAAO,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AACxD;AAMO,SAAS,gBACd,IACA,SACA,UACQ;AACR,QAAM,kBAAkB,QACrB,IAAI,CAAC,MAAM,OAAO,uBAAuB,EAAE,UAA4B,CAAC,OAAO,EAAE,OAAO,EAAE,EAC1F,KAAK,IAAI;AAEZ,SAAO,gBAAgB,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,KAAK;AAAA;AAAA,gBAEvC,SAAS,WAAW,KAAK,GAAG,CAAC;AAAA,yBACpB,OAAO,QAAQ,MAAM,CAAC;AAAA;AAAA,EAE7C,eAAe;AACjB;AASO,SAAS,oBAAoB,QAA+B;AACjE,QAAM,QAAQ,eAAe,OAAO,QAAQ;AAC5C,QAAM,eAAe,OAAO,SAAS,WAAW,KAAK,GAAG,EAAE,YAAY;AAEtE,QAAM,kBAAkB,sBAAsB,MAAM;AACpD,QAAM,eAAe,mBAAmB,MAAM;AAE9C,SAAO,MAAM,KAAK,yBAAyB,YAAY;AAAA;AAAA,EAEvD,OAAO,OAAO;AAAA;AAAA,EAEd,eAAe;AAAA;AAAA,EAEf,YAAY;AAAA;AAAA;AAAA,kFAGoE,OAAO,OAAO,eAAe,CAAC;AAChH;AAEA,SAAS,sBAAsB,QAA+B;AAC5D,QAAM,cAAc,OAAO,cAAc,QAAQ,CAAC,MAAM,EAAE,QAAQ;AAElE,MAAI,YAAY,WAAW,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,CAAC,GAAG,WAAW,EAAE;AAAA,IAC9B,CAAC,GAAG,MAAM,eAAe,EAAE,QAAQ,IAAI,eAAe,EAAE,QAAQ;AAAA,EAClE;AAEA,QAAM,QAAQ,CAAC,gBAAgB,EAAE;AAEjC,aAAW,KAAK,QAAQ;AACtB,UAAM,QAAQ,eAAe,EAAE,QAAQ;AACvC,UAAM,MACJ,EAAE,SAAS,SACP,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS,SAAY,IAAI,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,QAChE;AACN,UAAM,KAAK,GAAG,KAAK,MAAM,EAAE,KAAK,KAAK,GAAG,EAAE;AAC1C,UAAM,KAAK,KAAK,EAAE,WAAW,EAAE;AAC/B,QAAI,EAAE,eAAe,QAAW;AAC9B,YAAM,KAAK,eAAQ,EAAE,UAAU,EAAE;AAAA,IACnC;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,mBAAmB,QAA+B;AACzD,QAAM,EAAE,mBAAmB,IAAI;AAC/B,QAAM,QAAQ,YAAY,kBAAkB;AAE5C,QAAM,QAAkB,CAAC;AACzB,aAAW,YAAY,CAAC,YAAY,QAAQ,UAAU,OAAO,MAAM,GAAuB;AACxF,UAAM,QAAQ,mBAAmB,QAAQ;AACzC,QAAI,QAAQ,GAAG;AACb,YAAM,KAAK,GAAG,eAAe,QAAQ,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,QAAQ,EAAE;AAAA,IACvE;AAAA,EACF;AAEA,SAAO;AAAA,8BACqB,OAAO,KAAK,CAAC;AAAA;AAAA,aAE9B,OAAO,OAAO,WAAW,CAAC;AAAA,gBACvB,OAAO,iBAAiB,KAAK,QAAQ,CAAC,CAAC;AAAA,cACzC,OAAO,OAAO,eAAe,CAAC;AAAA,cAC9B,MAAM,KAAK,IAAI,KAAK,MAAM;AAAA;AAAA;AAGxC;AAMO,SAAS,mBACd,UACA,UACA,YACA,OACoB;AACpB,SAAO;AAAA,IACL;AAAA,IACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,IAKZ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,SAAS,kBAAkB,KAAK;AAAA,IAChC,UAAU,CAAC;AAAA,IACX;AAAA,IACA,YAAY;AAAA,EACd;AACF;AA6BO,SAAS,mBACd,SAC+C;AAC/C,MAAI,QAAQ,QAAS,QAAO;AAC5B,QAAM,QAAQ,QAAQ,wBAAwB,gBAAgB;AAC9D,SAAO,EAAE,OAAO,QAAQ,GAAG,KAAK,KAAK,QAAQ,WAAW,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,GAAG;AAC1F;","names":[]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadPapersRegistry
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-K7QRRVKW.js";
|
|
4
4
|
import {
|
|
5
5
|
getErrorMessage
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-LZ6WZJRH.js";
|
|
7
7
|
|
|
8
8
|
// src/cli/research-helpers-synthesize.ts
|
|
9
9
|
import { z } from "zod";
|
|
@@ -886,4 +886,4 @@ export {
|
|
|
886
886
|
AttributedInsightSchema,
|
|
887
887
|
synthesizeResearch
|
|
888
888
|
};
|
|
889
|
-
//# sourceMappingURL=chunk-
|
|
889
|
+
//# sourceMappingURL=chunk-KY3U2XEW.js.map
|