-
Notifications
You must be signed in to change notification settings - Fork 3
/
CodeSuggester.js
432 lines (399 loc) · 13.6 KB
/
CodeSuggester.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as monaco from 'monaco-editor';
import { generateCodeSuggestion } from '../../api/openai';
class CodeSuggester {
constructor(editor, apiKey, apiUrl, onSuggestionAccepted) {
this.editor = editor;
this.apiKey = apiKey;
this.apiUrl = apiUrl;
this.onSuggestionAccepted = onSuggestionAccepted;
this.suggestionDelay = 500; // Consider making this configurable if not already
}
async provideCompletionItems(model, position) {
const textUntilPosition = this.getTextUntilPosition(model, position);
if (textUntilPosition.length < 3) return { suggestions: [] };
const suggestion = await this.generateContextAwareCodeSuggestion(
textUntilPosition,
model.getValue(),
position
);
if (!suggestion) return { suggestions: [] };
return this.buildCompletionSuggestion(suggestion, position);
}
getTextUntilPosition(model, position) {
return model.getValueInRange({
startLineNumber: position.lineNumber,
startColumn: 1,
endLineNumber: position.lineNumber,
endColumn: position.column,
});
}
buildCompletionSuggestion(suggestion, position) {
return {
suggestions: [{
label: suggestion,
kind: monaco.languages.CompletionItemKind.Snippet,
insertText: suggestion,
range: new monaco.Range(position.lineNumber, position.column, position.lineNumber, position.column),
}],
};
}
async generateContextAwareCodeSuggestion(prompt, context, position) {
const model = this.editor.getModel();
if (!model) return null;
const surroundingCode = this.getSurroundingCode(position);
const previousLine = model.getLineContent(position.lineNumber - 1);
const nextLine = model.getLineContent(position.lineNumber + 1);
const enhancedPrompt = this.formatPrompt(prompt, context, surroundingCode, previousLine, nextLine);
return generateCodeSuggestion(enhancedPrompt, context, this.apiKey, this.apiUrl);
}
formatPrompt(prompt, context, surroundingCode, previousLine, nextLine) {
return `
Generate code suggestion for the following prompt in the context of the provided code snippet:
Language: XML (Azure API Management policy code)
Prompt: ${prompt}
Context: ${context}
Surrounding Code: ${surroundingCode}
Previous Line: ${previousLine}
Next Line: ${nextLine}
Considerations:
- Only reply with the code snippet, no comments, no explanations.
- Only generate code that can be inserted as-is at the current position. Don't generate any surrounding code.
- Ensure the generated code is syntactically correct and fits well within the existing code structure.
- Use appropriate variable names, function names, and coding conventions based on the surrounding code.
- Consider the context and purpose of the code snippet to provide meaningful suggestions.
- If the prompt is ambiguous or lacks sufficient context, provide a best-effort suggestion or indicate that more information is needed.
Additionally to the API Management policy code, there is also the following custom policy available
<set-insurance-data .../>
This custom policy has the following attributes available, include them to the code compleation accordingly:
policyNumber
policyHolderName
policyStartDate
policyEndDate
premiumAmount
coverageType
coverageLimit
deductibleAmount
paymentFrequency
policyStatus
underwriterName
riskScore
claimHistoryCount
policyRenewalDate
insuredAssetType
insuredAssetValue
beneficiaryName
beneficiaryRelationship
agentId
agentRegion
commissionRate
policyIssuanceDate
lastPremiumPaidDate
nextPremiumDueDate
totalPremiumPaid
totalClaimsMade
totalClaimsPaid
coverageStartDate
coverageEndDate
additionalRiders
riderCost
policyCancellationDate
cancellationReason
reinstatementDate
policyAmendmentDate
amendmentDetails
specialConditions
policyNotes
customerAddress
customerEmail
customerPhoneNumber
emergencyContactName
emergencyContactPhone
policyDocumentUrl
insuredAssetDescription
assetCondition
assetLocation
claimProcessTime
claimDenialReason
premiumPaymentMethod
policyTransferDate
transferToPolicyHolderName
underwritingGuidelinesMet
riskMitigationMeasures
policyAuditDate
auditFindings
correctiveActionTaken
policyComplianceStatus
fraudInvestigationFlag
investigationOutcome
claimAdjusterName
adjusterReport
claimSettlementDate
settlementAmount
disputeResolutionMethod
resolutionOutcome
customerSatisfactionRating
policyUpgradeDate
upgradedCoverageType
policyDowngradeDate
downgradedCoverageType
referralSource
referralBonus
loyaltyDiscount
multiPolicyDiscount
earlyPaymentDiscount
latePaymentFee
reinstatementFee
policyReinstatementReason
coverageExclusions
excludedRiskFactors
preExistingConditionFlag
healthDeclarationFormUrl
vehicleIdentificationNumber
propertySurveyReportUrl
securityMeasures
environmentalRiskAssessment
geopoliticalRiskZone
cyberProtectionMeasures
dataBreachHistoryCount
encryptionComplianceStatus
intellectualPropertyCoverage
businessInterruptionCoverage
employeeLiabilityCoverage
productLiabilityCoverage
publicLiabilityCoverage
legalDefenseCostCoverage
crisisManagementCoverage
reputationProtectionCoverage
pandemicCoverageLevel
complianceAuditTrail
digitalSecurityRating
policyVersionControl
versionEffectiveDate
underwritingDecisionEngineVersion
premiumAdjustmentFactor
claimsAdjustmentFactor
policyholderPortalAccess
documentUploadDate
autoRenewalFlag
renewalDiscountRate
cancellationFee
partialWithdrawalLimit
fullSurrenderValue
cashValueAccrualRate
interestRateGuarantee
mortalityCharge
expenseCharge
fundManagementCharge
allocationRate
switchFee
switchLimit
freeSwitchAllowance
investmentFundOptions
fundPerformanceRating
personalizedRiskProfile
assetAllocationStrategy
policyLoanInterestRate
loanRepaymentSchedule
collateralAssignment
gracePeriodLength
premiumReminderNotices
electronicPolicyDeliveryOption
paperlessCommunicationPreference
customerFeedbackScore
serviceInteractionCount
digitalEngagementLevel
policyholderRetentionRate
crossSellOpportunityScore
upsellOpportunityScore
lifetimeValueEstimate
churnRiskScore
customerAcquisitionChannel
marketingCampaignResponse
socialMediaEngagementRate
netPromoterScore
claimsSubmissionPortal
onlineClaimTrackingCapability
virtualAdjusterOption
claimSettlementOption
instantClaimPaymentFeature
fraudDetectionSystem
anomalyDetectionAlerts
customerVerificationMethod
identityTheftProtectionOption
dataPrivacyComplianceStatus
GDPRComplianceStatus
CCPAComplianceStatus
regulatoryChangeManagementProcess
legalDisputeHistory
arbitrationProcessDetails
settlementAgreementConfidentiality
contractualLiabilityCoverage
directorsAndOfficersCoverage
employmentPracticesLiabilityCoverage
fiduciaryLiabilityCoverage
kidnappingAndRansomCoverage
politicalRiskCoverage
tradeCreditRiskCoverage
supplyChainDisruptionCoverage
environmentalLiabilityCoverage
marineCargoCoverage
aviationLiabilityCoverage
spaceRiskCoverage
cyberEventResponseTeam
ransomwareProtectionCoverage
blockchainTransactionCoverage
cryptocurrencyRiskAssessment
intellectualPropertyRiskScoring
innovationLabPartnership
insurtechIntegrationLevel
AIUnderwritingModelAccuracy
predictiveAnalyticsUseCases
telematicsDataIntegration
IoTDeviceCompatibility
wearableTechHealthMonitoring
autonomousVehiclePolicyAdaptation
droneUsagePolicyCoverage
gigEconomyWorkerCoverage
remoteWorkplaceRiskAssessment
disasterRecoveryPlanStatus
businessContinuityCoverageLimit
emergencyResponseTeamContact
pandemicResponsePlanEffectiveDate
vaccinationCoverageBenefit
mentalHealthSupportCoverage
wellnessProgramParticipationRate
telemedicineServiceOption
geneticTestingCoverageOption
personalizedMedicineCoverage
climateChangeRiskAssessment
renewableEnergyEquipmentCoverage
greenBuildingComplianceStatus
carbonOffsetContributionRate
biodiversityImpactRating
sustainableInvestmentCriteria
ecoFriendlyDiscounts
plasticReductionInitiativesCoverage
cleanWaterAccessCoverage
airQualityImprovementEfforts
disasterResilientConstructionDiscount
urbanHeatIslandEffectMitigation
wildfireDefenceServices
floodRiskReductionFeatures
hurricaneProofingMeasures
earthquakeRetrofittingDiscounts
volcanicEruptionCoverage
landslideStabilizationMeasures
droughtResponseSolutions
arcticBlastPreparationPlan
infectiousDiseaseOutbreakResponse
vaccineDistributionSupport
medicalSupplyChainInterruptionCoverage
healthCrisisManagementTeam
globalHealthAdvisoryPartnerships
spaceTravelInsuranceOptions
lunarColonyLifeSupportSystem
asteroidMiningClaimProtection
extraterrestrialHabitatWarranty
zeroGravityInjuryCoverage
interstellarMessageTransmissionDelayInsurance
quantumComputingRiskAssessment
digitalTwinTechnologyIntegration
holographicDataStorageBackup
nanotechnologyMaterialDamage
artificialIntelligenceEthicsCompliance
roboticsDamageLiability
autonomousRobotsMalfunctionCoverage
geneEditingLegalLiability
biometricDataBreachResponse
virtualRealityPropertyRights
augmentedRealityInjuryPrevention
eSportAthleteInjuryCoverage
streamingServiceInterruptionInsurance
socialMediaReputationRecovery
deepfakeDetectionServices
onlineHarassmentLegalAssistance
digitalNomadResidencyStatusAssistance
cyberbullyingResponseTeams
darkWebMonitoringServices
blockchainAssetRecoveryAssistance
cryptocurrencyVolatilityShield
tokenizedAssetInsurance
NFTAuthenticityVerification
smartContractFailureCoverage
DAOOperationalRiskAssessment
gigEconomyVehicleWearAndTear
remotePilotLiabilityInsurance
sharedEconomyAssetDamage
coLivingSpaceLiabilityCoverage
crowdFundingProjectFailureInsurance
personalBrandDamageMitigation
influencerPartnershipDisruption
subscriptionModelBusinessInterruption
circularEconomyWasteManagement
zeroWastePolicyAdherence
plantBasedProductLiability
culturedMeatRegulatoryCompliance
waterReuseSystemInstallationSupport
energyStorageSystemFailure
microgridDisruptionCoverage
decentralizedInternetAccessInterruption
communitySupportedAgricultureLoss
urbanFarmingInfrastructureDamage
verticalGardenMaintenanceCoverage
pollinatorPopulationProtection
wildlifeCorridorDisruptionAssessment
conservationLandTitleInsurance
ecoTourismTripCancellation
sustainableFishingPracticesSupport
renewableResourceHarvestTiming
climateRefugeeRelocationAssistance
heatwaveCoolingCenterSupport
coldSnapHeatingSolutions
stormwaterManagementSystems
erosionControlProjectInsurance
reforestationProjectProtection
coralReefRestorationSupport
endangeredSpeciesHabitatInsurance
zeroCarbonFootprintInitiative
plasticNeutralCertificationSupport
electronicWasteRecyclingPrograms
`;
}
getSurroundingCode(position) {
const model = this.editor.getModel();
const startLineNumber = Math.max(1, position.lineNumber - 5);
const endLineNumber = Math.min(model.getLineCount(), position.lineNumber + 5);
return model.getValueInRange({
startLineNumber,
startColumn: 1,
endLineNumber,
endColumn: model.getLineMaxColumn(endLineNumber),
});
}
register() {
this.completionItemProvider = monaco.languages.registerCompletionItemProvider('xml', {
provideCompletionItems: (model, position) => this.provideCompletionItems(model, position),
});
this.editor.onDidChangeCursorSelection(({ selection }) => {
const model = this.editor.getModel();
const position = selection.getPosition();
const word = model.getWordAtPosition(position);
if (!word) return;
const suggestion = model.getValueInRange({
startLineNumber: position.lineNumber,
startColumn: word.startColumn,
endLineNumber: position.lineNumber,
endColumn: word.endColumn,
});
if (suggestion) this.onSuggestionAccepted(suggestion);
});
}
dispose() {
if (this.completionItemProvider) this.completionItemProvider.dispose();
}
}
export default CodeSuggester;