@sourcegraph/cody-web 0.12.0 → 0.14.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.
@@ -18,7 +18,7 @@ var __privateWrapper = (obj, member, setter2, getter) => ({
18
18
  }
19
19
  });
20
20
  var _a2, _b, _constructing, _max, _maxSize, _dispose, _disposeAfter, _fetchMethod, _size, _calculatedSize, _keyMap, _keyList, _valList, _next, _prev, _head, _tail, _free, _disposed, _sizes, _starts, _ttls, _hasDispose, _hasFetchMethod, _hasDisposeAfter, _LRUCache_instances, initializeTTLTracking_fn, _updateItemAge, _statusTTL, _setItemTTL, _isStale, initializeSizeTracking_fn, _removeItemSize, _addItemSize, _requireSize, indexes_fn, rindexes_fn, isValidIndex_fn, evict_fn, backgroundFetch_fn, isBackgroundFetch_fn, connect_fn, moveToTail_fn, _c, _d, _e, _f, _constructing2, _g, _h, _max2, _maxSize2, _dispose2, _disposeAfter2, _fetchMethod2, _size2, _calculatedSize2, _keyMap2, _keyList2, _valList2, _next2, _prev2, _head2, _tail2, _free2, _disposed2, _sizes2, _starts2, _ttls2, _hasDispose2, _hasFetchMethod2, _hasDisposeAfter2, _LRUCache_instances2, initializeTTLTracking_fn2, _updateItemAge2, _statusTTL2, _setItemTTL2, _isStale2, initializeSizeTracking_fn2, _removeItemSize2, _addItemSize2, _requireSize2, indexes_fn2, rindexes_fn2, isValidIndex_fn2, evict_fn2, backgroundFetch_fn2, isBackgroundFetch_fn2, connect_fn2, moveToTail_fn2, _root2, _hasMagic, _uflag, _parts, _parent2, _parentIndex, _negs, _filledNegs, _options, _toString, _emptyExt, _AST_instances, fillNegs_fn, _AST_static, parseAST_fn, partsToRegExp_fn, parseGlob_fn, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
21
- import { aT as Observable, bJ as unsubscribe, bK as AsyncSerialScheduler, bL as authStatus, bM as debounceTime, bN as switchMapReplayOperation, bO as interval, bP as map$1, bQ as filter$3, bR as startWith$1, bS as switchMap$1, bT as promiseFactoryToObservable, bc as isError$3, bU as distinctUntilChanged$1, bt as firstValueFrom$1, bV as skipPendingOperation, bW as logDebug$1, bX as graphqlClient, bY as isAbortError, bZ as logError$2, b_ as semver, b$ as pick, c0 as pendingOperation, bi as ModelTag, c1 as getModelInfo, bD as CHAT_INPUT_TOKEN_BUDGET, c2 as CHAT_OUTPUT_TOKEN_BUDGET, c3 as EXTENDED_CHAT_INPUT_TOKEN_BUDGET, c4 as EXTENDED_USER_CONTEXT_TOKEN_BUDGET, c5 as createSubscriber, c6 as fromVSCodeEvent, a_ as isEqual, c7 as cenv, bE as isDotCom, c8 as currentAuthStatus, c9 as isFileURI, w as wrapInActiveSpan, ca as INCLUDE_EVERYTHING_CONTEXT_FILTERS, cb as EXCLUDE_EVERYTHING_CONTEXT_FILTERS, cc as onAbort, cd as addCodyClientIdentificationHeaders, ce as addTraceparent, cf as fetch$2, cg as verifyResponseCode, b7 as FeatureFlag, ch as combineLatest$1, ci as take$2, cj as clientCapabilities, ck as shareReplay$1, cl as tap$2, cm as featureFlagProvider, cn as getEnterpriseContextWindow, co as ANSWER_TOKENS, cp as storeLastValue, cq as resolvedConfig, bw as firstResultFromOperation, cr as userProductSubscription, cs as isEnterpriseUser, b6 as isCodyProUser, p as ps, ct as currentResolvedConfig, bI as PromptString, cu as isCustomModel, cv as recordErrorToSpan, cw as addClientInfoParams, cx as dependentAbortController, an as FILE_CONTEXT_MENTION_PROVIDER, ao as SYMBOL_CONTEXT_MENTION_PROVIDER, ap as REMOTE_REPOSITORY_PROVIDER_URI, aq as REMOTE_FILE_PROVIDER_URI, ar as REMOTE_DIRECTORY_PROVIDER_URI, as as WEB_PROVIDER_URI, t as telemetryRecorder, C as ContextItemSource, bx as lodashExports, cy as truncatePromptString, cz as isS2, cA as GIT_OPENCTX_PROVIDER_URI, ba as CodyIDE, cB as openCtx, aL as URI, cC as MulticastSubject, cD as AsyncSerialScheduler_1, g as getDefaultExportFromCjs, cE as Utils$1, cF as toString_1, cG as upperFirst_1, cH as _, cI as extensionForLanguage, cJ as setClientNameVersion, cK as _getNative, cL as eq_1, cM as _root, cN as _Uint8Array, cO as isObject_1, cP as _overArg, cQ as _isPrototype, cR as isArrayLike_1, cS as isObjectLike_1, cT as _baseGetTag, cU as _arrayLikeKeys, cV as isArguments_1, cW as isArray_1, cX as isBufferExports, cY as isFunction_1, cZ as isTypedArray_1, c_ as _Stack, c$ as _isIndex, d0 as isSourcegraphToken, d1 as requireBase64Js, c as commonjsGlobal, d2 as setExtensionVersion, d3 as withLatestFrom, d4 as NEVER, d5 as abortableOperation, d6 as disposableSubscription, d7 as setAuthStatusObservable, d8 as normalizeServerEndpointURL, d9 as SourcegraphGraphQLAPIClient, da as isNetworkLikeError, db as DOTCOM_URL, dc as SUPPORTED_URI_SCHEMAS, dd as _baseIsEqual, de as keys_1, df as isSymbol_1, dg as _MapCache, dh as isLength_1, di as toNumber_1, dj as _baseFindIndex, r as require$$1$4, dk as NetworkError, dl as isRateLimitError, dm as isAuthError, d as dedent$1, dn as TokenCounterUtils, dp as toRangeData, dq as DefaultChatCommands, bf as isDefined, dr as pathFunctionsForURI, ds as uriParseNameAndExtension, dt as uriDirname, du as uriExtname, dv as uriBasename, dw as DefaultEditCommands, dx as subscriptionDisposable, dy as NoOpTelemetryRecorderProvider, dz as TimestampTelemetryProcessor_1, dA as updateGlobalTelemetryInstances, dB as TelemetryRecorderProvider, dC as telemetryRecorderProvider, dD as createGitDiff, dE as convertGitCloneURLToCodebaseName, dF as pluck, dG as catchError$1, dH as _getSymbols, dI as _arrayPush, dJ as stubArray_1, dK as _baseGetAllKeys, dL as _Symbol, dM as _getTag, dN as _nodeUtilExports, dO as _baseUnary, dP as _getAllKeys, dQ as _baseSlice, dR as _arrayMap, dS as displayPathWithoutWorkspaceFolderPrefix, dT as getEditorInsertSpaces, dU as escapeRegExp$1, dV as isNetworkError, bn as isCodyProModel, dW as http, bb as CodyTaskState, aU as createExtensionAPI, aV as createMessageAPIForWebview, dX as currentAuthStatusOrNotReadyYet, dY as getAugmentedNamespace, dZ as main$1, d_ as TESTING_TELEMETRY_EXPORTER, d$ as dist, e0 as currentAuthStatusAuthed, e1 as waitUntilComplete, bv as isMacOS, bs as CustomCommandType, bH as setDisplayPathEnvInfo, e2 as isWindows, e3 as currentUserProductSubscription, bp as ACCOUNT_USAGE_URL, aW as debounce$1, at as displayPath, e4 as structuredPatch, e5 as isDotComAuthed, e6 as dedupeWith$1, e7 as AbortError, e8 as TimeoutError, e9 as createDisposables, ea as getEditorTabSize$1, eb as debounce_1, bG as isErrorLike, ec as mentionProvidersMetadata, ed as editorStateFromPromptString, aw as displayPathBasename, ee as assertFileURI, ef as setOpenCtx, eg as truncateTextNearestLine, eh as MAX_BYTES_PER_FILE, ei as expandToLineRange, au as displayLineRange, aQ as parseMentionQuery, ej as TokenCounter, ek as PromptMode, el as skip$1, em as tracer, en as getTokenCounterUtils, bA as inputTextWithoutContextChipsFromPromptEditorState, bh as isAbortErrorOrSocketHangUp, eo as isContextWindowLimitError, b4 as forceHydration, bg as reformatBotMessageForChat, b5 as hydrateAfterPostMessage, ep as addMessageListenersForExtensionAPI, eq as createMessageAPIForExtension, bq as View, er as CODY_BLOG_URL_o1_WAITLIST, es as CODY_PASSTHROUGH_VSCODE_OPEN_COMMAND_ID, bm as pluralize, br as ACCOUNT_UPGRADE_URL, a$ as scanForMentionTriggerInUserTextInput, ay as LARGE_FILE_WARNING_LABEL, et as GENERAL_HELP_LABEL, eu as diffLines, ev as psDedent, ew as languageFromFilename, ex as ProgrammingLanguage, ey as truncatePromptStringStart, ez as MAX_CURRENT_FILE_TOKENS, eA as posixFilePaths, eB as SURROUNDING_LINES, eC as CODY_SUPPORT_URL, eD as CODY_DOC_URL, be as CODY_FEEDBACK_URL, eE as DISCORD_URL, bu as getRelativeChatPeriod, eF as globalAgentRef, eG as SG_CHANGELOG_URL, eH as ACCOUNT_LIMITS_INFO_URL, eI as assertUnreachable, eJ as promise, eK as setLogger, eL as setClientCapabilities, eM as setResolvedConfigurationObservable, eN as CODY_OLLAMA_DOCS_URL, bF as browser$3 } from "./browser-CJqqS-Nu.mjs";
21
+ import { aR as Observable, bK as unsubscribe, bL as AsyncSerialScheduler, bM as authStatus, bN as debounceTime, bO as switchMapReplayOperation, bP as interval, bQ as map$1, bR as filter$3, bS as startWith$1, bT as switchMap$1, bU as promiseFactoryToObservable, bc as isError$3, bV as distinctUntilChanged$1, by as firstValueFrom$1, bz as skipPendingOperation, bW as logDebug$1, bX as graphqlClient, bY as isAbortError, bZ as logError$2, b_ as semver, b$ as pick, c0 as pendingOperation, bi as ModelTag, c1 as getModelInfo, bE as CHAT_INPUT_TOKEN_BUDGET, c2 as CHAT_OUTPUT_TOKEN_BUDGET, c3 as EXTENDED_CHAT_INPUT_TOKEN_BUDGET, c4 as EXTENDED_USER_CONTEXT_TOKEN_BUDGET, c5 as createSubscriber, c6 as fromVSCodeEvent, aY as isEqual, c7 as cenv, bF as isDotCom, c8 as currentAuthStatus, c9 as isFileURI, w as wrapInActiveSpan, ca as INCLUDE_EVERYTHING_CONTEXT_FILTERS, cb as EXCLUDE_EVERYTHING_CONTEXT_FILTERS, cc as onAbort, cd as addCodyClientIdentificationHeaders, ce as addTraceparent, cf as fetch$2, cg as verifyResponseCode, b5 as FeatureFlag, ch as combineLatest$1, ci as take$2, cj as clientCapabilities, ck as shareReplay$1, cl as tap$2, cm as featureFlagProvider, cn as getEnterpriseContextWindow, co as ANSWER_TOKENS, cp as storeLastValue, cq as resolvedConfig, bv as firstResultFromOperation, cr as userProductSubscription, cs as isEnterpriseUser, b4 as isCodyProUser, p as ps, ct as currentResolvedConfig, bI as PromptString, cu as isCustomModel, cv as recordErrorToSpan, cw as addClientInfoParams, cx as dependentAbortController, al as FILE_CONTEXT_MENTION_PROVIDER, am as SYMBOL_CONTEXT_MENTION_PROVIDER, an as REMOTE_REPOSITORY_PROVIDER_URI, ao as REMOTE_FILE_PROVIDER_URI, ap as REMOTE_DIRECTORY_PROVIDER_URI, aq as WEB_PROVIDER_URI, t as telemetryRecorder, C as ContextItemSource, bw as lodashExports, cy as truncatePromptString, cz as isS2, cA as GIT_OPENCTX_PROVIDER_URI, bb as cryptoJsExports, b8 as CodyIDE, cB as openCtx, aJ as URI, cC as MulticastSubject, cD as AsyncSerialScheduler_1, g as getDefaultExportFromCjs, cE as Utils$1, cF as toString_1, cG as upperFirst_1, cH as _, cI as extensionForLanguage, cJ as setClientNameVersion, cK as _getNative, cL as eq_1, cM as _root, cN as _Uint8Array, cO as isObject_1, cP as _overArg, cQ as _isPrototype, cR as isArrayLike_1, cS as isObjectLike_1, cT as _baseGetTag, cU as _arrayLikeKeys, cV as isArguments_1, cW as isArray_1, cX as isBufferExports, cY as isFunction_1, cZ as isTypedArray_1, c_ as _Stack, c$ as _isIndex, d0 as isSourcegraphToken, d1 as requireBase64Js, b9 as commonjsGlobal, d2 as setExtensionVersion, d3 as withLatestFrom, d4 as NEVER, d5 as abortableOperation, d6 as disposableSubscription, d7 as setAuthStatusObservable, d8 as normalizeServerEndpointURL, d9 as SourcegraphGraphQLAPIClient, da as isNetworkLikeError, db as DOTCOM_URL, dc as SUPPORTED_URI_SCHEMAS, dd as _baseIsEqual, de as keys_1, df as isSymbol_1, dg as _MapCache, dh as isLength_1, di as toNumber_1, dj as _baseFindIndex, dk as require$$1$4, dl as NetworkError, dm as isRateLimitError, dn as isAuthError, d as dedent$1, dp as TokenCounterUtils, dq as toRangeData, dr as DefaultChatCommands, bf as isDefined, ds as pathFunctionsForURI, dt as uriParseNameAndExtension, du as uriDirname, dv as uriExtname, dw as uriBasename, dx as DefaultEditCommands, dy as subscriptionDisposable, dz as NoOpTelemetryRecorderProvider, dA as TimestampTelemetryProcessor_1, dB as updateGlobalTelemetryInstances, dC as TelemetryRecorderProvider, dD as telemetryRecorderProvider, dE as createGitDiff, dF as convertGitCloneURLToCodebaseName, dG as pluck, dH as catchError$1, dI as _getSymbols, dJ as _arrayPush, dK as stubArray_1, dL as _baseGetAllKeys, dM as _Symbol, dN as _getTag, dO as _nodeUtilExports, dP as _baseUnary, dQ as _getAllKeys, dR as _baseSlice, dS as _arrayMap, dT as displayPathWithoutWorkspaceFolderPrefix, dU as getEditorInsertSpaces, dV as escapeRegExp$1, dW as isNetworkError, bp as isCodyProModel, dX as http, ba as CodyTaskState, aS as createExtensionAPI, aT as createMessageAPIForWebview, dY as currentAuthStatusOrNotReadyYet, dZ as getAugmentedNamespace, d_ as main$1, d$ as TESTING_TELEMETRY_EXPORTER, e0 as dist, e1 as currentAuthStatusAuthed, e2 as waitUntilComplete, bu as isMacOS, bn as CustomCommandType, bJ as setDisplayPathEnvInfo, e3 as isWindows, e4 as currentUserProductSubscription, br as ACCOUNT_USAGE_URL, aU as debounce$1, ar as displayPath, e5 as structuredPatch, e6 as isDotComAuthed, e7 as dedupeWith$1, e8 as AbortError, e9 as TimeoutError, ea as createDisposables, eb as getEditorTabSize$1, ec as debounce_1, bH as isErrorLike, ed as mentionProvidersMetadata, ee as editorStateFromPromptString, au as displayPathBasename, ef as assertFileURI, eg as setOpenCtx, eh as truncateTextNearestLine, ei as MAX_BYTES_PER_FILE, ej as expandToLineRange, as as displayLineRange, aO as parseMentionQuery, ek as TokenCounter, el as PromptMode, em as skip$1, en as tracer, eo as getTokenCounterUtils, bB as inputTextWithoutContextChipsFromPromptEditorState, bh as isAbortErrorOrSocketHangUp, ep as isContextWindowLimitError, b2 as forceHydration, bg as reformatBotMessageForChat, b3 as hydrateAfterPostMessage, eq as addMessageListenersForExtensionAPI, er as createMessageAPIForExtension, bo as View, es as CODY_BLOG_URL_o1_WAITLIST, et as CODY_PASSTHROUGH_VSCODE_OPEN_COMMAND_ID, bm as pluralize, bs as ACCOUNT_UPGRADE_URL, aZ as scanForMentionTriggerInUserTextInput, aw as LARGE_FILE_WARNING_LABEL, eu as GENERAL_HELP_LABEL, ev as diffLines, ew as psDedent, ex as languageFromFilename, ey as ProgrammingLanguage, ez as truncatePromptStringStart, eA as MAX_CURRENT_FILE_TOKENS, eB as posixFilePaths, eC as SURROUNDING_LINES, eD as CODY_SUPPORT_URL, eE as CODY_DOC_URL, be as CODY_FEEDBACK_URL, eF as DISCORD_URL, bt as getRelativeChatPeriod, eG as globalAgentRef, eH as VSCODE_CHANGELOG_URL, eI as SG_CHANGELOG_URL, eJ as ACCOUNT_LIMITS_INFO_URL, eK as assertUnreachable, eL as promise, eM as setLogger, eN as setClientCapabilities, eO as setResolvedConfigurationObservable, eP as CODY_OLLAMA_DOCS_URL, bG as browser$3 } from "./browser-BISWjcA3.mjs";
22
22
  function _mergeNamespaces(n, m) {
23
23
  for (var i = 0; i < m.length; i++) {
24
24
  const e = m[i];
@@ -8318,24 +8318,44 @@ class ModelsService {
8318
8318
  this.storedValue = storeLastValue(
8319
8319
  this.modelsChanges.pipe(map$1((data2) => data2 === pendingOperation ? EMPTY_MODELS_DATA : data2))
8320
8320
  );
8321
- this.syncPreferencesSubscription = this.modelsChanges.pipe(
8322
- skipPendingOperation(),
8323
- tap$2((data2) => {
8324
- var _a3;
8325
- if (this.storage) {
8326
- const allSitePrefs = this.storage.getModelPreferences();
8327
- const updated = {
8328
- ...allSitePrefs,
8329
- [currentAuthStatus().endpoint]: data2.preferences
8330
- };
8331
- (_a3 = this.storage) == null ? void 0 : _a3.setModelPreferences(updated);
8321
+ }
8322
+ setStorage(storage) {
8323
+ this.storage = storage;
8324
+ this.syncPreferencesSubscription = combineLatest$1(
8325
+ this.modelsChanges,
8326
+ featureFlagProvider.evaluatedFeatureFlag(FeatureFlag.CodyEditDefaultToGpt4oMini)
8327
+ ).pipe(
8328
+ tap$2(([data2, shouldEditDefaultToGpt4oMini]) => {
8329
+ var _a3, _b2, _c2;
8330
+ if (data2 === pendingOperation) {
8331
+ return;
8332
8332
  }
8333
+ const isEnrolled = (_a3 = this.storage) == null ? void 0 : _a3.getEnrollmentHistory(
8334
+ FeatureFlag.CodyEditDefaultToGpt4oMini
8335
+ );
8336
+ const gpt4oMini = data2.primaryModels.find(
8337
+ (model2) => {
8338
+ var _a4;
8339
+ return ((_a4 = model2 == null ? void 0 : model2.modelRef) == null ? void 0 : _a4.modelId) === "gpt-4o-mini";
8340
+ }
8341
+ );
8342
+ const allSitePrefs = (_b2 = this.storage) == null ? void 0 : _b2.getModelPreferences();
8343
+ const currentAccountPrefs = { ...data2.preferences };
8344
+ if (!isEnrolled && shouldEditDefaultToGpt4oMini && gpt4oMini) {
8345
+ currentAccountPrefs.selected.edit = gpt4oMini.id;
8346
+ }
8347
+ const updated = {
8348
+ ...allSitePrefs,
8349
+ [currentAuthStatus().endpoint]: currentAccountPrefs
8350
+ };
8351
+ (_c2 = this.storage) == null ? void 0 : _c2.setModelPreferences(updated);
8333
8352
  })
8334
8353
  ).subscribe({});
8335
8354
  }
8336
8355
  dispose() {
8356
+ var _a3;
8337
8357
  this.storedValue.subscription.unsubscribe();
8338
- this.syncPreferencesSubscription.unsubscribe();
8358
+ (_a3 = this.syncPreferencesSubscription) == null ? void 0 : _a3.unsubscribe();
8339
8359
  }
8340
8360
  /**
8341
8361
  * The list of models.
@@ -8348,11 +8368,11 @@ class ModelsService {
8348
8368
  }
8349
8369
  getModelsByType(usage) {
8350
8370
  return this.modelsChanges.pipe(
8351
- map$1(
8352
- (models) => models === pendingOperation ? pendingOperation : [...models.primaryModels, ...models.localModels].filter(
8371
+ map$1((models) => {
8372
+ return models === pendingOperation ? pendingOperation : [...models.primaryModels, ...models.localModels].filter(
8353
8373
  (model2) => model2.usage.includes(usage)
8354
- )
8355
- ),
8374
+ );
8375
+ }),
8356
8376
  distinctUntilChanged$1()
8357
8377
  );
8358
8378
  }
@@ -11825,6 +11845,24 @@ var InvisibleStatusBarTag = /* @__PURE__ */ ((InvisibleStatusBarTag2) => {
11825
11845
  InvisibleStatusBarTag2["IsIgnored"] = "⁠";
11826
11846
  return InvisibleStatusBarTag2;
11827
11847
  })(InvisibleStatusBarTag || {});
11848
+ function dotcomTokenToGatewayToken(dotcomToken) {
11849
+ var _a3;
11850
+ if (!dotcomToken) {
11851
+ return void 0;
11852
+ }
11853
+ const DOTCOM_TOKEN_REGEX = /^(?:sgph?_)?(?:[\da-fA-F]{16}_|local_)?(?<hexbytes>[\da-fA-F]{40})$/;
11854
+ const match2 = DOTCOM_TOKEN_REGEX.exec(dotcomToken);
11855
+ if (!match2) {
11856
+ return void 0;
11857
+ }
11858
+ const hexEncodedAccessTokenBytes = (_a3 = match2 == null ? void 0 : match2.groups) == null ? void 0 : _a3.hexbytes;
11859
+ if (!hexEncodedAccessTokenBytes) {
11860
+ return void 0;
11861
+ }
11862
+ const accessTokenBytes = cryptoJsExports.enc.Hex.parse(hexEncodedAccessTokenBytes);
11863
+ const gatewayTokenBytes = cryptoJsExports.SHA256(cryptoJsExports.SHA256(accessTokenBytes)).toString();
11864
+ return "sgd_" + gatewayTokenBytes;
11865
+ }
11828
11866
  function getCodyAuthReferralCode(uriScheme) {
11829
11867
  const referralCodes = {
11830
11868
  [CodyIDE.JetBrains]: "JETBRAINS",
@@ -17405,11 +17443,11 @@ const camelCase$1 = /* @__PURE__ */ getDefaultExportFromCjs(camelCase_1);
17405
17443
  const $schema = "package.schema.json";
17406
17444
  const name = "cody-ai";
17407
17445
  const displayName = "Cody: AI Coding Assistant with Autocomplete & Chat";
17408
- const version$1 = "1.40.2";
17446
+ const version$1 = "1.44.0";
17409
17447
  const publisher = "sourcegraph";
17410
17448
  const license = "Apache-2.0";
17411
17449
  const icon = "resources/cody.png";
17412
- const description = "AI coding assistant that uses search and codebase context to help you write code faster. Cody brings autocomplete, chat, and commands to VS Code, so you can generate code, write unit tests, create docs, and explain complex code using AI. Choose from the latest LLMs, including GPT-4o and Claude 3.5 Sonnet.";
17450
+ const description = "AI coding assistant that uses search & codebase context to help you write code faster. Cody brings you autocomplete, chat, and commands, so you can generate code, write unit tests, create docs, and explain complex code using AI. Choose from the best LLMs, including GPT-4o and Claude 3.5 Sonnet.";
17413
17451
  const scripts = {
17414
17452
  "build:root": "pnpm -C .. run -s build",
17415
17453
  postinstall: "pnpm download-wasm && pnpm copy-win-ca-roots",
@@ -17433,7 +17471,7 @@ const scripts = {
17433
17471
  "watch:build:dev:web": 'concurrently "pnpm run -s _build:esbuild:web --watch" "pnpm run -s _build:webviews --mode development --watch"',
17434
17472
  "watch:build:dev:desktop": 'concurrently "pnpm run -s _build:esbuild:desktop --watch" "pnpm run -s _build:webviews --mode development --watch"',
17435
17473
  "_build:esbuild:desktop": "pnpm download-wasm && pnpm run -s _build:esbuild:uninstall && pnpm run -s _build:esbuild:node",
17436
- "_build:esbuild:node": "esbuild ./src/extension.node.ts --bundle --outfile=dist/extension.node.js --external:vscode --external:typescript --alias:@sourcegraph/cody-shared=@sourcegraph/cody-shared/src/index --alias:@sourcegraph/cody-shared/src=@sourcegraph/cody-shared/src --alias:lexical=./build/lexical-package-fix --format=cjs --platform=node --sourcemap",
17474
+ "_build:esbuild:node": "esbuild ./src/extension.node.ts --bundle --outfile=dist/extension.node.js --loader:.node=copy --external:vscode --external:typescript --alias:@sourcegraph/cody-shared=@sourcegraph/cody-shared/src/index --alias:@sourcegraph/cody-shared/src=@sourcegraph/cody-shared/src --alias:lexical=./build/lexical-package-fix --format=cjs --platform=node --sourcemap",
17437
17475
  "_build:esbuild:web": `esbuild ./src/extension.web.ts --platform=browser --bundle --outfile=dist/extension.web.js --alias:@sourcegraph/cody-shared=@sourcegraph/cody-shared/src/index --alias:@sourcegraph/cody-shared/src=@sourcegraph/cody-shared/src --alias:path=path-browserify --external:typescript --alias:node:path=path-browserify --alias:node:os=os-browserify --alias:os=os-browserify --external:vscode --external:node:child_process --external:node:util --external:node:fs --external:node:fs/promises --external:node:process --define:process='{"env":{}}' --define:window=self --format=cjs --sourcemap`,
17438
17476
  "_build:esbuild:uninstall": "node ./uninstall/esbuild.mjs",
17439
17477
  "_build:webviews": "vite -c webviews/vite.config.mts build",
@@ -17526,7 +17564,8 @@ const badges = [
17526
17564
  }
17527
17565
  ];
17528
17566
  const engines = {
17529
- vscode: "^1.79.0"
17567
+ vscode: "^1.79.0",
17568
+ node: ">=20.0.0"
17530
17569
  };
17531
17570
  const main = "./dist/extension.node.js";
17532
17571
  const browser$1 = "./dist/extension.web.js";
@@ -18021,16 +18060,6 @@ const contributes = {
18021
18060
  key: "alt+l",
18022
18061
  when: "!cody.activated"
18023
18062
  },
18024
- {
18025
- command: "cody.chat.new",
18026
- key: "shift+ctrl+/",
18027
- when: "cody.activated"
18028
- },
18029
- {
18030
- command: "cody.chat.new",
18031
- key: "shift+ctrl+l",
18032
- when: "cody.activated"
18033
- },
18034
18063
  {
18035
18064
  command: "cody.chat.toggle",
18036
18065
  key: "alt+l",
@@ -18073,6 +18102,16 @@ const contributes = {
18073
18102
  key: "shift+alt+/",
18074
18103
  when: "cody.activated && editorTextFocus && editorHasSelection"
18075
18104
  },
18105
+ {
18106
+ command: "cody.chat.new",
18107
+ key: "shift+alt+l",
18108
+ when: "cody.activated && !editorTextFocus"
18109
+ },
18110
+ {
18111
+ command: "cody.chat.new",
18112
+ key: "shift+alt+/",
18113
+ when: "cody.activated && !editorTextFocus"
18114
+ },
18076
18115
  {
18077
18116
  command: "cody.tutorial.chat",
18078
18117
  key: "alt+l",
@@ -18088,6 +18127,11 @@ const contributes = {
18088
18127
  key: "alt+tab",
18089
18128
  when: "cody.activated && !editorReadonly && config.cody.internal.unstable"
18090
18129
  },
18130
+ {
18131
+ command: "cody.command.execute-prompt",
18132
+ key: "shift+alt+p",
18133
+ when: "cody.activated"
18134
+ },
18091
18135
  {
18092
18136
  command: "cody.tutorial.edit",
18093
18137
  key: "alt+k",
@@ -18172,7 +18216,12 @@ const contributes = {
18172
18216
  {
18173
18217
  command: "cody.experimental.suggest",
18174
18218
  key: "ctrl+shift+enter",
18175
- when: "cody.activated"
18219
+ when: "cody.activated && config.cody.experimental.autoedits.enabled"
18220
+ },
18221
+ {
18222
+ command: "cody.supersuggest.testExample",
18223
+ key: "ctrl+alt+enter",
18224
+ when: "cody.activated && config.cody.experimental.autoedits.enabled"
18176
18225
  }
18177
18226
  ],
18178
18227
  submenus: [
@@ -18215,10 +18264,6 @@ const contributes = {
18215
18264
  command: "cody.command.abort-commit",
18216
18265
  when: "cody.activated && cody.isGeneratingCommit"
18217
18266
  },
18218
- {
18219
- command: "cody.menu.custom-commands",
18220
- when: "cody.activated"
18221
- },
18222
18267
  {
18223
18268
  command: "cody.chat.signIn",
18224
18269
  when: "!cody.activated"
@@ -18536,6 +18581,11 @@ const contributes = {
18536
18581
  type: "string",
18537
18582
  "default": ""
18538
18583
  },
18584
+ "cody.experimental.noxide.enabled": {
18585
+ order: 99,
18586
+ type: "boolean",
18587
+ "default": true
18588
+ },
18539
18589
  "cody.debug.verbose": {
18540
18590
  order: 99,
18541
18591
  type: "boolean",
@@ -18848,6 +18898,7 @@ const dependencies = {
18848
18898
  "@sentry/browser": "^7.107.0",
18849
18899
  "@sentry/core": "^7.107.0",
18850
18900
  "@sentry/node": "^7.107.0",
18901
+ "@sourcegraph/cody-noxide": "workspace:*",
18851
18902
  "@sourcegraph/cody-shared": "workspace:*",
18852
18903
  "@sourcegraph/prompt-editor": "workspace:*",
18853
18904
  "@sourcegraph/tree-sitter-wasms": "^0.1.9",
@@ -18871,13 +18922,14 @@ const dependencies = {
18871
18922
  glob: "^7.2.3",
18872
18923
  "graceful-fs": "^4.2.11",
18873
18924
  he: "^1.2.0",
18925
+ "highlight.js": "11.8.0",
18926
+ hpagent: "^1.2.0",
18874
18927
  "http-proxy-agent": "^7.0.2",
18875
18928
  "https-proxy-agent": "^7.0.5",
18876
18929
  ini: "^4.1.2",
18877
18930
  "js-levenshtein": "^1.1.6",
18878
18931
  lexical: "^0.17.0",
18879
18932
  lodash: "^4.17.21",
18880
- lowlight: "^3.1.0",
18881
18933
  "lru-cache": "^10.0.0",
18882
18934
  "lucide-react": "^0.378.0",
18883
18935
  "mac-ca": "^2.0.3",
@@ -18903,11 +18955,15 @@ const dependencies = {
18903
18955
  uuid: "^9.0.0",
18904
18956
  "vscode-languageserver-textdocument": "^1.0.8",
18905
18957
  "vscode-uri": "^3.0.8",
18906
- "wink-nlp-utils": "^2.1.0"
18958
+ "wink-nlp-utils": "^2.1.0",
18959
+ "fast-myers-diff": "^3.2.0"
18907
18960
  };
18908
18961
  const devDependencies = {
18909
18962
  "7zip-min": "^1.4.5",
18963
+ "@chialab/esbuild-plugin-html": "^0.18.2",
18964
+ "@commander-js/extra-typings": "^12.1.0",
18910
18965
  "@google-cloud/pubsub": "^3.7.3",
18966
+ "@jgoz/esbuild-plugin-typecheck": "^4.0.1",
18911
18967
  "@npmcli/promise-spawn": "^7.0.2",
18912
18968
  "@playwright/test": "1.47.2",
18913
18969
  "@pollyjs/adapter-node-http": "^6.0.6",
@@ -18943,14 +18999,25 @@ const devDependencies = {
18943
18999
  ajv: "^8.14.0",
18944
19000
  "ajv-formats": "^3.0.1",
18945
19001
  "buildkite-test-collector": "^1.7.2",
19002
+ chokidar: "^3.6.0",
19003
+ commander: "^11.1.0",
18946
19004
  concurrently: "^8.2.0",
18947
19005
  dedent: "^0.7.0",
18948
19006
  dotenv: "^16.4.5",
19007
+ esbuild: "^0.18.20",
19008
+ "esbuild-node-externals": "^1.14.0",
19009
+ "esbuild-plugin-copy": "^2.1.1",
19010
+ "esbuild-plugin-svgr": "^2.1.0",
19011
+ "esbuild-plugin-tsc": "^0.4.0",
19012
+ "esbuild-plugin-wasm": "^1.1.0",
19013
+ "esbuild-style-plugin": "^1.6.3",
19014
+ "esbuild-visualizer": "^0.6.0",
18949
19015
  express: "^4.18.2",
18950
19016
  "fast-json-stable-stringify": "^2.1.0",
18951
19017
  "franc-min": "^6.2.0",
18952
19018
  "fs-extra": "^11.2.0",
18953
19019
  fuzzysort: "^2.0.4",
19020
+ htmlnano: "^2.1.1",
18954
19021
  "http-proxy-middleware": "^3.0.0",
18955
19022
  immer: "^10.1.1",
18956
19023
  keytar: "^7.9.0",
@@ -18966,6 +19033,7 @@ const devDependencies = {
18966
19033
  postcss: "^8.4.38",
18967
19034
  "postcss-nested": "^6.0.1",
18968
19035
  "react-head": "^3.4.2",
19036
+ "rollup-plugin-visualizer": "^5.12.0",
18969
19037
  "symlink-dir": "^6.0.2",
18970
19038
  "type-fest": "^4.26.1",
18971
19039
  "typescript-language-server": "^4.3.3",
@@ -19112,18 +19180,24 @@ class AgentWorkspaceConfiguration {
19112
19180
  }
19113
19181
  }
19114
19182
  };
19183
+ function mergeWithBaseConfig(config22) {
19184
+ for (const [key, value] of Object.entries(config22)) {
19185
+ if (typeof value === "object") {
19186
+ const existing = _.get(baseConfig, key) ?? {};
19187
+ const merged = _.merge(existing, value);
19188
+ _.set(baseConfig, key, merged);
19189
+ } else {
19190
+ _.set(baseConfig, key, value);
19191
+ }
19192
+ }
19193
+ }
19115
19194
  const customConfiguration = config2 == null ? void 0 : config2.customConfiguration;
19116
19195
  if (customConfiguration) {
19117
- for (const [key, value] of Object.entries(customConfiguration)) {
19118
- _.set(baseConfig, key, value);
19119
- }
19196
+ mergeWithBaseConfig(customConfiguration);
19120
19197
  }
19121
19198
  const fromCustomConfigurationJson = config2 == null ? void 0 : config2.customConfigurationJson;
19122
19199
  if (fromCustomConfigurationJson) {
19123
- const configJson = JSON.parse(fromCustomConfigurationJson);
19124
- for (const [key, value] of Object.entries(configJson)) {
19125
- _.set(baseConfig, key, value);
19126
- }
19200
+ mergeWithBaseConfig(JSON.parse(fromCustomConfigurationJson));
19127
19201
  }
19128
19202
  const fromBaseConfig = _.get(baseConfig, section);
19129
19203
  const fromDict = _.get(this.dictionary, section);
@@ -22872,8 +22946,17 @@ function getConfiguration(config2 = workspace.getConfiguration()) {
22872
22946
  experimentalNoodle: getHiddenSetting("experimental.noodle", false),
22873
22947
  experimentalTracing: getHiddenSetting("experimental.tracing", false),
22874
22948
  experimentalSupercompletions: getHiddenSetting("experimental.supercompletions", false),
22875
- experimentalAutoedits: getHiddenSetting("experimental.autoedit", void 0),
22949
+ experimentalAutoeditsEnabled: getHiddenSetting("experimental.autoedits.enabled", void 0),
22950
+ experimentalAutoeditsConfigOverride: getHiddenSetting(
22951
+ "experimental.autoedits.config.override",
22952
+ void 0
22953
+ ),
22954
+ experimentalAutoeditsRendererTesting: getHiddenSetting(
22955
+ "experimental.autoedits-renderer-testing",
22956
+ false
22957
+ ),
22876
22958
  experimentalMinionAnthropicKey: getHiddenSetting("experimental.minion.anthropicKey", void 0),
22959
+ experimentalNoxideEnabled: getHiddenSetting("experimental.noxide.enabled", true),
22877
22960
  experimentalGuardrailsTimeoutSeconds: getHiddenSetting("experimental.guardrailsTimeoutSeconds"),
22878
22961
  autocompleteExperimentalOllamaOptions: getHiddenSetting(
22879
22962
  "autocomplete.experimental.ollamaOptions",
@@ -42085,6 +42168,10 @@ function lastNLines(text, n) {
42085
42168
  const lines2 = text.split("\n");
42086
42169
  return lines2.slice(Math.max(0, lines2.length - n)).join("\n");
42087
42170
  }
42171
+ function getNewLineChar(existingText) {
42172
+ const match2 = existingText.match(/\r\n|\n/);
42173
+ return match2 ? match2[0] : "\n";
42174
+ }
42088
42175
  function endsWithBlockStart(text, languageId) {
42089
42176
  var _a3;
42090
42177
  const blockStart = (_a3 = getLanguageConfig(languageId)) == null ? void 0 : _a3.blockStart;
@@ -44446,7 +44533,7 @@ class AgentTextEditor {
44446
44533
  }
44447
44534
  var bin$1 = {};
44448
44535
  Object.defineProperty(bin$1, "__esModule", { value: true });
44449
- var calcSlices_1 = bin$1.calcSlices = applyPatch_1 = bin$1.applyPatch = calcPatch_1 = bin$1.calcPatch = bin$1.lcs = bin$1.diff = bin$1.diff_core = void 0;
44536
+ var calcSlices_1 = bin$1.calcSlices = applyPatch_1 = bin$1.applyPatch = calcPatch_1 = bin$1.calcPatch = bin$1.lcs = diff_1 = bin$1.diff = bin$1.diff_core = void 0;
44450
44537
  function diff_internal(state2, c) {
44451
44538
  const { b, eq: eq2, stack_base } = state2;
44452
44539
  let { i, N, j, M, Z, stack_top } = state2;
@@ -44624,7 +44711,7 @@ function diff(xs, ys, eq2) {
44624
44711
  }
44625
44712
  return diff_core(i, N + 1 - i, i, M + 1 - i, eq2);
44626
44713
  }
44627
- bin$1.diff = diff;
44714
+ var diff_1 = bin$1.diff = diff;
44628
44715
  class LCSGen {
44629
44716
  constructor(diff2, N) {
44630
44717
  this.diff = diff2;
@@ -48989,7 +49076,7 @@ class CommandsProvider {
48989
49076
  if (!isFileURI(uri2)) {
48990
49077
  throw new Error("history only supported on local file paths");
48991
49078
  }
48992
- const { getContextFileFromGitLog } = await import("./git-log-DysZuS3e.mjs");
49079
+ const { getContextFileFromGitLog } = await import("./git-log-B1KSeH79.mjs");
48993
49080
  return getContextFileFromGitLog(uri2, options);
48994
49081
  }
48995
49082
  dispose() {
@@ -49234,8 +49321,40 @@ function fuseResults(retrievedSets, rankingIdentities) {
49234
49321
  }
49235
49322
  return fusedResults;
49236
49323
  }
49324
+ var ContextRankingStrategy = /* @__PURE__ */ ((ContextRankingStrategy2) => {
49325
+ ContextRankingStrategy2["Default"] = "default";
49326
+ ContextRankingStrategy2["NoRanker"] = "no-ranker";
49327
+ ContextRankingStrategy2["TimeBased"] = "time-based";
49328
+ return ContextRankingStrategy2;
49329
+ })(ContextRankingStrategy || {});
49237
49330
  class DefaultCompletionsContextRanker {
49331
+ constructor(contextRankingStrategy) {
49332
+ this.contextRankingStrategy = contextRankingStrategy;
49333
+ }
49238
49334
  rankAndFuseContext(results) {
49335
+ switch (this.contextRankingStrategy) {
49336
+ case "no-ranker":
49337
+ return this.getContextSnippetsAsPerNoRankerStrategy(results);
49338
+ case "time-based":
49339
+ return this.getContextSnippetsAsPerTimeBasedStrategy(results);
49340
+ default:
49341
+ return this.getContextSnippetsAsPerDefaultStrategy(results);
49342
+ }
49343
+ }
49344
+ getContextSnippetsAsPerTimeBasedStrategy(results) {
49345
+ const snippets = results.flatMap((r2) => [...r2.snippets]).sort((a, b) => {
49346
+ var _a3, _b2;
49347
+ const aTime = ((_a3 = a.metadata) == null ? void 0 : _a3.timeSinceActionMs) ?? Number.POSITIVE_INFINITY;
49348
+ const bTime = ((_b2 = b.metadata) == null ? void 0 : _b2.timeSinceActionMs) ?? Number.POSITIVE_INFINITY;
49349
+ return aTime - bTime;
49350
+ });
49351
+ return new Set(snippets);
49352
+ }
49353
+ getContextSnippetsAsPerNoRankerStrategy(results) {
49354
+ const snippets = results.flatMap((r2) => [...r2.snippets]);
49355
+ return new Set(snippets);
49356
+ }
49357
+ getContextSnippetsAsPerDefaultStrategy(results) {
49239
49358
  if (this.containsRecentEditsBasedContext(results)) {
49240
49359
  return this.getRecentEditsBasedContextFusion(results);
49241
49360
  }
@@ -147700,8 +147819,8 @@ exceptions$2.guttae = gutta, exceptions$2.gymnasia = gymnasium, exceptions$2.gyn
147700
147819
  exceptions$2.sera = serum, exceptions$2.seraphim = seraph, exceptions$2.sestertia = sestertium, exceptions$2.setae = seta, exceptions$2.sgraffiti = sgraffito, exceptions$2.shabbasim = shabbas, exceptions$2.shabbatim = shabbat, exceptions$2.shackoes = shacko, exceptions$2.shadchanim = shadchan, exceptions$2.shadchans = shadchan, exceptions$2.shakoes = shako, exceptions$2.shammosim = shammes, exceptions$2.sheatfishes = sheatfish, exceptions$2.sheaves = sheaf, exceptions$2.shellfishes = shellfish, exceptions$2.shelves = shelf, exceptions$2.shinleaves = shinleaf, exceptions$2.shittim = shittah, exceptions$2.shmoes = shmo, exceptions$2.shofroth = shophar, exceptions$2.shophroth = shophar, exceptions$2.shrewmice = shrewmouse, exceptions$2.shuln = shul, exceptions$2.siddurim = siddur, exceptions$2.sigloi = siglos, exceptions$2.signore = signora, exceptions$2.signori = signore, exceptions$2.signorine = signorina, exceptions$2.siliquae = siliqua, exceptions$2.silvae = silva, exceptions$2.silverfishes = silverfish, exceptions$2.simulacra = simulacrum, exceptions$2.sincipita = sinciput, exceptions$2.sinfonie = sinfonia, exceptions$2.sistra = sistrum, exceptions$2.situlae = situla, exceptions$2.smalti = smalto, exceptions$2.snaggleteeth = snaggletooth, exceptions$2.snailfishes = snailfish, exceptions$2.snipefishes = snipefish, exceptions$2.socmen = socman, exceptions$2.sola = solum, exceptions$2.solaria = solarium, exceptions$2.solatia = solatium, exceptions$2.soldi = soldo, exceptions$2.soles = sol, exceptions$2.solfeggi = solfeggio, exceptions$2.soli = solo, exceptions$2.solidi = solidus, exceptions$2.somata = soma, exceptions$2.soprani = soprano, exceptions$2.sordini = sordino, exceptions$2.sori = sorus, exceptions$2.soroses = sorosis, exceptions$2.sovkhozy = sovkhoz, exceptions$2.spadefishes = spadefish, exceptions$2.spadices = spadix, exceptions$2.spearfishes = spearfish, exceptions$2.spectra = spectrum, exceptions$2.specula = speculum, exceptions$2.spermatia = spermatium, exceptions$2.spermatogonia = spermatogonium, exceptions$2.spermatozoa = spermatozoon, exceptions$2.spermogonia = spermogonium, exceptions$2.sphinges = sphinx, exceptions$2.spicae = spica, exceptions$2.spicula = spiculum, exceptions$2.spirilla = spirillum, exceptions$2.splayfeet = splayfoot, exceptions$2.splenii = splenius, exceptions$2.sporangia = sporangium, exceptions$2.sporogonia = sporogonium, exceptions$2.sporozoa = sporozoan, exceptions$2.springhase = springhaas, exceptions$2.spumoni = spumone, exceptions$2.sputa = sputum, exceptions$2.squamae = squama, exceptions$2.squashes = squash, exceptions$2.squillae = squilla, exceptions$2.squirrelfishes = squirrelfish, exceptions$2.squizzes = squiz, exceptions$2.stadia = stadium, exceptions$2.stamina = stamen, exceptions$2.staminodia = staminodium, exceptions$2.stapedes = stapes, exceptions$2.staphylococci = staphylococcus, exceptions$2.staretsy = starets, exceptions$2.starfishes = starfish, exceptions$2.startsy = starets, exceptions$2.stelae = stele, exceptions$2.stemmata = stemma, exceptions$2.stenoses = stenosis, exceptions$2.stepchildren = stepchild, exceptions$2.sterna = sternum, exceptions$2.stigmata = stigma, exceptions$2.stimuli = stimulus, exceptions$2.stipites = stipes, exceptions$2.stirpes = stirps, exceptions$2.stoae = stoa, exceptions$2.stockfishes = stockfish, exceptions$2.stomata = stoma, exceptions$2.stomodaea = stomodaeum, exceptions$2.stomodea = stomodeum, exceptions$2.stonefishes = stonefish, exceptions$2.stotinki = stotinka, exceptions$2.stotkini = stotinka, exceptions$2.strappadoes = strappado, exceptions$2.strata = stratum, exceptions$2.strati = stratus, exceptions$2.stratocumuli = stratocumulus, exceptions$2.streptococci = streptococcus, exceptions$2.stretti = stretto, exceptions$2.striae = stria, exceptions$2.strobili = strobilus, exceptions$2.stromata = stroma, exceptions$2.strumae = struma, exceptions$2.stuccoes = stucco, exceptions$2.styli = stylus, exceptions$2.stylopes = stylops, exceptions$2.stylopodia = stylopodium, exceptions$2.subcortices = subcortex, exceptions$2.subdeliria = subdelirium, exceptions$2.subgenera = subgenus, exceptions$2.subindices = subindex, exceptions$2.submucosae = submucosa, exceptions$2.subphyla = subphylum, exceptions$2.substrasta = substratum, exceptions$2.succedanea = succedaneum, exceptions$2.succubi = succubus, exceptions$2.suckerfishes = suckerfish, exceptions$2.suckfishes = suckfish, exceptions$2.sudaria = sudarium, exceptions$2.sudatoria = sudatorium, exceptions$2.sudatoria = sudatorium, exceptions$2.sulci = sulcus, exceptions$2.summae = summa, exceptions$2.sunfishes = sunfish, exceptions$2.supercargoes = supercargo, exceptions$2.superheroes = superhero, exceptions$2.supernovae = supernova, exceptions$2.superstrata = superstratum, exceptions$2.surgeonfishes = surgeonfish, exceptions$2.swamies = swami, exceptions$2.sweetiewives = sweetiewife, exceptions$2.swellfishes = swellfish, exceptions$2.swordfishes = swordfish, exceptions$2.syconia = syconium, exceptions$2.syllabi = syllabus, exceptions$2.syllepses = syllepsis, exceptions$2.symphyses = symphysis, exceptions$2.sympodia = sympodium, exceptions$2.symposia = symposium, exceptions$2.synapses = synapsis, exceptions$2.synarthroses = synarthrosis, exceptions$2.synclinoria = synclinorium, exceptions$2.syncytia = syncytium, exceptions$2.syndesmoses = syndesmosis, exceptions$2.synopses = synopsis, exceptions$2.syntagmata = syntagma, exceptions$2.syntheses = synthesis, exceptions$2.syphilomata = syphiloma, exceptions$2.syringes = syrinx, exceptions$2.syssarcoses = syssarcosis, exceptions$2.tableaux = tableau, exceptions$2.taeniae = taenia, exceptions$2.tali = talus, exceptions$2.tallaisim = tallith, exceptions$2.tallithes = tallith, exceptions$2.tallitoth = tallith, exceptions$2.tapeta = tapetum, exceptions$2.tarantulae = tarantula, exceptions$2.tarsi = tarsus, exceptions$2.tarsometatarsi = tarsometatarsus, exceptions$2.taxa = taxon, exceptions$2.taxes = tax, exceptions$2.taxies = taxi$1, exceptions$2.tectrices = tectrix, exceptions$2.teeth = tooth, exceptions$2.tegmina = tegmen, exceptions$2.telae = tela, exceptions$2.telamones = telamon, exceptions$2.telangiectases = telangiectasia, exceptions$2.telia = telium, exceptions$2.tempi = tempo, exceptions$2.tenacula = tenaculum, exceptions$2.tenderfeet = tenderfoot, exceptions$2.teniae = tenia, exceptions$2.tenues = tenuis, exceptions$2.teraphim = teraph, exceptions$2.terata = teras, exceptions$2.teredines = teredo, exceptions$2.terga = tergum, exceptions$2.termini = terminus, exceptions$2.terraria = terrarium, exceptions$2.terzetti = terzetto, exceptions$2.tesserae = tessera, exceptions$2.testae = testa, exceptions$2.testes = testis, exceptions$2.testudines = testudo, exceptions$2.tetrahedra = tetrahedron, exceptions$2.tetraskelia = tetraskelion, exceptions$2.thalamencephala = thalamencephalon, exceptions$2.thalami = thalamus, exceptions$2.thalli = thallus, exceptions$2.thecae = theca, exceptions$2.therses = thyrse, exceptions$2.thesauri = thesaurus, exceptions$2.theses = thesis, exceptions$2.thickleaves = thickleaf, exceptions$2.thieves = thief, exceptions$2.tholoi = tholos, exceptions$2.thoraces = thorax, exceptions$2.thrombi = thrombus, exceptions$2.thymi = thymus, exceptions$2.thyrsi = thyrsus, exceptions$2.tibiae = tibia, exceptions$2.tilefishes = tilefish, exceptions$2.tintinnabula = tintinnabulum, exceptions$2.titmice = titmouse, exceptions$2.toadfishes = toadfish, exceptions$2.tobaccoes = tobacco, exceptions$2.tomatoes = tomato, exceptions$2.tomenta = tomentum, exceptions$2.tondi = tondo, exceptions$2.tonneaux = tonneau, exceptions$2.tophi = tophus, exceptions$2.topoi = topos, exceptions$2.tori = torus, exceptions$2.tornadoes = tornado, exceptions$2.torpedoes = torpedo, exceptions$2.torsi = torso, exceptions$2.touracos = touraco, exceptions$2.trabeculae = trabecula, exceptions$2.tracheae = trachea, exceptions$2.traditores = traditor, exceptions$2.tragi = tragus, exceptions$2.trapezia = trapezium, exceptions$2.trapezohedra = trapezohedron, exceptions$2.traumata = trauma, exceptions$2.treponemata = treponema, exceptions$2.trichinae = trichina, exceptions$2.triclinia = triclinium, exceptions$2.triennia = triennium, exceptions$2.triforia = triforium, exceptions$2.triggerfishes = triggerfish, exceptions$2.trihedra = trihedron, exceptions$2.triskelia = triskelion, exceptions$2.trisoctahedra = trisoctahedron, exceptions$2.triumviri = triumvir, exceptions$2.trivia = trivium, exceptions$2.trochleae = trochlea, exceptions$2.tropaeola = tropaeolum, exceptions$2.trousseaux = trousseau, exceptions$2.trunkfishes = trunkfish, exceptions$2.trymata = tryma, exceptions$2.tubae = tuba, exceptions$2.turves = turf, exceptions$2.tympana = tympanum, exceptions$2.tyros = tyro, exceptions$2.ubermenschen = ubermensch, exceptions$2.uglies = ugli, exceptions$2.uigurs = uighur, exceptions$2.ulnae = ulna, exceptions$2.ultimata = ultimatum, exceptions$2.umbilici = umbilicus, exceptions$2.umbones = umbo, exceptions$2.umbrae = umbra, exceptions$2.unci = uncus, exceptions$2.uncidia = uredium, exceptions$2.uredines = uredo, exceptions$2.uredinia = uredinium, exceptions$2.uredosori = uredosorus, exceptions$2.urethrae = urethra, exceptions$2.urinalyses = urinalysis, exceptions$2.uteri = uterus, exceptions$2.utriculi = utriculus, exceptions$2.uvulae = uvula, exceptions$2.vacua = vacuum, exceptions$2.vagi = vagus, exceptions$2.vaginae = vagina, exceptions$2.valleculae = vallecula, exceptions$2.vaporetti = vaporetto, exceptions$2.varices = varix, exceptions$2.vasa = vas, exceptions$2.vascula = vasculum, exceptions$2.vela = velum, exceptions$2.velamina = velamen, exceptions$2.velaria = velarium, exceptions$2.venae = vena, exceptions$2.ventriculi = ventriculus, exceptions$2.vermes = vermis, exceptions$2.verrucae = verruca, exceptions$2.vertebrae = vertebra, exceptions$2.vertices = vertex, exceptions$2.vertigines = vertigo, exceptions$2.vertigoes = vertigo, exceptions$2.vesicae = vesica, exceptions$2.vetoes = veto, exceptions$2.vexilla = vexillum, exceptions$2.viatica = viaticum, exceptions$2.viatores = viator, exceptions$2.vibracula = vibraculum, exceptions$2.vibrissae = vibrissa, exceptions$2.villi = villus, exceptions$2.vimina = vimen, exceptions$2.vincula = vinculum, exceptions$2.viragoes = virago, exceptions$2.vires = vis, exceptions$2.virtuosi = virtuoso, exceptions$2.vitae = vita, exceptions$2.vitelli = vitellus, exceptions$2.vittae = vitta, exceptions$2.vivaria = vivarium, exceptions$2.voces = vox, exceptions$2.volcanoes = volcano, exceptions$2.volkslieder = volkslied, exceptions$2.volte = volta, exceptions$2.volvae = volva, exceptions$2.vorticellae = vorticella, exceptions$2.vortices = vortex, exceptions$2.vulvae = vulva, exceptions$2.wahhabis = wahhabi, exceptions$2.wanderjahre = wanderjahr, exceptions$2.weakfishes = weakfish, exceptions$2.werewolves = werewolf, exceptions$2.wharves = wharf, exceptions$2.whitefishes = whitefish, exceptions$2.wives = wife, exceptions$2.wolffishes = wolffish, exceptions$2.wolves = wolf, exceptions$2.women = woman, exceptions$2.woodlice = woodlouse, exceptions$2.wreckfishes = wreckfish, exceptions$2.wunderkinder = wunderkind, exceptions$2.xiphisterna = xiphisternum, exceptions$2.yeshivahs = yeshiva, exceptions$2.yeshivoth = yeshiva, exceptions$2.yogin = yogi, exceptions$2.yourselves = yourself, exceptions$2.zamindaris = zamindari, exceptions$2.zecchini = zecchino, exceptions$2.zeroes = zero, exceptions$2.zoa = zoon, exceptions$2.zoaeae = zoaea, exceptions$2.zoeae = zoea, exceptions$2.zoeas = zoaea, exceptions$2.zoonoses = zoonosis, wnNounExceptions.exports = exceptions$2;
147701
147820
  var wnNounExceptionsExports = wnNounExceptions.exports;
147702
147821
  var wnVerbExceptions = { exports: {} };
147703
- const exceptions$1 = /* @__PURE__ */ Object.create(null), abet = "abet", abhor = "abhor", abide = "abide", aby = "aby", abut = "abut", accompany = "accompany", acetify = "acetify", acidify = "acidify", acquit = "acquit", address = "address", admit = "admit", aerify = "aerify", airdrop = "airdrop", alkalify = "alkalify", ally = "ally", allot = "allot", be = "be", ammonify = "ammonify", amnesty = "amnesty", amplify = "amplify", anglify = "anglify", annul = "annul", appal = "appal", apply = "apply", arc = "arc", argufy = "argufy", arise = "arise", eat = "eat", atrophy = "atrophy", aver = "aver", awake = "awake", baby = "baby", backbite = "backbite", backslide = "backslide", bid = "bid", bag = "bag", ballyrag = "ballyrag", bandy = "bandy", ban = "ban", bar = "bar", barrel = "barrel", basify = "basify", bat = "bat", bayonet = "bayonet", beat = "beat", beatify = "beatify", beautify = "beautify", become = "become", bed = "bed", bedevil = "bedevil", bedim = "bedim", befall = "befall", befit = "befit", befog = "befog", begin = "begin", beget = "beget", beg = "beg", begird = "begird", behold = "behold", bejewel = "bejewel", belly = "belly", belie = "belie", benefit = "benefit", bename = "bename", bend = "bend", berry = "berry", beset = "beset", beseech = "beseech", bespeak = "bespeak", bestir = "bestir", bestrew = "bestrew", bestride = "bestride", betake = "betake", bethink = "bethink", bet = "bet", bevel = "bevel", bias = "bias", bing = "bing", bin = "bin", bite = "bite", bit = "bit", bivouac = "bivouac", blab = "blab", blackberry = "blackberry", blackleg = "blackleg", blat = "blat", bleed = "bleed", bless = "bless", blow = "blow", blip = "blip", blob = "blob", bloody = "bloody", blot = "blot", blub = "blub", blur = "blur", bob = "bob", body = "body", bootleg = "bootleg", bop = "bop", bear = "bear", buy = "buy", bind = "bind", brag = "brag", breed = "breed", brevet = "brevet", brim = "brim", break1 = "break", bring = "bring", browbeat = "browbeat", brutify = "brutify", bud = "bud", bug = "bug", build = "build", bulldog = "bulldog", bully = "bully", bullshit = "bullshit", bullwhip = "bullwhip", bullyrag = "bullyrag", bum = "bum", bury = "bury", burn = "burn", bur = "bur", bushel = "bushel", busy = "busy", bypass = "bypass", cabal = "cabal", caddy = "caddy", calcify = "calcify", come = "come", canal = "canal", cancel = "cancel", candy = "candy", can = "can", canopy = "canopy", cap = "cap", carburet = "carburet", carillon = "carillon", carny = "carny", carnify = "carnify", carol = "carol", carry = "carry", casefy = "casefy", catnap = "catnap", cat = "cat", catch1 = "catch", cavil = "cavil", certify = "certify", channel = "channel", chap = "chap", char = "char", chat = "chat", chivy = "chivy", chide = "chide", chin = "chin", chip = "chip", chisel = "chisel", chitchat = "chitchat", chiv = "chiv", chondrify = "chondrify", chop = "chop", choose = "choose", chug = "chug", chum = "chum", citify = "citify", clothe = "clothe", clad = "clad", clam = "clam", clap = "clap", clarify = "clarify", classify = "classify", cleave = "cleave", clem = "clem", clepe = "clepe", clip = "clip", clog = "clog", clop = "clop", clot = "clot", club = "club", cling = "cling", cockneyfy = "cockneyfy", cod = "cod", codify = "codify", cog = "cog", coif = "coif", colly = "colly", combat = "combat", commit = "commit", compel = "compel", comply = "comply", complot = "complot", concur = "concur", confab = "confab", confer = "confer", con = "con", control = "control", copy = "copy", cop = "cop", coquet = "coquet", corral = "corral", counsel = "counsel", counterplot = "counterplot", countersink = "countersink", crab = "crab", cram = "cram", crap = "crap", creep = "creep", crib = "crib", cry = "cry", crop = "crop", crossbreed = "crossbreed", crosscut = "crosscut", crucify = "crucify", cub = "cub", cudgel = "cudgel", cupel = "cupel", cup = "cup", curet = "curet", curry = "curry", curse = "curse", curtsy = "curtsy", curvet = "curvet", cut = "cut", dab = "dab", dag = "dag", dally = "dally", dam = "dam", damnify = "damnify", dandify = "dandify", dap = "dap", deal = "deal", debar = "debar", debug = "debug", debus = "debus", decalcify = "decalcify", declassify = "declassify", decontrol = "decontrol", decry = "decry", defer = "defer", defy = "defy", degas = "degas", dehumidify = "dehumidify", deify = "deify", demit = "demit", demob = "demob", demulsify = "demulsify", demur = "demur", demystify = "demystify", denazify = "denazify", deny = "deny", denitrify = "denitrify", den = "den", descry = "descry", deter = "deter", detoxify = "detoxify", devil = "devil", devitrify = "devitrify", diagram = "diagram", dial = "dial", dib = "dib", do1 = "do", dig = "dig", dignify = "dignify", dim = "dim", din = "din", dip = "dip", dirty = "dirty", disannul = "disannul", disbar = "disbar", disbud = "disbud", disembody = "disembody", disembowel = "disembowel", disenthral = "disenthral", disenthrall = "disenthrall", dishevel = "dishevel", disinter = "disinter", dispel = "dispel", disqualify = "disqualify", dissatisfy = "dissatisfy", distil = "distil", diversify = "diversify", divvy = "divvy", dizzy = "dizzy", dog = "dog", dogleg = "dogleg", dolly = "dolly", don = "don", dot = "dot", dow = "dow", dive = "dive", drab = "drab", drag = "drag", drink = "drink", draw = "draw", dream = "dream", dry = "dry", drip = "drip", drivel = "drivel", drive = "drive", drop = "drop", drub = "drub", drug = "drug", drum = "drum", dub = "dub", duel = "duel", dulcify = "dulcify", dummy = "dummy", dun = "dun", dwell = "dwell", die = "die", easy = "easy", eavesdrop = "eavesdrop", eddy = "eddy", edify = "edify", electrify = "electrify", embed = "embed", embody = "embody", embus = "embus", emit = "emit", empanel = "empanel", empty = "empty", emulsify = "emulsify", enamel = "enamel", englut = "englut", enrol = "enrol", enthral = "enthral", entrammel = "entrammel", entrap = "entrap", envy = "envy", enwind = "enwind", enwrap = "enwrap", equal = "equal", equip = "equip", espy = "espy", esterify = "esterify", estop = "estop", etherify = "etherify", excel = "excel", exemplify = "exemplify", expel = "expel", extol = "extol", facet = "facet", fag = "fag", fall = "fall", falsify = "falsify", fancy = "fancy", fan = "fan", fantasy = "fantasy", fat = "fat", featherbed = "featherbed", feed = "feed", feel = "feel", ferry = "ferry", fib = "fib", fig = "fig", fin = "fin", fit = "fit", flag = "flag", flam = "flam", flannel = "flannel", flap = "flap", flat = "flat", flee = "flee", fly = "fly", flimflam = "flimflam", flip = "flip", flit = "flit", flog = "flog", floodlight = "floodlight", flop = "flop", flub = "flub", fling = "fling", flurry = "flurry", flyblow = "flyblow", fob = "fob", fog = "fog", footslog = "footslog", forbid = "forbid", forbear = "forbear", fordo = "fordo", foredo = "foredo", forego = "forego", foreknow = "foreknow", forerun = "forerun", foresee = "foresee", foreshow = "foreshow", forespeak = "forespeak", foretell = "foretell", forgive = "forgive", forget = "forget", forgo = "forgo", format = "format", forsake = "forsake", forspeak = "forspeak", forswear = "forswear", fortify = "fortify", fight = "fight", find = "find", foxtrot = "foxtrot", frap = "frap", frenchify = "frenchify", frenzy = "frenzy", fret = "fret", fry = "fry", frig = "frig", frit = "frit", frivol = "frivol", frog = "frog", frolic = "frolic", freeze = "freeze", fructify = "fructify", fuel = "fuel", fulfil = "fulfil", fun = "fun", funnel = "funnel", fur = "fur", gad = "gad", gag = "gag", gainsay = "gainsay", gambol = "gambol", gam = "gam", gin = "gin", gan = "gan", gap = "gap", gasify = "gasify", gas = "gas", give = "give", gel = "gel", geld = "geld", gem = "gem", get = "get", ghostwrite = "ghostwrite", gib = "gib", giddy = "giddy", giftwrap = "giftwrap", gig = "gig", gild = "gild", gip = "gip", gird = "gird", glom = "glom", glory = "glory", glorify = "glorify", glut = "glut", gnaw = "gnaw", golly = "golly", go = "go", grab = "grab", gratify = "gratify", gravel = "gravel", grave = "grave", grow = "grow", grin = "grin", grip = "grip", grit = "grit", grind = "grind", grovel = "grovel", grub = "grub", guaranty = "guaranty", gully = "gully", gum = "gum", gun = "gun", gyp = "gyp", hacksaw = "hacksaw", have = "have", ham = "ham", hamstring = "hamstring", handfeed = "handfeed", handicap = "handicap", handsel = "handsel", harry = "harry", hatchel = "hatchel", hat = "hat", hear = "hear", hedgehop = "hedgehop", hold = "hold", hem = "hem", hew = "hew", hiccup = "hiccup", hide = "hide", hinny = "hinny", hit = "hit", hob = "hob", hobnob = "hobnob", hocus = "hocus", hog = "hog", hogtie = "hogtie", honey = "honey", hop = "hop", horrify = "horrify", horsewhip = "horsewhip", housel = "housel", heave = "heave", hovel = "hovel", hug = "hug", humbug = "humbug", humidify = "humidify", hum = "hum", hang = "hang", hurry = "hurry", hypertrophy = "hypertrophy", identify = "identify", imbed = "imbed", impanel = "impanel", impel = "impel", imply = "imply", inbreed = "inbreed", incur = "incur", indemnify = "indemnify", indwell = "indwell", infer = "infer", initial = "initial", inlay = "inlay", inset = "inset", inspan = "inspan", install = "install", intensify = "intensify", interbreed = "interbreed", intercrop = "intercrop", intercut = "intercut", interlay = "interlay", interlap = "interlap", intermarry = "intermarry", intermit = "intermit", interplead = "interplead", inter = "inter", interstratify = "interstratify", interweave = "interweave", intromit = "intromit", inweave = "inweave", inwrap = "inwrap", jab = "jab", jag = "jag", jam = "jam", japan = "japan", jar = "jar", jelly = "jelly", jellify = "jellify", jemmy = "jemmy", jet = "jet", jewel = "jewel", jib = "jib", jig = "jig", jimmy = "jimmy", jitterbug = "jitterbug", job = "job", jog = "jog", jolly = "jolly", jollify = "jollify", jot = "jot", joypop = "joypop", jug = "jug", justify = "justify", jut = "jut", ken = "ken", kennel = "kennel", keep = "keep", kernel = "kernel", kid = "kid", kidnap = "kidnap", kip = "kip", knap = "knap", kneecap = "kneecap", kneel = "kneel", know = "know", knit = "knit", knob = "knob", knot = "knot", label = "label", lade = "lade", ladify = "ladify", lag = "lag", lay = "lay", lie = "lie", lallygag = "lallygag", lam = "lam", lapidify = "lapidify", lap = "lap", laurel = "laurel", lean = "lean", leapfrog = "leapfrog", leap = "leap", learn = "learn", lead = "lead", leave = "leave", lend = "lend", let1 = "let", level = "level", levy = "levy", libel = "libel", lignify = "lignify", lip = "lip", liquefy = "liquefy", liquify = "liquify", light = "light", lob = "lob", lobby = "lobby", log$1 = "log", lop = "lop", lose = "lose", lot = "lot", lug = "lug", lullaby = "lullaby", mad = "mad", make = "make", magnify = "magnify", man = "man", manumit = "manumit", map = "map", marcel = "marcel", mar = "mar", marry = "marry", marshal = "marshal", marvel = "marvel", mat = "mat", mean = "mean", medal = "medal", meet = "meet", metal = "metal", metrify = "metrify", may = "may", mimic = "mimic", minify = "minify", misapply = "misapply", misbecome = "misbecome", miscarry = "miscarry", misdeal = "misdeal", misfit = "misfit", misgive = "misgive", mishit = "mishit", mislay = "mislay", mislead = "mislead", misplead = "misplead", misspell = "misspell", misspend = "misspend", mistake = "mistake", misunderstand = "misunderstand", mob = "mob", model$3 = "model", modify = "modify", mollify = "mollify", melt = "melt", mop = "mop", mortify = "mortify", mow = "mow", mud = "mud", muddy = "muddy", mug = "mug", multiply = "multiply", mum = "mum", mummify = "mummify", mutiny = "mutiny", mystify = "mystify", nab = "nab", nag = "nag", nap = "nap", net = "net", nib = "nib", nickel = "nickel", nidify = "nidify", nigrify = "nigrify", nip = "nip", nitrify = "nitrify", nod = "nod", nonplus = "nonplus", notify = "notify", nullify = "nullify", nut = "nut", objectify = "objectify", occupy = "occupy", occur = "occur", offset = "offset", omit = "omit", ossify = "ossify", outbid = "outbid", outbreed = "outbreed", outcry = "outcry", outcrop = "outcrop", outdo = "outdo", outdraw = "outdraw", outfit = "outfit", outfight = "outfight", outgas = "outgas", outgeneral = "outgeneral", outgo = "outgo", outgrow = "outgrow", outlay = "outlay", outman = "outman", output = "output", outrun = "outrun", outride = "outride", outshine = "outshine", outshoot = "outshoot", outsell = "outsell", outspan = "outspan", outstand = "outstand", outstrip = "outstrip", outthink = "outthink", outwit = "outwit", outwear = "outwear", overbid = "overbid", overblow = "overblow", overbear = "overbear", overbuild = "overbuild", overcome = "overcome", overcrop = "overcrop", overdo = "overdo", overdraw = "overdraw", overdrive = "overdrive", overfly = "overfly", overflow = "overflow", overgrow = "overgrow", overhear = "overhear", overhang = "overhang", overlay = "overlay", overlie = "overlie", overlap = "overlap", overman = "overman", overpay = "overpay", overpass = "overpass", overrun = "overrun", override = "override", oversee = "oversee", overset = "overset", oversew = "oversew", overshoot = "overshoot", oversimplify = "oversimplify", oversleep = "oversleep", oversell = "oversell", overspend = "overspend", overspill = "overspill", overstep = "overstep", overtake = "overtake", overthrow = "overthrow", overtop = "overtop", overwind = "overwind", overwrite = "overwrite", pacify = "pacify", pad = "pad", pay = "pay", pal = "pal", palsy = "palsy", pandy = "pandy", panel = "panel", panic = "panic", pan = "pan", parallel = "parallel", parcel = "parcel", parody = "parody", parry = "parry", partake = "partake", pasquinade = "pasquinade", patrol = "patrol", pat = "pat", pedal = "pedal", peg = "peg", pencil = "pencil", pen = "pen", pep = "pep", permit = "permit", personify = "personify", petrify = "petrify", pet = "pet", pettifog = "pettifog", phantasy = "phantasy", photocopy = "photocopy", photomap = "photomap", photoset = "photoset", physic = "physic", picnic = "picnic", pig = "pig", pillory = "pillory", pin = "pin", pip = "pip", pistol = "pistol", pitapat = "pitapat", pity = "pity", pit = "pit", plan = "plan", plat = "plat", plead = "plead", ply = "ply", plod = "plod", plop = "plop", plot = "plot", plug = "plug", pod = "pod", pommel = "pommel", popes = "popes", pop = "pop", pot = "pot", preachify = "preachify", precancel = "precancel", prefer = "prefer", preoccupy = "preoccupy", prepay = "prepay", presignify = "presignify", pretermit = "pretermit", pretty = "pretty", prettify$2 = "prettify", pry = "pry", prig = "prig", prim = "prim", prod = "prod", program = "program", prologue = "prologue", propel = "propel", prophesy = "prophesy", prop = "prop", prove = "prove", pub = "pub", pug = "pug", pummel = "pummel", pun = "pun", pup = "pup", purify = "purify", putrefy = "putrefy", putty = "putty", put = "put", qualify = "qualify", quantify = "quantify", quarrel = "quarrel", quarry = "quarry", quartersaw = "quartersaw", query = "query", quickstep = "quickstep", quip = "quip", quit = "quit", quiz = "quiz", rag = "rag", rally = "rally", ramify = "ramify", ram = "ram", run = "run", ring = "ring", rap = "rap", rappel = "rappel", rarefy = "rarefy", ratify = "ratify", rat = "rat", ravel = "ravel", rebel = "rebel", rebuild = "rebuild", rebut = "rebut", recap = "recap", reclassify = "reclassify", recommit = "recommit", recopy = "recopy", rectify = "rectify", recur = "recur", red = "red", redo = "redo", refer = "refer", refit = "refit", reave = "reave", refuel = "refuel", regret = "regret", rehear = "rehear", reify = "reify", rely = "rely", remake = "remake", remarry = "remarry", remit = "remit", rend = "rend", repay = "repay", repel = "repel", replevy = "replevy", reply = "reply", repot = "repot", rerun = "rerun", resit = "resit", reset = "reset", resew = "resew", retake = "retake", rethink = "rethink", retell = "retell", retransmit = "retransmit", retry = "retry", retrofit = "retrofit", ret = "ret", reunify = "reunify", revel = "revel", revet = "revet", revivify = "revivify", rev = "rev", rewind = "rewind", rewrite = "rewrite", rib = "rib", ricochet = "ricochet", rid = "rid", ride = "ride", rig = "rig", rigidify = "rigidify", rim = "rim", rip = "rip", rise = "rise", rival = "rival", rive = "rive", rob = "rob", rot = "rot", reeve = "reeve", rowel = "rowel", rub = "rub", rut = "rut", saccharify = "saccharify", sag = "sag", say = "say", salary = "salary", salify = "salify", sally = "sally", sanctify = "sanctify", sandbag = "sandbag", sing = "sing", sink = "sink", saponify = "saponify", sap = "sap", sit = "sit", satisfy = "satisfy", savvy = "savvy", see = "see", saw = "saw", scag = "scag", scan = "scan", scarify = "scarify", scar = "scar", scat = "scat", scorify = "scorify", scrag = "scrag", scram = "scram", scrap = "scrap", scry = "scry", scrub = "scrub", scrum = "scrum", scud = "scud", scum = "scum", scurry = "scurry", seed = "seed", send = "send", set = "set", sew = "sew", shag = "shag", shake = "shake", sham = "sham", sharecrop = "sharecrop", shit = "shit", shave = "shave", shed = "shed", shellac = "shellac", shend = "shend", shew = "shew", shy = "shy", shikar = "shikar", shillyshally = "shillyshally", shim = "shim", shimmy = "shimmy", shin = "shin", ship = "ship", shoe = "shoe", shine = "shine", shop = "shop", shoot = "shoot", shotgun = "shotgun", shot = "shot", shovel = "shovel", show = "show", shrink = "shrink", shred = "shred", shrivel = "shrivel", shrive = "shrive", shrug = "shrug", shun = "shun", shut = "shut", sic = "sic", sideslip = "sideslip", sidestep = "sidestep", sightsee = "sightsee", signal = "signal", signify = "signify", silicify = "silicify", simplify = "simplify", sin = "sin", sip = "sip", shear = "shear", skelly = "skelly", sken = "sken", sket = "sket", skid = "skid", skim = "skim", skin = "skin", skip = "skip", skivvy = "skivvy", skydive = "skydive", slab$1 = "slab", slag = "slag", slay = "slay", slam = "slam", slap = "slap", slat = "slat", sled = "sled", sleep = "sleep", slide = "slide", slip = "slip", slit = "slit", slog = "slog", slop = "slop", slot = "slot", slug = "slug", slum = "slum", sling = "sling", slink = "slink", slur = "slur", smell = "smell", smite = "smite", smut = "smut", snag = "snag", snap = "snap", sned = "sned", snip = "snip", snivel = "snivel", snog = "snog", snub = "snub", sneak = "sneak", snug = "snug", sob = "sob", sod = "sod", sell = "sell", solemnify = "solemnify", solidify = "solidify", soothsay = "soothsay", sop = "sop", seek = "seek", sow = "sow", spag = "spag", spancel = "spancel", span = "span", spar = "spar", spit = "spit", spat = "spat", specify = "specify", speed = "speed", speechify = "speechify", spellbind = "spellbind", spell = "spell", spend = "spend", spy = "spy", spill = "spill", spin = "spin", spiral = "spiral", split = "split", spoil = "spoil", speak = "speak", spotlight = "spotlight", spot = "spot", spring = "spring", sprig = "sprig", spud = "spud", spur = "spur", squat = "squat", squib = "squib", squid = "squid", squeegee = "squeegee", stab = "stab", stink = "stink", star = "star", steady = "steady", stellify = "stellify", stem$2 = "stem", stencil = "stencil", step = "step", stet = "stet", sty = "sty", stiletto = "stiletto", stir = "stir", steal = "steal", stand = "stand", stop = "stop", story = "story", stot = "stot", stave = "stave", strap = "strap", stratify = "stratify", strew = "strew", stride = "stride", strip = "strip", strive = "strive", strop = "strop", strow = "strow", strike = "strike", strum = "strum", string = "string", strut = "strut", stub = "stub", stick = "stick", stud = "stud", study = "study", stultify = "stultify", stum = "stum", sting = "sting", stun = "stun", stupefy = "stupefy", stymie = "stymie", sub = "sub", subjectify = "subjectify", sublet = "sublet", submit = "submit", subtotal = "subtotal", sully = "sully", sulphuret = "sulphuret", sum = "sum", sun = "sun", sup = "sup", supply = "supply", swab = "swab", swag = "swag", swim = "swim", swap = "swap", swat = "swat", sweep = "sweep", swig = "swig", swivel = "swivel", swell = "swell", swear = "swear", swot = "swot", swing = "swing", syllabify = "syllabify", symbol = "symbol", tab = "tab", tag = "tag", take = "take", talc = "talc", tally = "tally", tammy = "tammy", tan = "tan", tap = "tap", tar = "tar", tarry = "tarry", tassel = "tassel", tat = "tat", teach = "teach", taxis = "taxis", taxi = "taxi", teasel = "teasel", ted = "ted", tepefy = "tepefy", terrify = "terrify", testes = "testes", testify = "testify", thin = "thin", think = "think", throw1 = "throw", thrive = "thrive", throb = "throb", thrum = "thrum", thud = "thud", tidy = "tidy", tin = "tin", tinsel = "tinsel", tip = "tip", tittup = "tittup", toady = "toady", tog = "tog", tell = "tell", top = "top", tear = "tear", torrefy = "torrefy", total = "total", tot = "tot", towel = "towel", traffic = "traffic", trammel = "trammel", tram = "tram", transfer = "transfer", transfix = "transfix", transship = "transship", tranship = "tranship", transmit = "transmit", transmogrify = "transmogrify", trapan = "trapan", trap = "trap", travel = "travel", travesty = "travesty", trek = "trek", trepan = "trepan", try1 = "try", trig = "trig", trim = "trim", trip = "trip", tread = "tread", trog = "trog", trot = "trot", trowel = "trowel", tug = "tug", tumefy = "tumefy", tun = "tun", tunnel = "tunnel", tup = "tup", twig = "twig", twin = "twin", twit = "twit", tie = "tie", typeset = "typeset", typewrite = "typewrite", typify = "typify", uglify = "uglify", unbar = "unbar", unbend = "unbend", unbind = "unbind", uncap = "uncap", unclothe = "unclothe", unclog = "unclog", underbid = "underbid", underbuy = "underbuy", undercut = "undercut", underfeed = "underfeed", undergird = "undergird", undergo = "undergo", underlay = "underlay", underlie = "underlie", underlet = "underlet", underpay = "underpay", underpin = "underpin", underprop = "underprop", underset = "underset", undershoot = "undershoot", undersell = "undersell", understand = "understand", understudy = "understudy", undertake = "undertake", underwrite = "underwrite", undo = "undo", unfit = "unfit", unfreeze = "unfreeze", unify = "unify", unkennel = "unkennel", unknit = "unknit", unlay = "unlay", unlearn = "unlearn", unmake = "unmake", unman = "unman", unpeg = "unpeg", unpin = "unpin", unplug = "unplug", unravel = "unravel", unrig = "unrig", unrip = "unrip", unreeve = "unreeve", unsay = "unsay", unship = "unship", unsling = "unsling", unsnap = "unsnap", unspeak = "unspeak", unsteady = "unsteady", unstep = "unstep", unstop = "unstop", unstring = "unstring", unstick = "unstick", unswear = "unswear", unteach = "unteach", unthink = "unthink", untidy = "untidy", untread = "untread", untie = "untie", unwind = "unwind", unwrap$1 = "unwrap", unzip = "unzip", upbuild = "upbuild", uphold = "uphold", upheave = "upheave", up = "up", uppercut = "uppercut", uprise = "uprise", upset = "upset", upspring = "upspring", upsweep = "upsweep", upswell = "upswell", upswing = "upswing", vag = "vag", vary = "vary", vat = "vat", verbify = "verbify", verify = "verify", versify = "versify", vet = "vet", victual = "victual", vilify = "vilify", vitrify = "vitrify", vitriol = "vitriol", vivify = "vivify", vie = "vie", wad = "wad", waddy = "waddy", wadset = "wadset", wag = "wag", wan = "wan", war = "war", waylay = "waylay", weary = "weary", weatherstrip = "weatherstrip", web = "web", wed = "wed", weed = "weed", weep = "weep", wet = "wet", wham = "wham", whap = "whap", whet = "whet", whinny = "whinny", whip = "whip", whipsaw = "whipsaw", whir = "whir", whiz = "whiz", whop = "whop", wig = "wig", wigwag = "wigwag", wildcat = "wildcat", will = "will", win = "win", winterfeed = "winterfeed", wiredraw = "wiredraw", withdraw = "withdraw", withhold = "withhold", withstand = "withstand", wake = "wake", won = "won", wear = "wear", worry = "worry", worship = "worship", wind = "wind", weave = "weave", wrap$2 = "wrap", wry = "wry", write = "write", work = "work", wring = "wring", yak = "yak", yap = "yap", yen = "yen", yodel = "yodel", zap = "zap", zigzag = "zigzag", zip = "zip";
147704
- exceptions$1.abetted = abet, exceptions$1.abetting = abet, exceptions$1.abhorred = abhor, exceptions$1.abhorring = abhor, exceptions$1.abode = abide, exceptions$1.abought = aby, exceptions$1.abutted = abut, exceptions$1.abutting = abut, exceptions$1.abye = aby, exceptions$1.accompanied = accompany, exceptions$1.acetified = acetify, exceptions$1.acidified = acidify, exceptions$1.acquitted = acquit, exceptions$1.acquitting = acquit, exceptions$1.addrest = address, exceptions$1.admitted = admit, exceptions$1.admitting = admit, exceptions$1.aerified = aerify, exceptions$1.airdropped = airdrop, exceptions$1.airdropping = airdrop, exceptions$1.alkalified = alkalify, exceptions$1.allied = ally, exceptions$1.allotted = allot, exceptions$1.allotting = allot, exceptions$1.am = be, exceptions$1.ammonified = ammonify, exceptions$1.amnestied = amnesty, exceptions$1.amplified = amplify, exceptions$1.anglified = anglify, exceptions$1.annulled = annul, exceptions$1.annulling = annul, exceptions$1.appalled = appal, exceptions$1.appalling = appal, exceptions$1.applied = apply, exceptions$1.arcked = arc, exceptions$1.arcking = arc, exceptions$1.are = be, exceptions$1.argufied = argufy, exceptions$1.arisen = arise, exceptions$1.arose = arise, exceptions$1.ate = eat, exceptions$1.atrophied = atrophy, exceptions$1.averred = aver, exceptions$1.averring = aver, exceptions$1.awoke = awake, exceptions$1.awoken = awake, exceptions$1.babied = baby, exceptions$1.backbit = backbite, exceptions$1.backbitten = backbite, exceptions$1.backslid = backslide, exceptions$1.backslidden = backslide, exceptions$1.bade = bid, exceptions$1.bagged = bag, exceptions$1.bagging = bag, exceptions$1.ballyragged = ballyrag, exceptions$1.ballyragging = ballyrag, exceptions$1.bandied = bandy, exceptions$1.banned = ban, exceptions$1.banning = ban, exceptions$1.barred = bar, exceptions$1.barrelled = barrel, exceptions$1.barrelling = barrel, exceptions$1.barring = bar, exceptions$1.basified = basify, exceptions$1.batted = bat, exceptions$1.batting = bat, exceptions$1.bayonetted = bayonet, exceptions$1.bayonetting = bayonet, exceptions$1.beaten = beat, exceptions$1.beatified = beatify, exceptions$1.beautified = beautify, exceptions$1.became = become, exceptions$1.bed = bed, exceptions$1.bedded = bed, exceptions$1.bedding = bed, exceptions$1.bedevilled = bedevil, exceptions$1.bedevilling = bedevil, exceptions$1.bedimmed = bedim, exceptions$1.bedimming = bedim, exceptions$1.been = be, exceptions$1.befallen = befall, exceptions$1.befell = befall, exceptions$1.befitted = befit, exceptions$1.befitting = befit, exceptions$1.befogged = befog, exceptions$1.befogging = befog, exceptions$1.began = begin, exceptions$1.begat = beget, exceptions$1.begetting = beget, exceptions$1.begged = beg, exceptions$1.begging = beg, exceptions$1.beginning = begin, exceptions$1.begirt = begird, exceptions$1.begot = beget, exceptions$1.begotten = beget, exceptions$1.begun = begin, exceptions$1.beheld = behold, exceptions$1.beholden = behold, exceptions$1.bejewelled = bejewel, exceptions$1.bejewelling = bejewel, exceptions$1.bellied = belly, exceptions$1.belying = belie, exceptions$1.benefitted = benefit, exceptions$1.benefitting = benefit, exceptions$1.benempt = bename, exceptions$1.bent = bend, exceptions$1.berried = berry, exceptions$1.besetting = beset, exceptions$1.besought = beseech, exceptions$1.bespoke = bespeak, exceptions$1.bespoken = bespeak, exceptions$1.bestirred = bestir, exceptions$1.bestirring = bestir, exceptions$1.bestrewn = bestrew, exceptions$1.bestrid = bestride, exceptions$1.bestridden = bestride, exceptions$1.bestrode = bestride, exceptions$1.betaken = betake, exceptions$1.bethought = bethink, exceptions$1.betook = betake, exceptions$1.betted = bet, exceptions$1.betting = bet, exceptions$1.bevelled = bevel, exceptions$1.bevelling = bevel, exceptions$1.biassed = bias, exceptions$1.biassing = bias, exceptions$1.bidden = bid, exceptions$1.bidding = bid, exceptions$1.bing = bing, exceptions$1.binned = bin, exceptions$1.binning = bin, exceptions$1.bit = bite, exceptions$1.bitted = bit, exceptions$1.bitten = bite, exceptions$1.bitting = bit, exceptions$1.bivouacked = bivouac, exceptions$1.bivouacking = bivouac, exceptions$1.blabbed = blab, exceptions$1.blabbing = blab, exceptions$1.blackberried = blackberry, exceptions$1.blacklegged = blackleg, exceptions$1.blacklegging = blackleg, exceptions$1.blatted = blat, exceptions$1.blatting = blat, exceptions$1.bled = bleed, exceptions$1.blest = bless, exceptions$1.blew = blow, exceptions$1.blipped = blip, exceptions$1.blipping = blip, exceptions$1.blobbed = blob, exceptions$1.blobbing = blob, exceptions$1.bloodied = bloody, exceptions$1.blotted = blot, exceptions$1.blotting = blot, exceptions$1.blown = blow, exceptions$1.blubbed = blub, exceptions$1.blubbing = blub, exceptions$1.blurred = blur, exceptions$1.blurring = blur, exceptions$1.bobbed = bob, exceptions$1.bobbing = bob, exceptions$1.bodied = body, exceptions$1.bootlegged = bootleg, exceptions$1.bootlegging = bootleg, exceptions$1.bopped = bop, exceptions$1.bopping = bop, exceptions$1.bore = bear, exceptions$1.born = bear, exceptions$1.borne = bear, exceptions$1.bought = buy, exceptions$1.bound = bind, exceptions$1.bragged = brag, exceptions$1.bragging = brag, exceptions$1.bred = breed, exceptions$1.brevetted = brevet, exceptions$1.brevetting = brevet, exceptions$1.brimmed = brim, exceptions$1.brimming = brim, exceptions$1.broke = break1, exceptions$1.broken = break1, exceptions$1.brought = bring, exceptions$1.browbeaten = browbeat, exceptions$1.brutified = brutify, exceptions$1.budded = bud, exceptions$1.budding = bud, exceptions$1.bugged = bug, exceptions$1.bugging = bug, exceptions$1.built = build, exceptions$1.bulldogging = bulldog, exceptions$1.bullied = bully, exceptions$1.bullshitted = bullshit, exceptions$1.bullshitting = bullshit, exceptions$1.bullwhipped = bullwhip, exceptions$1.bullwhipping = bullwhip, exceptions$1.bullyragged = bullyrag, exceptions$1.bullyragging = bullyrag, exceptions$1.bummed = bum, exceptions$1.bumming = bum, exceptions$1.buried = bury, exceptions$1.burnt = burn, exceptions$1.burred = bur, exceptions$1.burring = bur, exceptions$1.bushelled = bushel, exceptions$1.bushelling = bushel, exceptions$1.busied = busy, exceptions$1.bypast = bypass, exceptions$1.caballed = cabal, exceptions$1.caballing = cabal, exceptions$1.caddied = caddy, exceptions$1.caddies = caddy, exceptions$1.caddying = caddy, exceptions$1.calcified = calcify, exceptions$1.came = come, exceptions$1.canalled = canal, exceptions$1.canalling = canal, exceptions$1.cancelled = cancel, exceptions$1.cancelling = cancel, exceptions$1.candied = candy, exceptions$1.canned = can, exceptions$1.canning = can, exceptions$1.canopied = canopy, exceptions$1.capped = cap, exceptions$1.capping = cap, exceptions$1.carburetted = carburet, exceptions$1.carburetting = carburet, exceptions$1.carillonned = carillon, exceptions$1.carillonning = carillon, exceptions$1.carnied = carny, exceptions$1.carnified = carnify, exceptions$1.carolled = carol, exceptions$1.carolling = carol, exceptions$1.carried = carry, exceptions$1.casefied = casefy, exceptions$1.catnapped = catnap, exceptions$1.catnapping = catnap, exceptions$1.catted = cat, exceptions$1.catting = cat, exceptions$1.caught = catch1, exceptions$1.cavilled = cavil, exceptions$1.cavilling = cavil, exceptions$1.certified = certify, exceptions$1.channelled = channel, exceptions$1.channelling = channel, exceptions$1.chapped = chap, exceptions$1.chapping = chap, exceptions$1.charred = char, exceptions$1.charring = char, exceptions$1.chatted = chat, exceptions$1.chatting = chat, exceptions$1.chevied = chivy, exceptions$1.chevies = chivy, exceptions$1.chevying = chivy, exceptions$1.chid = chide, exceptions$1.chidden = chide, exceptions$1.chinned = chin, exceptions$1.chinning = chin, exceptions$1.chipped = chip, exceptions$1.chipping = chip, exceptions$1.chiselled = chisel, exceptions$1.chiselling = chisel, exceptions$1.chitchatted = chitchat, exceptions$1.chitchatting = chitchat, exceptions$1.chivied = chivy, exceptions$1.chivved = chiv, exceptions$1.chivvied = chivy, exceptions$1.chivvies = chivy, exceptions$1.chivving = chiv, exceptions$1.chivvying = chivy, exceptions$1.chondrified = chondrify, exceptions$1.chopped = chop, exceptions$1.chopping = chop, exceptions$1.chose = choose, exceptions$1.chosen = choose, exceptions$1.chugged = chug, exceptions$1.chugging = chug, exceptions$1.chummed = chum, exceptions$1.chumming = chum, exceptions$1.citified = citify, exceptions$1.clad = clothe, exceptions$1.cladded = clad, exceptions$1.cladding = clad, exceptions$1.clammed = clam, exceptions$1.clamming = clam, exceptions$1.clapped = clap, exceptions$1.clapping = clap, exceptions$1.clarified = clarify, exceptions$1.classified = classify, exceptions$1.cleft = cleave, exceptions$1.clemmed = clem, exceptions$1.clemming = clem, exceptions$1.clept = clepe, exceptions$1.clipped = clip, exceptions$1.clipping = clip, exceptions$1.clogged = clog, exceptions$1.clogging = clog, exceptions$1.clopped = clop, exceptions$1.clopping = clop, exceptions$1.clotted = clot, exceptions$1.clotting = clot, exceptions$1.clove = cleave, exceptions$1.cloven = cleave, exceptions$1.clubbed = club, exceptions$1.clubbing = club, exceptions$1.clung = cling, exceptions$1.cockneyfied = cockneyfy, exceptions$1.codded = cod, exceptions$1.codding = cod, exceptions$1.codified = codify, exceptions$1.cogged = cog, exceptions$1.cogging = cog, exceptions$1.coiffed = coif, exceptions$1.coiffing = coif, exceptions$1.collied = colly, exceptions$1.combatted = combat, exceptions$1.combatting = combat, exceptions$1.committed = commit, exceptions$1.committing = commit, exceptions$1.compelled = compel, exceptions$1.compelling = compel, exceptions$1.complied = comply, exceptions$1.complotted = complot, exceptions$1.complotting = complot, exceptions$1.concurred = concur, exceptions$1.concurring = concur, exceptions$1.confabbed = confab, exceptions$1.confabbing = confab, exceptions$1.conferred = confer, exceptions$1.conferring = confer, exceptions$1.conned = con, exceptions$1.conning = con, exceptions$1.controlled = control, exceptions$1.controlling = control, exceptions$1.copied = copy, exceptions$1.copped = cop, exceptions$1.copping = cop, exceptions$1.coquetted = coquet, exceptions$1.coquetting = coquet, exceptions$1.corralled = corral, exceptions$1.corralling = corral, exceptions$1.could = can, exceptions$1.counselled = counsel, exceptions$1.counselling = counsel, exceptions$1.counterplotted = counterplot, exceptions$1.counterplotting = counterplot, exceptions$1.countersank = countersink, exceptions$1.countersunk = countersink, exceptions$1.crabbed = crab, exceptions$1.crabbing = crab, exceptions$1.crammed = cram, exceptions$1.cramming = cram, exceptions$1.crapped = crap, exceptions$1.crapping = crap, exceptions$1.creeped = creep, exceptions$1.crept = creep, exceptions$1.cribbed = crib, exceptions$1.cribbing = crib, exceptions$1.cried = cry, exceptions$1.cropped = crop, exceptions$1.cropping = crop, exceptions$1.crossbred = crossbreed, exceptions$1.crosscutting = crosscut, exceptions$1.crucified = crucify, exceptions$1.cubbed = cub, exceptions$1.cubbing = cub, exceptions$1.cudgelled = cudgel, exceptions$1.cudgelling = cudgel, exceptions$1.cupelled = cupel, exceptions$1.cupelling = cupel, exceptions$1.cupped = cup, exceptions$1.cupping = cup, exceptions$1.curetted = curet, exceptions$1.curettes = curet, exceptions$1.curetting = curet, exceptions$1.curried = curry, exceptions$1.curst = curse, exceptions$1.curtsied = curtsy, exceptions$1.curvetted = curvet, exceptions$1.curvetting = curvet, exceptions$1.cutting = cut, exceptions$1.dabbed = dab, exceptions$1.dabbing = dab, exceptions$1.dagged = dag, exceptions$1.dagging = dag, exceptions$1.dallied = dally, exceptions$1.dammed = dam, exceptions$1.damming = dam, exceptions$1.damnified = damnify, exceptions$1.dandified = dandify, exceptions$1.dapped = dap, exceptions$1.dapping = dap, exceptions$1.dealt = deal, exceptions$1.debarred = debar, exceptions$1.debarring = debar, exceptions$1.debugged = debug, exceptions$1.debugging = debug, exceptions$1.debussed = debus, exceptions$1.debusses = debus, exceptions$1.debussing = debus, exceptions$1.decalcified = decalcify, exceptions$1.declassified = declassify, exceptions$1.decontrolled = decontrol, exceptions$1.decontrolling = decontrol, exceptions$1.decried = decry, exceptions$1.deferred = defer, exceptions$1.deferring = defer, exceptions$1.defied = defy, exceptions$1.degassed = degas, exceptions$1.degasses = degas, exceptions$1.degassing = degas, exceptions$1.dehumidified = dehumidify, exceptions$1.deified = deify, exceptions$1.demitted = demit, exceptions$1.demitting = demit, exceptions$1.demobbed = demob, exceptions$1.demobbing = demob, exceptions$1.demulsified = demulsify, exceptions$1.demurred = demur, exceptions$1.demurring = demur, exceptions$1.demystified = demystify, exceptions$1.denazified = denazify, exceptions$1.denied = deny, exceptions$1.denitrified = denitrify, exceptions$1.denned = den, exceptions$1.denning = den, exceptions$1.descried = descry, exceptions$1.deterred = deter, exceptions$1.deterring = deter, exceptions$1.detoxified = detoxify, exceptions$1.devilled = devil, exceptions$1.devilling = devil, exceptions$1.devitrified = devitrify, exceptions$1.diagrammed = diagram, exceptions$1.diagramming = diagram, exceptions$1.dialled = dial, exceptions$1.dialling = dial, exceptions$1.dibbed = dib, exceptions$1.dibbing = dib, exceptions$1.did = do1, exceptions$1.digging = dig, exceptions$1.dignified = dignify, exceptions$1.dimmed = dim, exceptions$1.dimming = dim, exceptions$1.dinned = din, exceptions$1.dinning = din, exceptions$1.dipped = dip, exceptions$1.dipping = dip, exceptions$1.dirtied = dirty, exceptions$1.disannulled = disannul, exceptions$1.disannulling = disannul, exceptions$1.disbarred = disbar, exceptions$1.disbarring = disbar, exceptions$1.disbudded = disbud, exceptions$1.disbudding = disbud, exceptions$1.disembodied = disembody, exceptions$1.disembowelled = disembowel, exceptions$1.disembowelling = disembowel, exceptions$1.disenthralled = disenthral, exceptions$1.disenthralling = disenthral, exceptions$1.disenthralls = disenthral, exceptions$1.disenthrals = disenthrall, exceptions$1.dishevelled = dishevel, exceptions$1.dishevelling = dishevel, exceptions$1.disinterred = disinter, exceptions$1.disinterring = disinter, exceptions$1.dispelled = dispel, exceptions$1.dispelling = dispel, exceptions$1.disqualified = disqualify, exceptions$1.dissatisfied = dissatisfy, exceptions$1.distilled = distil, exceptions$1.distilling = distil, exceptions$1.diversified = diversify, exceptions$1.divvied = divvy, exceptions$1.dizzied = dizzy, exceptions$1.does = do1, exceptions$1.dogged = dog, exceptions$1.dogging = dog, exceptions$1.doglegged = dogleg, exceptions$1.doglegging = dogleg, exceptions$1.dollied = dolly, exceptions$1.done = do1, exceptions$1.donned = don, exceptions$1.donning = don, exceptions$1.dotted = dot, exceptions$1.dotting = dot, exceptions$1.dought = dow, exceptions$1.dove = dive, exceptions$1.drabbed = drab, exceptions$1.drabbing = drab, exceptions$1.dragged = drag, exceptions$1.dragging = drag, exceptions$1.drank = drink, exceptions$1.drawn = draw, exceptions$1.dreamt = dream, exceptions$1.drew = draw, exceptions$1.dried = dry, exceptions$1.dripped = drip, exceptions$1.dripping = drip, exceptions$1.drivelled = drivel, exceptions$1.drivelling = drivel, exceptions$1.driven = drive, exceptions$1.dropped = drop, exceptions$1.dropping = drop, exceptions$1.drove = drive, exceptions$1.drubbed = drub, exceptions$1.drubbing = drub, exceptions$1.drugged = drug, exceptions$1.drugging = drug, exceptions$1.drummed = drum, exceptions$1.drumming = drum, exceptions$1.drunk = drink, exceptions$1.dubbed = dub, exceptions$1.dubbing = dub, exceptions$1.duelled = duel, exceptions$1.duelling = duel, exceptions$1.dug = dig, exceptions$1.dulcified = dulcify, exceptions$1.dummied = dummy, exceptions$1.dunned = dun, exceptions$1.dunning = dun, exceptions$1.dwelt = dwell, exceptions$1.dying = die, exceptions$1.easied = easy, exceptions$1.eaten = eat, exceptions$1.eavesdropped = eavesdrop, exceptions$1.eavesdropping = eavesdrop, exceptions$1.eddied = eddy, exceptions$1.edified = edify, exceptions$1.electrified = electrify, exceptions$1.embedded = embed, exceptions$1.embedding = embed, exceptions$1.embodied = embody, exceptions$1.embussed = embus, exceptions$1.embusses = embus, exceptions$1.embussing = embus, exceptions$1.emitted = emit, exceptions$1.emitting = emit, exceptions$1.empanelled = empanel, exceptions$1.empanelling = empanel, exceptions$1.emptied = empty, exceptions$1.emulsified = emulsify, exceptions$1.enamelled = enamel, exceptions$1.enamelling = enamel, exceptions$1.englutted = englut, exceptions$1.englutting = englut, exceptions$1.enrolled = enrol, exceptions$1.enrolling = enrol, exceptions$1.enthralled = enthral, exceptions$1.enthralling = enthral, exceptions$1.entrammelled = entrammel, exceptions$1.entrammelling = entrammel, exceptions$1.entrapped = entrap, exceptions$1.entrapping = entrap, exceptions$1.envied = envy, exceptions$1.enwound = enwind, exceptions$1.enwrapped = enwrap, exceptions$1.enwrapping = enwrap, exceptions$1.equalled = equal, exceptions$1.equalling = equal, exceptions$1.equipped = equip, exceptions$1.equipping = equip, exceptions$1.espied = espy, exceptions$1.esterified = esterify, exceptions$1.estopped = estop, exceptions$1.estopping = estop, exceptions$1.etherified = etherify, exceptions$1.excelled = excel, exceptions$1.excelling = excel, exceptions$1.exemplified = exemplify, exceptions$1.expelled = expel, exceptions$1.expelling = expel, exceptions$1.extolled = extol, exceptions$1.extolling = extol, exceptions$1.facetted = facet, exceptions$1.facetting = facet, exceptions$1.fagged = fag, exceptions$1.fagging = fag, exceptions$1.fallen = fall, exceptions$1.falsified = falsify, exceptions$1.fancied = fancy, exceptions$1.fanned = fan, exceptions$1.fanning = fan, exceptions$1.fantasied = fantasy, exceptions$1.fatted = fat, exceptions$1.fatting = fat, exceptions$1.featherbedded = featherbed, exceptions$1.featherbedding = featherbed, exceptions$1.fed = feed, exceptions$1.feed = feed, exceptions$1.fell = fall, exceptions$1.felt = feel, exceptions$1.ferried = ferry, exceptions$1.fibbed = fib, exceptions$1.fibbing = fib, exceptions$1.figged = fig, exceptions$1.figging = fig, exceptions$1.finned = fin, exceptions$1.finning = fin, exceptions$1.fitted = fit, exceptions$1.fitting = fit, exceptions$1.flagged = flag, exceptions$1.flagging = flag, exceptions$1.flammed = flam, exceptions$1.flamming = flam, exceptions$1.flannelled = flannel, exceptions$1.flannelling = flannel, exceptions$1.flapped = flap, exceptions$1.flapping = flap, exceptions$1.flatted = flat, exceptions$1.flatting = flat, exceptions$1.fled = flee, exceptions$1.flew = fly, exceptions$1.flimflammed = flimflam, exceptions$1.flimflamming = flimflam, exceptions$1.flipped = flip, exceptions$1.flipping = flip, exceptions$1.flitted = flit, exceptions$1.flitting = flit, exceptions$1.flogged = flog, exceptions$1.flogging = flog, exceptions$1.floodlit = floodlight, exceptions$1.flopped = flop, exceptions$1.flopping = flop, exceptions$1.flown = fly, exceptions$1.flubbed = flub, exceptions$1.flubbing = flub, exceptions$1.flung = fling, exceptions$1.flurried = flurry, exceptions$1.flyblew = flyblow, exceptions$1.flyblown = flyblow, exceptions$1.fobbed = fob, exceptions$1.fobbing = fob, exceptions$1.fogged = fog, exceptions$1.fogging = fog, exceptions$1.footslogged = footslog, exceptions$1.footslogging = footslog, exceptions$1.forbad = forbid, exceptions$1.forbade = forbid, exceptions$1.forbidden = forbid, exceptions$1.forbidding = forbid, exceptions$1.forbore = forbear, exceptions$1.forborne = forbear, exceptions$1.fordid = fordo, exceptions$1.fordone = fordo, exceptions$1.foredid = foredo, exceptions$1.foredone = foredo, exceptions$1.foregone = forego, exceptions$1.foreknew = foreknow, exceptions$1.foreknown = foreknow, exceptions$1.foreran = forerun, exceptions$1.forerunning = forerun, exceptions$1.foresaw = foresee, exceptions$1.foreseen = foresee, exceptions$1.foreshown = foreshow, exceptions$1.forespoke = forespeak, exceptions$1.forespoken = forespeak, exceptions$1.foretold = foretell, exceptions$1.forewent = forego, exceptions$1.forgave = forgive, exceptions$1.forgetting = forget, exceptions$1.forgiven = forgive, exceptions$1.forgone = forgo, exceptions$1.forgot = forget, exceptions$1.forgotten = forget, exceptions$1.formatted = format, exceptions$1.formatting = format, exceptions$1.forsaken = forsake, exceptions$1.forsook = forsake, exceptions$1.forspoke = forspeak, exceptions$1.forspoken = forspeak, exceptions$1.forswore = forswear, exceptions$1.forsworn = forswear, exceptions$1.fortified = fortify, exceptions$1.forwent = forgo, exceptions$1.fought = fight, exceptions$1.found = find, exceptions$1.foxtrotted = foxtrot, exceptions$1.foxtrotting = foxtrot, exceptions$1.frapped = frap, exceptions$1.frapping = frap, exceptions$1.frenchified = frenchify, exceptions$1.frenzied = frenzy, exceptions$1.fretted = fret, exceptions$1.fretting = fret, exceptions$1.fried = fry, exceptions$1.frigged = frig, exceptions$1.frigging = frig, exceptions$1.fritted = frit, exceptions$1.fritting = frit, exceptions$1.frivolled = frivol, exceptions$1.frivolling = frivol, exceptions$1.frogged = frog, exceptions$1.frogging = frog, exceptions$1.frolicked = frolic, exceptions$1.frolicking = frolic, exceptions$1.froze = freeze, exceptions$1.frozen = freeze, exceptions$1.fructified = fructify, exceptions$1.fuelled = fuel, exceptions$1.fuelling = fuel, exceptions$1.fulfilled = fulfil, exceptions$1.fulfilling = fulfil, exceptions$1.funned = fun, exceptions$1.funnelled = funnel, exceptions$1.funnelling = funnel, exceptions$1.funning = fun, exceptions$1.furred = fur, exceptions$1.furring = fur, exceptions$1.gadded = gad, exceptions$1.gadding = gad, exceptions$1.gagged = gag, exceptions$1.gagging = gag, exceptions$1.gainsaid = gainsay, exceptions$1.gambolled = gambol, exceptions$1.gambolling = gambol, exceptions$1.gammed = gam, exceptions$1.gamming = gam, exceptions$1.gan = gin, exceptions$1.ganned = gan, exceptions$1.ganning = gan, exceptions$1.gapped = gap, exceptions$1.gapping = gap, exceptions$1.gasified = gasify, exceptions$1.gassed = gas, exceptions$1.gasses = gas, exceptions$1.gassing = gas, exceptions$1.gave = give, exceptions$1.gelled = gel, exceptions$1.gelling = gel, exceptions$1.gelt = geld, exceptions$1.gemmed = gem, exceptions$1.gemming = gem, exceptions$1.getting = get, exceptions$1.ghostwritten = ghostwrite, exceptions$1.ghostwrote = ghostwrite, exceptions$1.gibbed = gib, exceptions$1.gibbing = gib, exceptions$1.giddied = giddy, exceptions$1.giftwrapped = giftwrap, exceptions$1.giftwrapping = giftwrap, exceptions$1.gigged = gig, exceptions$1.gigging = gig, exceptions$1.gilt = gild, exceptions$1.ginned = gin, exceptions$1.ginning = gin, exceptions$1.gipped = gip, exceptions$1.gipping = gip, exceptions$1.girt = gird, exceptions$1.given = give, exceptions$1.glommed = glom, exceptions$1.glomming = glom, exceptions$1.gloried = glory, exceptions$1.glorified = glorify, exceptions$1.glutted = glut, exceptions$1.glutting = glut, exceptions$1.gnawn = gnaw, exceptions$1.gollied = golly, exceptions$1.gone = go, exceptions$1.got = get, exceptions$1.gotten = get, exceptions$1.grabbed = grab, exceptions$1.grabbing = grab, exceptions$1.gratified = gratify, exceptions$1.gravelled = gravel, exceptions$1.gravelling = gravel, exceptions$1.graven = grave, exceptions$1.grew = grow, exceptions$1.grinned = grin, exceptions$1.grinning = grin, exceptions$1.gripped = grip, exceptions$1.gripping = grip, exceptions$1.gript = grip, exceptions$1.gritted = grit, exceptions$1.gritting = grit, exceptions$1.ground = grind, exceptions$1.grovelled = grovel, exceptions$1.grovelling = grovel, exceptions$1.grown = grow, exceptions$1.grubbed = grub, exceptions$1.grubbing = grub, exceptions$1.guarantied = guaranty, exceptions$1.gullied = gully, exceptions$1.gummed = gum, exceptions$1.gumming = gum, exceptions$1.gunned = gun, exceptions$1.gunning = gun, exceptions$1.gypped = gyp, exceptions$1.gypping = gyp, exceptions$1.hacksawn = hacksaw, exceptions$1.had = have, exceptions$1.hammed = ham, exceptions$1.hamming = ham, exceptions$1.hamstrung = hamstring, exceptions$1.handfed = handfeed, exceptions$1.handicapped = handicap, exceptions$1.handicapping = handicap, exceptions$1.handselled = handsel, exceptions$1.handselling = handsel, exceptions$1.harried = harry, exceptions$1.has = have, exceptions$1.hatchelled = hatchel;
147822
+ const exceptions$1 = /* @__PURE__ */ Object.create(null), abet = "abet", abhor = "abhor", abide = "abide", aby = "aby", abut = "abut", accompany = "accompany", acetify = "acetify", acidify = "acidify", acquit = "acquit", address = "address", admit = "admit", aerify = "aerify", airdrop = "airdrop", alkalify = "alkalify", ally = "ally", allot = "allot", be = "be", ammonify = "ammonify", amnesty = "amnesty", amplify = "amplify", anglify = "anglify", annul = "annul", appal = "appal", apply = "apply", arc = "arc", argufy = "argufy", arise = "arise", eat = "eat", atrophy = "atrophy", aver = "aver", awake = "awake", baby = "baby", backbite = "backbite", backslide = "backslide", bid = "bid", bag = "bag", ballyrag = "ballyrag", bandy = "bandy", ban = "ban", bar = "bar", barrel = "barrel", basify = "basify", bat = "bat", bayonet = "bayonet", beat = "beat", beatify = "beatify", beautify = "beautify", become = "become", bed = "bed", bedevil = "bedevil", bedim = "bedim", befall = "befall", befit = "befit", befog = "befog", begin = "begin", beget = "beget", beg = "beg", begird = "begird", behold = "behold", bejewel = "bejewel", belly = "belly", belie = "belie", benefit = "benefit", bename = "bename", bend = "bend", berry = "berry", beset = "beset", beseech = "beseech", bespeak = "bespeak", bestir = "bestir", bestrew = "bestrew", bestride = "bestride", betake = "betake", bethink = "bethink", bet = "bet", bevel = "bevel", bias = "bias", bing = "bing", bin = "bin", bite = "bite", bit = "bit", bivouac = "bivouac", blab = "blab", blackberry = "blackberry", blackleg = "blackleg", blat = "blat", bleed = "bleed", bless = "bless", blow = "blow", blip = "blip", blob = "blob", bloody = "bloody", blot = "blot", blub = "blub", blur = "blur", bob = "bob", body = "body", bootleg = "bootleg", bop = "bop", bear = "bear", buy = "buy", bind = "bind", brag = "brag", breed = "breed", brevet = "brevet", brim = "brim", break1 = "break", bring = "bring", browbeat = "browbeat", brutify = "brutify", bud = "bud", bug = "bug", build = "build", bulldog = "bulldog", bully = "bully", bullshit = "bullshit", bullwhip = "bullwhip", bullyrag = "bullyrag", bum = "bum", bury = "bury", burn = "burn", bur = "bur", bushel = "bushel", busy = "busy", bypass = "bypass", cabal = "cabal", caddy = "caddy", calcify = "calcify", come = "come", canal = "canal", cancel = "cancel", candy = "candy", can = "can", canopy = "canopy", cap = "cap", carburet = "carburet", carillon = "carillon", carny = "carny", carnify = "carnify", carol = "carol", carry = "carry", casefy = "casefy", catnap = "catnap", cat = "cat", catch1 = "catch", cavil = "cavil", certify = "certify", channel = "channel", chap = "chap", char = "char", chat = "chat", chivy = "chivy", chide = "chide", chin = "chin", chip = "chip", chisel = "chisel", chitchat = "chitchat", chiv = "chiv", chondrify = "chondrify", chop = "chop", choose = "choose", chug = "chug", chum = "chum", citify = "citify", clothe = "clothe", clad = "clad", clam = "clam", clap = "clap", clarify = "clarify", classify = "classify", cleave = "cleave", clem = "clem", clepe = "clepe", clip$1 = "clip", clog = "clog", clop = "clop", clot = "clot", club = "club", cling = "cling", cockneyfy = "cockneyfy", cod = "cod", codify = "codify", cog = "cog", coif = "coif", colly = "colly", combat = "combat", commit = "commit", compel = "compel", comply = "comply", complot = "complot", concur = "concur", confab = "confab", confer = "confer", con = "con", control = "control", copy = "copy", cop = "cop", coquet = "coquet", corral = "corral", counsel = "counsel", counterplot = "counterplot", countersink = "countersink", crab = "crab", cram = "cram", crap = "crap", creep = "creep", crib = "crib", cry = "cry", crop = "crop", crossbreed = "crossbreed", crosscut = "crosscut", crucify = "crucify", cub = "cub", cudgel = "cudgel", cupel = "cupel", cup = "cup", curet = "curet", curry = "curry", curse = "curse", curtsy = "curtsy", curvet = "curvet", cut = "cut", dab = "dab", dag = "dag", dally = "dally", dam = "dam", damnify = "damnify", dandify = "dandify", dap = "dap", deal = "deal", debar = "debar", debug = "debug", debus = "debus", decalcify = "decalcify", declassify = "declassify", decontrol = "decontrol", decry = "decry", defer = "defer", defy = "defy", degas = "degas", dehumidify = "dehumidify", deify = "deify", demit = "demit", demob = "demob", demulsify = "demulsify", demur = "demur", demystify = "demystify", denazify = "denazify", deny = "deny", denitrify = "denitrify", den = "den", descry = "descry", deter = "deter", detoxify = "detoxify", devil = "devil", devitrify = "devitrify", diagram = "diagram", dial = "dial", dib = "dib", do1 = "do", dig = "dig", dignify = "dignify", dim = "dim", din = "din", dip = "dip", dirty = "dirty", disannul = "disannul", disbar = "disbar", disbud = "disbud", disembody = "disembody", disembowel = "disembowel", disenthral = "disenthral", disenthrall = "disenthrall", dishevel = "dishevel", disinter = "disinter", dispel = "dispel", disqualify = "disqualify", dissatisfy = "dissatisfy", distil = "distil", diversify = "diversify", divvy = "divvy", dizzy = "dizzy", dog = "dog", dogleg = "dogleg", dolly = "dolly", don = "don", dot = "dot", dow = "dow", dive = "dive", drab = "drab", drag = "drag", drink = "drink", draw = "draw", dream = "dream", dry = "dry", drip = "drip", drivel = "drivel", drive = "drive", drop = "drop", drub = "drub", drug = "drug", drum = "drum", dub = "dub", duel = "duel", dulcify = "dulcify", dummy = "dummy", dun = "dun", dwell = "dwell", die = "die", easy = "easy", eavesdrop = "eavesdrop", eddy = "eddy", edify = "edify", electrify = "electrify", embed = "embed", embody = "embody", embus = "embus", emit = "emit", empanel = "empanel", empty = "empty", emulsify = "emulsify", enamel = "enamel", englut = "englut", enrol = "enrol", enthral = "enthral", entrammel = "entrammel", entrap = "entrap", envy = "envy", enwind = "enwind", enwrap = "enwrap", equal = "equal", equip = "equip", espy = "espy", esterify = "esterify", estop = "estop", etherify = "etherify", excel = "excel", exemplify = "exemplify", expel = "expel", extol = "extol", facet = "facet", fag = "fag", fall = "fall", falsify = "falsify", fancy = "fancy", fan = "fan", fantasy = "fantasy", fat = "fat", featherbed = "featherbed", feed = "feed", feel = "feel", ferry = "ferry", fib = "fib", fig = "fig", fin = "fin", fit = "fit", flag = "flag", flam = "flam", flannel = "flannel", flap = "flap", flat = "flat", flee = "flee", fly = "fly", flimflam = "flimflam", flip = "flip", flit = "flit", flog = "flog", floodlight = "floodlight", flop = "flop", flub = "flub", fling = "fling", flurry = "flurry", flyblow = "flyblow", fob = "fob", fog = "fog", footslog = "footslog", forbid = "forbid", forbear = "forbear", fordo = "fordo", foredo = "foredo", forego = "forego", foreknow = "foreknow", forerun = "forerun", foresee = "foresee", foreshow = "foreshow", forespeak = "forespeak", foretell = "foretell", forgive = "forgive", forget = "forget", forgo = "forgo", format = "format", forsake = "forsake", forspeak = "forspeak", forswear = "forswear", fortify = "fortify", fight = "fight", find = "find", foxtrot = "foxtrot", frap = "frap", frenchify = "frenchify", frenzy = "frenzy", fret = "fret", fry = "fry", frig = "frig", frit = "frit", frivol = "frivol", frog = "frog", frolic = "frolic", freeze = "freeze", fructify = "fructify", fuel = "fuel", fulfil = "fulfil", fun = "fun", funnel = "funnel", fur = "fur", gad = "gad", gag = "gag", gainsay = "gainsay", gambol = "gambol", gam = "gam", gin = "gin", gan = "gan", gap = "gap", gasify = "gasify", gas = "gas", give = "give", gel = "gel", geld = "geld", gem = "gem", get = "get", ghostwrite = "ghostwrite", gib = "gib", giddy = "giddy", giftwrap = "giftwrap", gig = "gig", gild = "gild", gip = "gip", gird = "gird", glom = "glom", glory = "glory", glorify = "glorify", glut = "glut", gnaw = "gnaw", golly = "golly", go = "go", grab = "grab", gratify = "gratify", gravel = "gravel", grave = "grave", grow = "grow", grin = "grin", grip = "grip", grit = "grit", grind = "grind", grovel = "grovel", grub = "grub", guaranty = "guaranty", gully = "gully", gum = "gum", gun = "gun", gyp = "gyp", hacksaw = "hacksaw", have = "have", ham = "ham", hamstring = "hamstring", handfeed = "handfeed", handicap = "handicap", handsel = "handsel", harry = "harry", hatchel = "hatchel", hat = "hat", hear = "hear", hedgehop = "hedgehop", hold = "hold", hem = "hem", hew = "hew", hiccup = "hiccup", hide = "hide", hinny = "hinny", hit = "hit", hob = "hob", hobnob = "hobnob", hocus = "hocus", hog = "hog", hogtie = "hogtie", honey = "honey", hop = "hop", horrify = "horrify", horsewhip = "horsewhip", housel = "housel", heave = "heave", hovel = "hovel", hug = "hug", humbug = "humbug", humidify = "humidify", hum = "hum", hang = "hang", hurry = "hurry", hypertrophy = "hypertrophy", identify = "identify", imbed = "imbed", impanel = "impanel", impel = "impel", imply = "imply", inbreed = "inbreed", incur = "incur", indemnify = "indemnify", indwell = "indwell", infer = "infer", initial = "initial", inlay = "inlay", inset = "inset", inspan = "inspan", install = "install", intensify = "intensify", interbreed = "interbreed", intercrop = "intercrop", intercut = "intercut", interlay = "interlay", interlap = "interlap", intermarry = "intermarry", intermit = "intermit", interplead = "interplead", inter = "inter", interstratify = "interstratify", interweave = "interweave", intromit = "intromit", inweave = "inweave", inwrap = "inwrap", jab = "jab", jag = "jag", jam = "jam", japan = "japan", jar = "jar", jelly = "jelly", jellify = "jellify", jemmy = "jemmy", jet = "jet", jewel = "jewel", jib = "jib", jig = "jig", jimmy = "jimmy", jitterbug = "jitterbug", job = "job", jog = "jog", jolly = "jolly", jollify = "jollify", jot = "jot", joypop = "joypop", jug = "jug", justify = "justify", jut = "jut", ken = "ken", kennel = "kennel", keep = "keep", kernel = "kernel", kid = "kid", kidnap = "kidnap", kip = "kip", knap = "knap", kneecap = "kneecap", kneel = "kneel", know = "know", knit = "knit", knob = "knob", knot = "knot", label = "label", lade = "lade", ladify = "ladify", lag = "lag", lay = "lay", lie = "lie", lallygag = "lallygag", lam = "lam", lapidify = "lapidify", lap = "lap", laurel = "laurel", lean = "lean", leapfrog = "leapfrog", leap = "leap", learn = "learn", lead = "lead", leave = "leave", lend = "lend", let1 = "let", level = "level", levy = "levy", libel = "libel", lignify = "lignify", lip = "lip", liquefy = "liquefy", liquify = "liquify", light = "light", lob = "lob", lobby = "lobby", log$1 = "log", lop = "lop", lose = "lose", lot = "lot", lug = "lug", lullaby = "lullaby", mad = "mad", make = "make", magnify = "magnify", man = "man", manumit = "manumit", map = "map", marcel = "marcel", mar = "mar", marry = "marry", marshal = "marshal", marvel = "marvel", mat = "mat", mean = "mean", medal = "medal", meet = "meet", metal = "metal", metrify = "metrify", may = "may", mimic = "mimic", minify = "minify", misapply = "misapply", misbecome = "misbecome", miscarry = "miscarry", misdeal = "misdeal", misfit = "misfit", misgive = "misgive", mishit = "mishit", mislay = "mislay", mislead = "mislead", misplead = "misplead", misspell = "misspell", misspend = "misspend", mistake = "mistake", misunderstand = "misunderstand", mob = "mob", model$3 = "model", modify = "modify", mollify = "mollify", melt = "melt", mop = "mop", mortify = "mortify", mow = "mow", mud = "mud", muddy = "muddy", mug = "mug", multiply = "multiply", mum = "mum", mummify = "mummify", mutiny = "mutiny", mystify = "mystify", nab = "nab", nag = "nag", nap = "nap", net = "net", nib = "nib", nickel = "nickel", nidify = "nidify", nigrify = "nigrify", nip = "nip", nitrify = "nitrify", nod = "nod", nonplus = "nonplus", notify = "notify", nullify = "nullify", nut = "nut", objectify = "objectify", occupy = "occupy", occur = "occur", offset = "offset", omit = "omit", ossify = "ossify", outbid = "outbid", outbreed = "outbreed", outcry = "outcry", outcrop = "outcrop", outdo = "outdo", outdraw = "outdraw", outfit = "outfit", outfight = "outfight", outgas = "outgas", outgeneral = "outgeneral", outgo = "outgo", outgrow = "outgrow", outlay = "outlay", outman = "outman", output = "output", outrun = "outrun", outride = "outride", outshine = "outshine", outshoot = "outshoot", outsell = "outsell", outspan = "outspan", outstand = "outstand", outstrip = "outstrip", outthink = "outthink", outwit = "outwit", outwear = "outwear", overbid = "overbid", overblow = "overblow", overbear = "overbear", overbuild = "overbuild", overcome = "overcome", overcrop = "overcrop", overdo = "overdo", overdraw = "overdraw", overdrive = "overdrive", overfly = "overfly", overflow = "overflow", overgrow = "overgrow", overhear = "overhear", overhang = "overhang", overlay = "overlay", overlie = "overlie", overlap = "overlap", overman = "overman", overpay = "overpay", overpass = "overpass", overrun = "overrun", override = "override", oversee = "oversee", overset = "overset", oversew = "oversew", overshoot = "overshoot", oversimplify = "oversimplify", oversleep = "oversleep", oversell = "oversell", overspend = "overspend", overspill = "overspill", overstep = "overstep", overtake = "overtake", overthrow = "overthrow", overtop = "overtop", overwind = "overwind", overwrite = "overwrite", pacify = "pacify", pad = "pad", pay = "pay", pal = "pal", palsy = "palsy", pandy = "pandy", panel = "panel", panic = "panic", pan = "pan", parallel = "parallel", parcel = "parcel", parody = "parody", parry = "parry", partake = "partake", pasquinade = "pasquinade", patrol = "patrol", pat = "pat", pedal = "pedal", peg = "peg", pencil = "pencil", pen = "pen", pep = "pep", permit = "permit", personify = "personify", petrify = "petrify", pet = "pet", pettifog = "pettifog", phantasy = "phantasy", photocopy = "photocopy", photomap = "photomap", photoset = "photoset", physic = "physic", picnic = "picnic", pig = "pig", pillory = "pillory", pin = "pin", pip = "pip", pistol = "pistol", pitapat = "pitapat", pity = "pity", pit = "pit", plan = "plan", plat = "plat", plead = "plead", ply = "ply", plod = "plod", plop = "plop", plot = "plot", plug = "plug", pod = "pod", pommel = "pommel", popes = "popes", pop = "pop", pot = "pot", preachify = "preachify", precancel = "precancel", prefer = "prefer", preoccupy = "preoccupy", prepay = "prepay", presignify = "presignify", pretermit = "pretermit", pretty = "pretty", prettify$2 = "prettify", pry = "pry", prig = "prig", prim = "prim", prod = "prod", program = "program", prologue = "prologue", propel = "propel", prophesy = "prophesy", prop = "prop", prove = "prove", pub = "pub", pug = "pug", pummel = "pummel", pun = "pun", pup = "pup", purify = "purify", putrefy = "putrefy", putty = "putty", put = "put", qualify = "qualify", quantify = "quantify", quarrel = "quarrel", quarry = "quarry", quartersaw = "quartersaw", query = "query", quickstep = "quickstep", quip = "quip", quit = "quit", quiz = "quiz", rag = "rag", rally = "rally", ramify = "ramify", ram = "ram", run = "run", ring = "ring", rap = "rap", rappel = "rappel", rarefy = "rarefy", ratify = "ratify", rat = "rat", ravel = "ravel", rebel = "rebel", rebuild = "rebuild", rebut = "rebut", recap = "recap", reclassify = "reclassify", recommit = "recommit", recopy = "recopy", rectify = "rectify", recur = "recur", red = "red", redo = "redo", refer = "refer", refit = "refit", reave = "reave", refuel = "refuel", regret = "regret", rehear = "rehear", reify = "reify", rely = "rely", remake = "remake", remarry = "remarry", remit = "remit", rend = "rend", repay = "repay", repel = "repel", replevy = "replevy", reply = "reply", repot = "repot", rerun = "rerun", resit = "resit", reset = "reset", resew = "resew", retake = "retake", rethink = "rethink", retell = "retell", retransmit = "retransmit", retry = "retry", retrofit = "retrofit", ret = "ret", reunify = "reunify", revel = "revel", revet = "revet", revivify = "revivify", rev = "rev", rewind = "rewind", rewrite = "rewrite", rib = "rib", ricochet = "ricochet", rid = "rid", ride = "ride", rig = "rig", rigidify = "rigidify", rim = "rim", rip = "rip", rise = "rise", rival = "rival", rive = "rive", rob = "rob", rot = "rot", reeve = "reeve", rowel = "rowel", rub = "rub", rut = "rut", saccharify = "saccharify", sag = "sag", say = "say", salary = "salary", salify = "salify", sally = "sally", sanctify = "sanctify", sandbag = "sandbag", sing = "sing", sink = "sink", saponify = "saponify", sap = "sap", sit = "sit", satisfy = "satisfy", savvy = "savvy", see = "see", saw = "saw", scag = "scag", scan = "scan", scarify = "scarify", scar = "scar", scat = "scat", scorify = "scorify", scrag = "scrag", scram = "scram", scrap = "scrap", scry = "scry", scrub = "scrub", scrum = "scrum", scud = "scud", scum = "scum", scurry = "scurry", seed = "seed", send = "send", set = "set", sew = "sew", shag = "shag", shake = "shake", sham = "sham", sharecrop = "sharecrop", shit = "shit", shave = "shave", shed = "shed", shellac = "shellac", shend = "shend", shew = "shew", shy = "shy", shikar = "shikar", shillyshally = "shillyshally", shim = "shim", shimmy = "shimmy", shin = "shin", ship = "ship", shoe = "shoe", shine = "shine", shop = "shop", shoot = "shoot", shotgun = "shotgun", shot = "shot", shovel = "shovel", show = "show", shrink = "shrink", shred = "shred", shrivel = "shrivel", shrive = "shrive", shrug = "shrug", shun = "shun", shut = "shut", sic = "sic", sideslip = "sideslip", sidestep = "sidestep", sightsee = "sightsee", signal = "signal", signify = "signify", silicify = "silicify", simplify = "simplify", sin = "sin", sip = "sip", shear = "shear", skelly = "skelly", sken = "sken", sket = "sket", skid = "skid", skim = "skim", skin = "skin", skip = "skip", skivvy = "skivvy", skydive = "skydive", slab$1 = "slab", slag = "slag", slay = "slay", slam = "slam", slap = "slap", slat = "slat", sled = "sled", sleep = "sleep", slide = "slide", slip = "slip", slit = "slit", slog = "slog", slop = "slop", slot = "slot", slug = "slug", slum = "slum", sling = "sling", slink = "slink", slur = "slur", smell = "smell", smite = "smite", smut = "smut", snag = "snag", snap = "snap", sned = "sned", snip = "snip", snivel = "snivel", snog = "snog", snub = "snub", sneak = "sneak", snug = "snug", sob = "sob", sod = "sod", sell = "sell", solemnify = "solemnify", solidify = "solidify", soothsay = "soothsay", sop = "sop", seek = "seek", sow = "sow", spag = "spag", spancel = "spancel", span = "span", spar = "spar", spit = "spit", spat = "spat", specify = "specify", speed = "speed", speechify = "speechify", spellbind = "spellbind", spell = "spell", spend = "spend", spy = "spy", spill = "spill", spin = "spin", spiral = "spiral", split = "split", spoil = "spoil", speak = "speak", spotlight = "spotlight", spot = "spot", spring = "spring", sprig = "sprig", spud = "spud", spur = "spur", squat = "squat", squib = "squib", squid = "squid", squeegee = "squeegee", stab = "stab", stink = "stink", star = "star", steady = "steady", stellify = "stellify", stem$2 = "stem", stencil = "stencil", step = "step", stet = "stet", sty = "sty", stiletto = "stiletto", stir = "stir", steal = "steal", stand = "stand", stop = "stop", story = "story", stot = "stot", stave = "stave", strap = "strap", stratify = "stratify", strew = "strew", stride = "stride", strip = "strip", strive = "strive", strop = "strop", strow = "strow", strike = "strike", strum = "strum", string = "string", strut = "strut", stub = "stub", stick = "stick", stud = "stud", study = "study", stultify = "stultify", stum = "stum", sting = "sting", stun = "stun", stupefy = "stupefy", stymie = "stymie", sub = "sub", subjectify = "subjectify", sublet = "sublet", submit = "submit", subtotal = "subtotal", sully = "sully", sulphuret = "sulphuret", sum = "sum", sun = "sun", sup = "sup", supply = "supply", swab = "swab", swag = "swag", swim = "swim", swap = "swap", swat = "swat", sweep = "sweep", swig = "swig", swivel = "swivel", swell = "swell", swear = "swear", swot = "swot", swing = "swing", syllabify = "syllabify", symbol = "symbol", tab = "tab", tag = "tag", take = "take", talc = "talc", tally = "tally", tammy = "tammy", tan = "tan", tap = "tap", tar = "tar", tarry = "tarry", tassel = "tassel", tat = "tat", teach = "teach", taxis = "taxis", taxi = "taxi", teasel = "teasel", ted = "ted", tepefy = "tepefy", terrify = "terrify", testes = "testes", testify = "testify", thin = "thin", think = "think", throw1 = "throw", thrive = "thrive", throb = "throb", thrum = "thrum", thud = "thud", tidy = "tidy", tin = "tin", tinsel = "tinsel", tip = "tip", tittup = "tittup", toady = "toady", tog = "tog", tell = "tell", top = "top", tear = "tear", torrefy = "torrefy", total = "total", tot = "tot", towel = "towel", traffic = "traffic", trammel = "trammel", tram = "tram", transfer = "transfer", transfix = "transfix", transship = "transship", tranship = "tranship", transmit = "transmit", transmogrify = "transmogrify", trapan = "trapan", trap = "trap", travel = "travel", travesty = "travesty", trek = "trek", trepan = "trepan", try1 = "try", trig = "trig", trim = "trim", trip = "trip", tread = "tread", trog = "trog", trot = "trot", trowel = "trowel", tug = "tug", tumefy = "tumefy", tun = "tun", tunnel = "tunnel", tup = "tup", twig = "twig", twin = "twin", twit = "twit", tie = "tie", typeset = "typeset", typewrite = "typewrite", typify = "typify", uglify = "uglify", unbar = "unbar", unbend = "unbend", unbind = "unbind", uncap = "uncap", unclothe = "unclothe", unclog = "unclog", underbid = "underbid", underbuy = "underbuy", undercut = "undercut", underfeed = "underfeed", undergird = "undergird", undergo = "undergo", underlay = "underlay", underlie = "underlie", underlet = "underlet", underpay = "underpay", underpin = "underpin", underprop = "underprop", underset = "underset", undershoot = "undershoot", undersell = "undersell", understand = "understand", understudy = "understudy", undertake = "undertake", underwrite = "underwrite", undo = "undo", unfit = "unfit", unfreeze = "unfreeze", unify = "unify", unkennel = "unkennel", unknit = "unknit", unlay = "unlay", unlearn = "unlearn", unmake = "unmake", unman = "unman", unpeg = "unpeg", unpin = "unpin", unplug = "unplug", unravel = "unravel", unrig = "unrig", unrip = "unrip", unreeve = "unreeve", unsay = "unsay", unship = "unship", unsling = "unsling", unsnap = "unsnap", unspeak = "unspeak", unsteady = "unsteady", unstep = "unstep", unstop = "unstop", unstring = "unstring", unstick = "unstick", unswear = "unswear", unteach = "unteach", unthink = "unthink", untidy = "untidy", untread = "untread", untie = "untie", unwind = "unwind", unwrap$1 = "unwrap", unzip = "unzip", upbuild = "upbuild", uphold = "uphold", upheave = "upheave", up = "up", uppercut = "uppercut", uprise = "uprise", upset = "upset", upspring = "upspring", upsweep = "upsweep", upswell = "upswell", upswing = "upswing", vag = "vag", vary = "vary", vat = "vat", verbify = "verbify", verify = "verify", versify = "versify", vet = "vet", victual = "victual", vilify = "vilify", vitrify = "vitrify", vitriol = "vitriol", vivify = "vivify", vie = "vie", wad = "wad", waddy = "waddy", wadset = "wadset", wag = "wag", wan = "wan", war = "war", waylay = "waylay", weary = "weary", weatherstrip = "weatherstrip", web = "web", wed = "wed", weed = "weed", weep = "weep", wet = "wet", wham = "wham", whap = "whap", whet = "whet", whinny = "whinny", whip = "whip", whipsaw = "whipsaw", whir = "whir", whiz = "whiz", whop = "whop", wig = "wig", wigwag = "wigwag", wildcat = "wildcat", will = "will", win = "win", winterfeed = "winterfeed", wiredraw = "wiredraw", withdraw = "withdraw", withhold = "withhold", withstand = "withstand", wake = "wake", won = "won", wear = "wear", worry = "worry", worship = "worship", wind = "wind", weave = "weave", wrap$2 = "wrap", wry = "wry", write = "write", work = "work", wring = "wring", yak = "yak", yap = "yap", yen = "yen", yodel = "yodel", zap = "zap", zigzag = "zigzag", zip = "zip";
147823
+ exceptions$1.abetted = abet, exceptions$1.abetting = abet, exceptions$1.abhorred = abhor, exceptions$1.abhorring = abhor, exceptions$1.abode = abide, exceptions$1.abought = aby, exceptions$1.abutted = abut, exceptions$1.abutting = abut, exceptions$1.abye = aby, exceptions$1.accompanied = accompany, exceptions$1.acetified = acetify, exceptions$1.acidified = acidify, exceptions$1.acquitted = acquit, exceptions$1.acquitting = acquit, exceptions$1.addrest = address, exceptions$1.admitted = admit, exceptions$1.admitting = admit, exceptions$1.aerified = aerify, exceptions$1.airdropped = airdrop, exceptions$1.airdropping = airdrop, exceptions$1.alkalified = alkalify, exceptions$1.allied = ally, exceptions$1.allotted = allot, exceptions$1.allotting = allot, exceptions$1.am = be, exceptions$1.ammonified = ammonify, exceptions$1.amnestied = amnesty, exceptions$1.amplified = amplify, exceptions$1.anglified = anglify, exceptions$1.annulled = annul, exceptions$1.annulling = annul, exceptions$1.appalled = appal, exceptions$1.appalling = appal, exceptions$1.applied = apply, exceptions$1.arcked = arc, exceptions$1.arcking = arc, exceptions$1.are = be, exceptions$1.argufied = argufy, exceptions$1.arisen = arise, exceptions$1.arose = arise, exceptions$1.ate = eat, exceptions$1.atrophied = atrophy, exceptions$1.averred = aver, exceptions$1.averring = aver, exceptions$1.awoke = awake, exceptions$1.awoken = awake, exceptions$1.babied = baby, exceptions$1.backbit = backbite, exceptions$1.backbitten = backbite, exceptions$1.backslid = backslide, exceptions$1.backslidden = backslide, exceptions$1.bade = bid, exceptions$1.bagged = bag, exceptions$1.bagging = bag, exceptions$1.ballyragged = ballyrag, exceptions$1.ballyragging = ballyrag, exceptions$1.bandied = bandy, exceptions$1.banned = ban, exceptions$1.banning = ban, exceptions$1.barred = bar, exceptions$1.barrelled = barrel, exceptions$1.barrelling = barrel, exceptions$1.barring = bar, exceptions$1.basified = basify, exceptions$1.batted = bat, exceptions$1.batting = bat, exceptions$1.bayonetted = bayonet, exceptions$1.bayonetting = bayonet, exceptions$1.beaten = beat, exceptions$1.beatified = beatify, exceptions$1.beautified = beautify, exceptions$1.became = become, exceptions$1.bed = bed, exceptions$1.bedded = bed, exceptions$1.bedding = bed, exceptions$1.bedevilled = bedevil, exceptions$1.bedevilling = bedevil, exceptions$1.bedimmed = bedim, exceptions$1.bedimming = bedim, exceptions$1.been = be, exceptions$1.befallen = befall, exceptions$1.befell = befall, exceptions$1.befitted = befit, exceptions$1.befitting = befit, exceptions$1.befogged = befog, exceptions$1.befogging = befog, exceptions$1.began = begin, exceptions$1.begat = beget, exceptions$1.begetting = beget, exceptions$1.begged = beg, exceptions$1.begging = beg, exceptions$1.beginning = begin, exceptions$1.begirt = begird, exceptions$1.begot = beget, exceptions$1.begotten = beget, exceptions$1.begun = begin, exceptions$1.beheld = behold, exceptions$1.beholden = behold, exceptions$1.bejewelled = bejewel, exceptions$1.bejewelling = bejewel, exceptions$1.bellied = belly, exceptions$1.belying = belie, exceptions$1.benefitted = benefit, exceptions$1.benefitting = benefit, exceptions$1.benempt = bename, exceptions$1.bent = bend, exceptions$1.berried = berry, exceptions$1.besetting = beset, exceptions$1.besought = beseech, exceptions$1.bespoke = bespeak, exceptions$1.bespoken = bespeak, exceptions$1.bestirred = bestir, exceptions$1.bestirring = bestir, exceptions$1.bestrewn = bestrew, exceptions$1.bestrid = bestride, exceptions$1.bestridden = bestride, exceptions$1.bestrode = bestride, exceptions$1.betaken = betake, exceptions$1.bethought = bethink, exceptions$1.betook = betake, exceptions$1.betted = bet, exceptions$1.betting = bet, exceptions$1.bevelled = bevel, exceptions$1.bevelling = bevel, exceptions$1.biassed = bias, exceptions$1.biassing = bias, exceptions$1.bidden = bid, exceptions$1.bidding = bid, exceptions$1.bing = bing, exceptions$1.binned = bin, exceptions$1.binning = bin, exceptions$1.bit = bite, exceptions$1.bitted = bit, exceptions$1.bitten = bite, exceptions$1.bitting = bit, exceptions$1.bivouacked = bivouac, exceptions$1.bivouacking = bivouac, exceptions$1.blabbed = blab, exceptions$1.blabbing = blab, exceptions$1.blackberried = blackberry, exceptions$1.blacklegged = blackleg, exceptions$1.blacklegging = blackleg, exceptions$1.blatted = blat, exceptions$1.blatting = blat, exceptions$1.bled = bleed, exceptions$1.blest = bless, exceptions$1.blew = blow, exceptions$1.blipped = blip, exceptions$1.blipping = blip, exceptions$1.blobbed = blob, exceptions$1.blobbing = blob, exceptions$1.bloodied = bloody, exceptions$1.blotted = blot, exceptions$1.blotting = blot, exceptions$1.blown = blow, exceptions$1.blubbed = blub, exceptions$1.blubbing = blub, exceptions$1.blurred = blur, exceptions$1.blurring = blur, exceptions$1.bobbed = bob, exceptions$1.bobbing = bob, exceptions$1.bodied = body, exceptions$1.bootlegged = bootleg, exceptions$1.bootlegging = bootleg, exceptions$1.bopped = bop, exceptions$1.bopping = bop, exceptions$1.bore = bear, exceptions$1.born = bear, exceptions$1.borne = bear, exceptions$1.bought = buy, exceptions$1.bound = bind, exceptions$1.bragged = brag, exceptions$1.bragging = brag, exceptions$1.bred = breed, exceptions$1.brevetted = brevet, exceptions$1.brevetting = brevet, exceptions$1.brimmed = brim, exceptions$1.brimming = brim, exceptions$1.broke = break1, exceptions$1.broken = break1, exceptions$1.brought = bring, exceptions$1.browbeaten = browbeat, exceptions$1.brutified = brutify, exceptions$1.budded = bud, exceptions$1.budding = bud, exceptions$1.bugged = bug, exceptions$1.bugging = bug, exceptions$1.built = build, exceptions$1.bulldogging = bulldog, exceptions$1.bullied = bully, exceptions$1.bullshitted = bullshit, exceptions$1.bullshitting = bullshit, exceptions$1.bullwhipped = bullwhip, exceptions$1.bullwhipping = bullwhip, exceptions$1.bullyragged = bullyrag, exceptions$1.bullyragging = bullyrag, exceptions$1.bummed = bum, exceptions$1.bumming = bum, exceptions$1.buried = bury, exceptions$1.burnt = burn, exceptions$1.burred = bur, exceptions$1.burring = bur, exceptions$1.bushelled = bushel, exceptions$1.bushelling = bushel, exceptions$1.busied = busy, exceptions$1.bypast = bypass, exceptions$1.caballed = cabal, exceptions$1.caballing = cabal, exceptions$1.caddied = caddy, exceptions$1.caddies = caddy, exceptions$1.caddying = caddy, exceptions$1.calcified = calcify, exceptions$1.came = come, exceptions$1.canalled = canal, exceptions$1.canalling = canal, exceptions$1.cancelled = cancel, exceptions$1.cancelling = cancel, exceptions$1.candied = candy, exceptions$1.canned = can, exceptions$1.canning = can, exceptions$1.canopied = canopy, exceptions$1.capped = cap, exceptions$1.capping = cap, exceptions$1.carburetted = carburet, exceptions$1.carburetting = carburet, exceptions$1.carillonned = carillon, exceptions$1.carillonning = carillon, exceptions$1.carnied = carny, exceptions$1.carnified = carnify, exceptions$1.carolled = carol, exceptions$1.carolling = carol, exceptions$1.carried = carry, exceptions$1.casefied = casefy, exceptions$1.catnapped = catnap, exceptions$1.catnapping = catnap, exceptions$1.catted = cat, exceptions$1.catting = cat, exceptions$1.caught = catch1, exceptions$1.cavilled = cavil, exceptions$1.cavilling = cavil, exceptions$1.certified = certify, exceptions$1.channelled = channel, exceptions$1.channelling = channel, exceptions$1.chapped = chap, exceptions$1.chapping = chap, exceptions$1.charred = char, exceptions$1.charring = char, exceptions$1.chatted = chat, exceptions$1.chatting = chat, exceptions$1.chevied = chivy, exceptions$1.chevies = chivy, exceptions$1.chevying = chivy, exceptions$1.chid = chide, exceptions$1.chidden = chide, exceptions$1.chinned = chin, exceptions$1.chinning = chin, exceptions$1.chipped = chip, exceptions$1.chipping = chip, exceptions$1.chiselled = chisel, exceptions$1.chiselling = chisel, exceptions$1.chitchatted = chitchat, exceptions$1.chitchatting = chitchat, exceptions$1.chivied = chivy, exceptions$1.chivved = chiv, exceptions$1.chivvied = chivy, exceptions$1.chivvies = chivy, exceptions$1.chivving = chiv, exceptions$1.chivvying = chivy, exceptions$1.chondrified = chondrify, exceptions$1.chopped = chop, exceptions$1.chopping = chop, exceptions$1.chose = choose, exceptions$1.chosen = choose, exceptions$1.chugged = chug, exceptions$1.chugging = chug, exceptions$1.chummed = chum, exceptions$1.chumming = chum, exceptions$1.citified = citify, exceptions$1.clad = clothe, exceptions$1.cladded = clad, exceptions$1.cladding = clad, exceptions$1.clammed = clam, exceptions$1.clamming = clam, exceptions$1.clapped = clap, exceptions$1.clapping = clap, exceptions$1.clarified = clarify, exceptions$1.classified = classify, exceptions$1.cleft = cleave, exceptions$1.clemmed = clem, exceptions$1.clemming = clem, exceptions$1.clept = clepe, exceptions$1.clipped = clip$1, exceptions$1.clipping = clip$1, exceptions$1.clogged = clog, exceptions$1.clogging = clog, exceptions$1.clopped = clop, exceptions$1.clopping = clop, exceptions$1.clotted = clot, exceptions$1.clotting = clot, exceptions$1.clove = cleave, exceptions$1.cloven = cleave, exceptions$1.clubbed = club, exceptions$1.clubbing = club, exceptions$1.clung = cling, exceptions$1.cockneyfied = cockneyfy, exceptions$1.codded = cod, exceptions$1.codding = cod, exceptions$1.codified = codify, exceptions$1.cogged = cog, exceptions$1.cogging = cog, exceptions$1.coiffed = coif, exceptions$1.coiffing = coif, exceptions$1.collied = colly, exceptions$1.combatted = combat, exceptions$1.combatting = combat, exceptions$1.committed = commit, exceptions$1.committing = commit, exceptions$1.compelled = compel, exceptions$1.compelling = compel, exceptions$1.complied = comply, exceptions$1.complotted = complot, exceptions$1.complotting = complot, exceptions$1.concurred = concur, exceptions$1.concurring = concur, exceptions$1.confabbed = confab, exceptions$1.confabbing = confab, exceptions$1.conferred = confer, exceptions$1.conferring = confer, exceptions$1.conned = con, exceptions$1.conning = con, exceptions$1.controlled = control, exceptions$1.controlling = control, exceptions$1.copied = copy, exceptions$1.copped = cop, exceptions$1.copping = cop, exceptions$1.coquetted = coquet, exceptions$1.coquetting = coquet, exceptions$1.corralled = corral, exceptions$1.corralling = corral, exceptions$1.could = can, exceptions$1.counselled = counsel, exceptions$1.counselling = counsel, exceptions$1.counterplotted = counterplot, exceptions$1.counterplotting = counterplot, exceptions$1.countersank = countersink, exceptions$1.countersunk = countersink, exceptions$1.crabbed = crab, exceptions$1.crabbing = crab, exceptions$1.crammed = cram, exceptions$1.cramming = cram, exceptions$1.crapped = crap, exceptions$1.crapping = crap, exceptions$1.creeped = creep, exceptions$1.crept = creep, exceptions$1.cribbed = crib, exceptions$1.cribbing = crib, exceptions$1.cried = cry, exceptions$1.cropped = crop, exceptions$1.cropping = crop, exceptions$1.crossbred = crossbreed, exceptions$1.crosscutting = crosscut, exceptions$1.crucified = crucify, exceptions$1.cubbed = cub, exceptions$1.cubbing = cub, exceptions$1.cudgelled = cudgel, exceptions$1.cudgelling = cudgel, exceptions$1.cupelled = cupel, exceptions$1.cupelling = cupel, exceptions$1.cupped = cup, exceptions$1.cupping = cup, exceptions$1.curetted = curet, exceptions$1.curettes = curet, exceptions$1.curetting = curet, exceptions$1.curried = curry, exceptions$1.curst = curse, exceptions$1.curtsied = curtsy, exceptions$1.curvetted = curvet, exceptions$1.curvetting = curvet, exceptions$1.cutting = cut, exceptions$1.dabbed = dab, exceptions$1.dabbing = dab, exceptions$1.dagged = dag, exceptions$1.dagging = dag, exceptions$1.dallied = dally, exceptions$1.dammed = dam, exceptions$1.damming = dam, exceptions$1.damnified = damnify, exceptions$1.dandified = dandify, exceptions$1.dapped = dap, exceptions$1.dapping = dap, exceptions$1.dealt = deal, exceptions$1.debarred = debar, exceptions$1.debarring = debar, exceptions$1.debugged = debug, exceptions$1.debugging = debug, exceptions$1.debussed = debus, exceptions$1.debusses = debus, exceptions$1.debussing = debus, exceptions$1.decalcified = decalcify, exceptions$1.declassified = declassify, exceptions$1.decontrolled = decontrol, exceptions$1.decontrolling = decontrol, exceptions$1.decried = decry, exceptions$1.deferred = defer, exceptions$1.deferring = defer, exceptions$1.defied = defy, exceptions$1.degassed = degas, exceptions$1.degasses = degas, exceptions$1.degassing = degas, exceptions$1.dehumidified = dehumidify, exceptions$1.deified = deify, exceptions$1.demitted = demit, exceptions$1.demitting = demit, exceptions$1.demobbed = demob, exceptions$1.demobbing = demob, exceptions$1.demulsified = demulsify, exceptions$1.demurred = demur, exceptions$1.demurring = demur, exceptions$1.demystified = demystify, exceptions$1.denazified = denazify, exceptions$1.denied = deny, exceptions$1.denitrified = denitrify, exceptions$1.denned = den, exceptions$1.denning = den, exceptions$1.descried = descry, exceptions$1.deterred = deter, exceptions$1.deterring = deter, exceptions$1.detoxified = detoxify, exceptions$1.devilled = devil, exceptions$1.devilling = devil, exceptions$1.devitrified = devitrify, exceptions$1.diagrammed = diagram, exceptions$1.diagramming = diagram, exceptions$1.dialled = dial, exceptions$1.dialling = dial, exceptions$1.dibbed = dib, exceptions$1.dibbing = dib, exceptions$1.did = do1, exceptions$1.digging = dig, exceptions$1.dignified = dignify, exceptions$1.dimmed = dim, exceptions$1.dimming = dim, exceptions$1.dinned = din, exceptions$1.dinning = din, exceptions$1.dipped = dip, exceptions$1.dipping = dip, exceptions$1.dirtied = dirty, exceptions$1.disannulled = disannul, exceptions$1.disannulling = disannul, exceptions$1.disbarred = disbar, exceptions$1.disbarring = disbar, exceptions$1.disbudded = disbud, exceptions$1.disbudding = disbud, exceptions$1.disembodied = disembody, exceptions$1.disembowelled = disembowel, exceptions$1.disembowelling = disembowel, exceptions$1.disenthralled = disenthral, exceptions$1.disenthralling = disenthral, exceptions$1.disenthralls = disenthral, exceptions$1.disenthrals = disenthrall, exceptions$1.dishevelled = dishevel, exceptions$1.dishevelling = dishevel, exceptions$1.disinterred = disinter, exceptions$1.disinterring = disinter, exceptions$1.dispelled = dispel, exceptions$1.dispelling = dispel, exceptions$1.disqualified = disqualify, exceptions$1.dissatisfied = dissatisfy, exceptions$1.distilled = distil, exceptions$1.distilling = distil, exceptions$1.diversified = diversify, exceptions$1.divvied = divvy, exceptions$1.dizzied = dizzy, exceptions$1.does = do1, exceptions$1.dogged = dog, exceptions$1.dogging = dog, exceptions$1.doglegged = dogleg, exceptions$1.doglegging = dogleg, exceptions$1.dollied = dolly, exceptions$1.done = do1, exceptions$1.donned = don, exceptions$1.donning = don, exceptions$1.dotted = dot, exceptions$1.dotting = dot, exceptions$1.dought = dow, exceptions$1.dove = dive, exceptions$1.drabbed = drab, exceptions$1.drabbing = drab, exceptions$1.dragged = drag, exceptions$1.dragging = drag, exceptions$1.drank = drink, exceptions$1.drawn = draw, exceptions$1.dreamt = dream, exceptions$1.drew = draw, exceptions$1.dried = dry, exceptions$1.dripped = drip, exceptions$1.dripping = drip, exceptions$1.drivelled = drivel, exceptions$1.drivelling = drivel, exceptions$1.driven = drive, exceptions$1.dropped = drop, exceptions$1.dropping = drop, exceptions$1.drove = drive, exceptions$1.drubbed = drub, exceptions$1.drubbing = drub, exceptions$1.drugged = drug, exceptions$1.drugging = drug, exceptions$1.drummed = drum, exceptions$1.drumming = drum, exceptions$1.drunk = drink, exceptions$1.dubbed = dub, exceptions$1.dubbing = dub, exceptions$1.duelled = duel, exceptions$1.duelling = duel, exceptions$1.dug = dig, exceptions$1.dulcified = dulcify, exceptions$1.dummied = dummy, exceptions$1.dunned = dun, exceptions$1.dunning = dun, exceptions$1.dwelt = dwell, exceptions$1.dying = die, exceptions$1.easied = easy, exceptions$1.eaten = eat, exceptions$1.eavesdropped = eavesdrop, exceptions$1.eavesdropping = eavesdrop, exceptions$1.eddied = eddy, exceptions$1.edified = edify, exceptions$1.electrified = electrify, exceptions$1.embedded = embed, exceptions$1.embedding = embed, exceptions$1.embodied = embody, exceptions$1.embussed = embus, exceptions$1.embusses = embus, exceptions$1.embussing = embus, exceptions$1.emitted = emit, exceptions$1.emitting = emit, exceptions$1.empanelled = empanel, exceptions$1.empanelling = empanel, exceptions$1.emptied = empty, exceptions$1.emulsified = emulsify, exceptions$1.enamelled = enamel, exceptions$1.enamelling = enamel, exceptions$1.englutted = englut, exceptions$1.englutting = englut, exceptions$1.enrolled = enrol, exceptions$1.enrolling = enrol, exceptions$1.enthralled = enthral, exceptions$1.enthralling = enthral, exceptions$1.entrammelled = entrammel, exceptions$1.entrammelling = entrammel, exceptions$1.entrapped = entrap, exceptions$1.entrapping = entrap, exceptions$1.envied = envy, exceptions$1.enwound = enwind, exceptions$1.enwrapped = enwrap, exceptions$1.enwrapping = enwrap, exceptions$1.equalled = equal, exceptions$1.equalling = equal, exceptions$1.equipped = equip, exceptions$1.equipping = equip, exceptions$1.espied = espy, exceptions$1.esterified = esterify, exceptions$1.estopped = estop, exceptions$1.estopping = estop, exceptions$1.etherified = etherify, exceptions$1.excelled = excel, exceptions$1.excelling = excel, exceptions$1.exemplified = exemplify, exceptions$1.expelled = expel, exceptions$1.expelling = expel, exceptions$1.extolled = extol, exceptions$1.extolling = extol, exceptions$1.facetted = facet, exceptions$1.facetting = facet, exceptions$1.fagged = fag, exceptions$1.fagging = fag, exceptions$1.fallen = fall, exceptions$1.falsified = falsify, exceptions$1.fancied = fancy, exceptions$1.fanned = fan, exceptions$1.fanning = fan, exceptions$1.fantasied = fantasy, exceptions$1.fatted = fat, exceptions$1.fatting = fat, exceptions$1.featherbedded = featherbed, exceptions$1.featherbedding = featherbed, exceptions$1.fed = feed, exceptions$1.feed = feed, exceptions$1.fell = fall, exceptions$1.felt = feel, exceptions$1.ferried = ferry, exceptions$1.fibbed = fib, exceptions$1.fibbing = fib, exceptions$1.figged = fig, exceptions$1.figging = fig, exceptions$1.finned = fin, exceptions$1.finning = fin, exceptions$1.fitted = fit, exceptions$1.fitting = fit, exceptions$1.flagged = flag, exceptions$1.flagging = flag, exceptions$1.flammed = flam, exceptions$1.flamming = flam, exceptions$1.flannelled = flannel, exceptions$1.flannelling = flannel, exceptions$1.flapped = flap, exceptions$1.flapping = flap, exceptions$1.flatted = flat, exceptions$1.flatting = flat, exceptions$1.fled = flee, exceptions$1.flew = fly, exceptions$1.flimflammed = flimflam, exceptions$1.flimflamming = flimflam, exceptions$1.flipped = flip, exceptions$1.flipping = flip, exceptions$1.flitted = flit, exceptions$1.flitting = flit, exceptions$1.flogged = flog, exceptions$1.flogging = flog, exceptions$1.floodlit = floodlight, exceptions$1.flopped = flop, exceptions$1.flopping = flop, exceptions$1.flown = fly, exceptions$1.flubbed = flub, exceptions$1.flubbing = flub, exceptions$1.flung = fling, exceptions$1.flurried = flurry, exceptions$1.flyblew = flyblow, exceptions$1.flyblown = flyblow, exceptions$1.fobbed = fob, exceptions$1.fobbing = fob, exceptions$1.fogged = fog, exceptions$1.fogging = fog, exceptions$1.footslogged = footslog, exceptions$1.footslogging = footslog, exceptions$1.forbad = forbid, exceptions$1.forbade = forbid, exceptions$1.forbidden = forbid, exceptions$1.forbidding = forbid, exceptions$1.forbore = forbear, exceptions$1.forborne = forbear, exceptions$1.fordid = fordo, exceptions$1.fordone = fordo, exceptions$1.foredid = foredo, exceptions$1.foredone = foredo, exceptions$1.foregone = forego, exceptions$1.foreknew = foreknow, exceptions$1.foreknown = foreknow, exceptions$1.foreran = forerun, exceptions$1.forerunning = forerun, exceptions$1.foresaw = foresee, exceptions$1.foreseen = foresee, exceptions$1.foreshown = foreshow, exceptions$1.forespoke = forespeak, exceptions$1.forespoken = forespeak, exceptions$1.foretold = foretell, exceptions$1.forewent = forego, exceptions$1.forgave = forgive, exceptions$1.forgetting = forget, exceptions$1.forgiven = forgive, exceptions$1.forgone = forgo, exceptions$1.forgot = forget, exceptions$1.forgotten = forget, exceptions$1.formatted = format, exceptions$1.formatting = format, exceptions$1.forsaken = forsake, exceptions$1.forsook = forsake, exceptions$1.forspoke = forspeak, exceptions$1.forspoken = forspeak, exceptions$1.forswore = forswear, exceptions$1.forsworn = forswear, exceptions$1.fortified = fortify, exceptions$1.forwent = forgo, exceptions$1.fought = fight, exceptions$1.found = find, exceptions$1.foxtrotted = foxtrot, exceptions$1.foxtrotting = foxtrot, exceptions$1.frapped = frap, exceptions$1.frapping = frap, exceptions$1.frenchified = frenchify, exceptions$1.frenzied = frenzy, exceptions$1.fretted = fret, exceptions$1.fretting = fret, exceptions$1.fried = fry, exceptions$1.frigged = frig, exceptions$1.frigging = frig, exceptions$1.fritted = frit, exceptions$1.fritting = frit, exceptions$1.frivolled = frivol, exceptions$1.frivolling = frivol, exceptions$1.frogged = frog, exceptions$1.frogging = frog, exceptions$1.frolicked = frolic, exceptions$1.frolicking = frolic, exceptions$1.froze = freeze, exceptions$1.frozen = freeze, exceptions$1.fructified = fructify, exceptions$1.fuelled = fuel, exceptions$1.fuelling = fuel, exceptions$1.fulfilled = fulfil, exceptions$1.fulfilling = fulfil, exceptions$1.funned = fun, exceptions$1.funnelled = funnel, exceptions$1.funnelling = funnel, exceptions$1.funning = fun, exceptions$1.furred = fur, exceptions$1.furring = fur, exceptions$1.gadded = gad, exceptions$1.gadding = gad, exceptions$1.gagged = gag, exceptions$1.gagging = gag, exceptions$1.gainsaid = gainsay, exceptions$1.gambolled = gambol, exceptions$1.gambolling = gambol, exceptions$1.gammed = gam, exceptions$1.gamming = gam, exceptions$1.gan = gin, exceptions$1.ganned = gan, exceptions$1.ganning = gan, exceptions$1.gapped = gap, exceptions$1.gapping = gap, exceptions$1.gasified = gasify, exceptions$1.gassed = gas, exceptions$1.gasses = gas, exceptions$1.gassing = gas, exceptions$1.gave = give, exceptions$1.gelled = gel, exceptions$1.gelling = gel, exceptions$1.gelt = geld, exceptions$1.gemmed = gem, exceptions$1.gemming = gem, exceptions$1.getting = get, exceptions$1.ghostwritten = ghostwrite, exceptions$1.ghostwrote = ghostwrite, exceptions$1.gibbed = gib, exceptions$1.gibbing = gib, exceptions$1.giddied = giddy, exceptions$1.giftwrapped = giftwrap, exceptions$1.giftwrapping = giftwrap, exceptions$1.gigged = gig, exceptions$1.gigging = gig, exceptions$1.gilt = gild, exceptions$1.ginned = gin, exceptions$1.ginning = gin, exceptions$1.gipped = gip, exceptions$1.gipping = gip, exceptions$1.girt = gird, exceptions$1.given = give, exceptions$1.glommed = glom, exceptions$1.glomming = glom, exceptions$1.gloried = glory, exceptions$1.glorified = glorify, exceptions$1.glutted = glut, exceptions$1.glutting = glut, exceptions$1.gnawn = gnaw, exceptions$1.gollied = golly, exceptions$1.gone = go, exceptions$1.got = get, exceptions$1.gotten = get, exceptions$1.grabbed = grab, exceptions$1.grabbing = grab, exceptions$1.gratified = gratify, exceptions$1.gravelled = gravel, exceptions$1.gravelling = gravel, exceptions$1.graven = grave, exceptions$1.grew = grow, exceptions$1.grinned = grin, exceptions$1.grinning = grin, exceptions$1.gripped = grip, exceptions$1.gripping = grip, exceptions$1.gript = grip, exceptions$1.gritted = grit, exceptions$1.gritting = grit, exceptions$1.ground = grind, exceptions$1.grovelled = grovel, exceptions$1.grovelling = grovel, exceptions$1.grown = grow, exceptions$1.grubbed = grub, exceptions$1.grubbing = grub, exceptions$1.guarantied = guaranty, exceptions$1.gullied = gully, exceptions$1.gummed = gum, exceptions$1.gumming = gum, exceptions$1.gunned = gun, exceptions$1.gunning = gun, exceptions$1.gypped = gyp, exceptions$1.gypping = gyp, exceptions$1.hacksawn = hacksaw, exceptions$1.had = have, exceptions$1.hammed = ham, exceptions$1.hamming = ham, exceptions$1.hamstrung = hamstring, exceptions$1.handfed = handfeed, exceptions$1.handicapped = handicap, exceptions$1.handicapping = handicap, exceptions$1.handselled = handsel, exceptions$1.handselling = handsel, exceptions$1.harried = harry, exceptions$1.has = have, exceptions$1.hatchelled = hatchel;
147705
147824
  exceptions$1.hatchelling = hatchel, exceptions$1.hatted = hat, exceptions$1.hatting = hat, exceptions$1.heard = hear, exceptions$1.hedgehopped = hedgehop, exceptions$1.hedgehopping = hedgehop, exceptions$1.held = hold, exceptions$1.hemmed = hem, exceptions$1.hemming = hem, exceptions$1.hewn = hew, exceptions$1.hiccupped = hiccup, exceptions$1.hiccupping = hiccup, exceptions$1.hid = hide, exceptions$1.hidden = hide, exceptions$1.hinnied = hinny, exceptions$1.hitting = hit, exceptions$1.hobbed = hob, exceptions$1.hobbing = hob, exceptions$1.hobnobbed = hobnob, exceptions$1.hobnobbing = hobnob, exceptions$1.hocussed = hocus, exceptions$1.hocussing = hocus, exceptions$1.hogged = hog, exceptions$1.hogging = hog, exceptions$1.hogtying = hogtie, exceptions$1.honied = honey, exceptions$1.hopped = hop, exceptions$1.hopping = hop, exceptions$1.horrified = horrify, exceptions$1.horsewhipped = horsewhip, exceptions$1.horsewhipping = horsewhip, exceptions$1.houselled = housel, exceptions$1.houselling = housel, exceptions$1.hove = heave, exceptions$1.hovelled = hovel, exceptions$1.hovelling = hovel, exceptions$1.hugged = hug, exceptions$1.hugging = hug, exceptions$1.humbugged = humbug, exceptions$1.humbugging = humbug, exceptions$1.humidified = humidify, exceptions$1.hummed = hum, exceptions$1.humming = hum, exceptions$1.hung = hang, exceptions$1.hurried = hurry, exceptions$1.hypertrophied = hypertrophy, exceptions$1.identified = identify, exceptions$1.imbedded = imbed, exceptions$1.imbedding = imbed, exceptions$1.impanelled = impanel, exceptions$1.impanelling = impanel, exceptions$1.impelled = impel, exceptions$1.impelling = impel, exceptions$1.implied = imply, exceptions$1.inbred = inbreed, exceptions$1.incurred = incur, exceptions$1.incurring = incur, exceptions$1.indemnified = indemnify, exceptions$1.indwelt = indwell, exceptions$1.inferred = infer, exceptions$1.inferring = infer, exceptions$1.initialled = initial, exceptions$1.initialling = initial, exceptions$1.inlaid = inlay, exceptions$1.insetting = inset, exceptions$1.inspanned = inspan, exceptions$1.inspanning = inspan, exceptions$1.installed = install, exceptions$1.installing = install, exceptions$1.intensified = intensify, exceptions$1.interbred = interbreed, exceptions$1.intercropped = intercrop, exceptions$1.intercropping = intercrop, exceptions$1.intercutting = intercut, exceptions$1.interlaid = interlay, exceptions$1.interlapped = interlap, exceptions$1.interlapping = interlap, exceptions$1.intermarried = intermarry, exceptions$1.intermitted = intermit, exceptions$1.intermitting = intermit, exceptions$1.interpled = interplead, exceptions$1.interred = inter, exceptions$1.interring = inter, exceptions$1.interstratified = interstratify, exceptions$1.interwove = interweave, exceptions$1.interwoven = interweave, exceptions$1.intromitted = intromit, exceptions$1.intromitting = intromit, exceptions$1.inwove = inweave, exceptions$1.inwoven = inweave, exceptions$1.inwrapped = inwrap, exceptions$1.inwrapping = inwrap, exceptions$1.is = be, exceptions$1.jabbed = jab, exceptions$1.jabbing = jab, exceptions$1.jagged = jag, exceptions$1.jagging = jag, exceptions$1.jammed = jam, exceptions$1.jamming = jam, exceptions$1.japanned = japan, exceptions$1.japanning = japan, exceptions$1.jarred = jar, exceptions$1.jarring = jar, exceptions$1.jellied = jelly, exceptions$1.jellified = jellify, exceptions$1.jemmied = jemmy, exceptions$1.jetted = jet, exceptions$1.jetting = jet, exceptions$1.jewelled = jewel, exceptions$1.jewelling = jewel, exceptions$1.jibbed = jib, exceptions$1.jibbing = jib, exceptions$1.jigged = jig, exceptions$1.jigging = jig, exceptions$1.jimmied = jimmy, exceptions$1.jitterbugged = jitterbug, exceptions$1.jitterbugging = jitterbug, exceptions$1.jobbed = job, exceptions$1.jobbing = job, exceptions$1.jogged = jog, exceptions$1.jogging = jog, exceptions$1.jollied = jolly, exceptions$1.jollified = jollify, exceptions$1.jotted = jot, exceptions$1.jotting = jot, exceptions$1.joypopped = joypop, exceptions$1.joypopping = joypop, exceptions$1.jugged = jug, exceptions$1.jugging = jug, exceptions$1.justified = justify, exceptions$1.jutted = jut, exceptions$1.jutting = jut, exceptions$1.kenned = ken, exceptions$1.kennelled = kennel, exceptions$1.kennelling = kennel, exceptions$1.kenning = ken, exceptions$1.kent = ken, exceptions$1.kept = keep, exceptions$1.kernelled = kernel, exceptions$1.kernelling = kernel, exceptions$1.kidded = kid, exceptions$1.kidding = kid, exceptions$1.kidnapped = kidnap, exceptions$1.kidnapping = kidnap, exceptions$1.kipped = kip, exceptions$1.kipping = kip, exceptions$1.knapped = knap, exceptions$1.knapping = knap, exceptions$1.kneecapped = kneecap, exceptions$1.kneecapping = kneecap, exceptions$1.knelt = kneel, exceptions$1.knew = know, exceptions$1.knitted = knit, exceptions$1.knitting = knit, exceptions$1.knobbed = knob, exceptions$1.knobbing = knob, exceptions$1.knotted = knot, exceptions$1.knotting = knot, exceptions$1.known = know, exceptions$1.labelled = label, exceptions$1.labelling = label, exceptions$1.laden = lade, exceptions$1.ladyfied = ladify, exceptions$1.ladyfies = ladify, exceptions$1.ladyfying = ladify, exceptions$1.lagged = lag, exceptions$1.lagging = lag, exceptions$1.laid = lay, exceptions$1.lain = lie, exceptions$1.lallygagged = lallygag, exceptions$1.lallygagging = lallygag, exceptions$1.lammed = lam, exceptions$1.lamming = lam, exceptions$1.lapidified = lapidify, exceptions$1.lapped = lap, exceptions$1.lapping = lap, exceptions$1.laurelled = laurel, exceptions$1.laurelling = laurel, exceptions$1.lay = lie, exceptions$1.leant = lean, exceptions$1.leapfrogged = leapfrog, exceptions$1.leapfrogging = leapfrog, exceptions$1.leapt = leap, exceptions$1.learnt = learn, exceptions$1.led = lead, exceptions$1.left = leave, exceptions$1.lent = lend, exceptions$1.letting = let1, exceptions$1.levelled = level, exceptions$1.levelling = level, exceptions$1.levied = levy, exceptions$1.libelled = libel, exceptions$1.libelling = libel, exceptions$1.lignified = lignify, exceptions$1.lipped = lip, exceptions$1.lipping = lip, exceptions$1.liquefied = liquefy, exceptions$1.liquified = liquify, exceptions$1.lit = light, exceptions$1.lobbed = lob, exceptions$1.lobbied = lobby, exceptions$1.lobbing = lob, exceptions$1.logged = log$1, exceptions$1.logging = log$1, exceptions$1.lopped = lop, exceptions$1.lopping = lop, exceptions$1.lost = lose, exceptions$1.lotted = lot, exceptions$1.lotting = lot, exceptions$1.lugged = lug, exceptions$1.lugging = lug, exceptions$1.lullabied = lullaby, exceptions$1.lying = lie, exceptions$1.madded = mad, exceptions$1.madding = mad, exceptions$1.made = make, exceptions$1.magnified = magnify, exceptions$1.manned = man, exceptions$1.manning = man, exceptions$1.manumitted = manumit, exceptions$1.manumitting = manumit, exceptions$1.mapped = map, exceptions$1.mapping = map, exceptions$1.marcelled = marcel, exceptions$1.marcelling = marcel, exceptions$1.marred = mar, exceptions$1.married = marry, exceptions$1.marring = mar, exceptions$1.marshalled = marshal, exceptions$1.marshalling = marshal, exceptions$1.marvelled = marvel, exceptions$1.marvelling = marvel, exceptions$1.matted = mat, exceptions$1.matting = mat, exceptions$1.meant = mean, exceptions$1.medalled = medal, exceptions$1.medalling = medal, exceptions$1.met = meet, exceptions$1.metalled = metal, exceptions$1.metalling = metal, exceptions$1.metrified = metrify, exceptions$1.might = may, exceptions$1.mimicked = mimic, exceptions$1.mimicking = mimic, exceptions$1.minified = minify, exceptions$1.misapplied = misapply, exceptions$1.misbecame = misbecome, exceptions$1.miscarried = miscarry, exceptions$1.misdealt = misdeal, exceptions$1.misfitted = misfit, exceptions$1.misfitting = misfit, exceptions$1.misgave = misgive, exceptions$1.misgiven = misgive, exceptions$1.mishitting = mishit, exceptions$1.mislaid = mislay, exceptions$1.misled = mislead, exceptions$1.mispled = misplead, exceptions$1.misspelt = misspell, exceptions$1.misspent = misspend, exceptions$1.mistaken = mistake, exceptions$1.mistook = mistake, exceptions$1.misunderstood = misunderstand, exceptions$1.mobbed = mob, exceptions$1.mobbing = mob, exceptions$1.modelled = model$3, exceptions$1.modelling = model$3, exceptions$1.modified = modify, exceptions$1.mollified = mollify, exceptions$1.molten = melt, exceptions$1.mopped = mop, exceptions$1.mopping = mop, exceptions$1.mortified = mortify, exceptions$1.mown = mow, exceptions$1.mudded = mud, exceptions$1.muddied = muddy, exceptions$1.mudding = mud, exceptions$1.mugged = mug, exceptions$1.mugging = mug, exceptions$1.multiplied = multiply, exceptions$1.mummed = mum, exceptions$1.mummified = mummify, exceptions$1.mumming = mum, exceptions$1.mutinied = mutiny, exceptions$1.mystified = mystify, exceptions$1.nabbed = nab, exceptions$1.nabbing = nab, exceptions$1.nagged = nag, exceptions$1.nagging = nag, exceptions$1.napped = nap, exceptions$1.napping = nap, exceptions$1.netted = net, exceptions$1.netting = net, exceptions$1.nibbed = nib, exceptions$1.nibbing = nib, exceptions$1.nickelled = nickel, exceptions$1.nickelling = nickel, exceptions$1.nidified = nidify, exceptions$1.nigrified = nigrify, exceptions$1.nipped = nip, exceptions$1.nipping = nip, exceptions$1.nitrified = nitrify, exceptions$1.nodded = nod, exceptions$1.nodding = nod, exceptions$1.nonplussed = nonplus, exceptions$1.nonplusses = nonplus, exceptions$1.nonplussing = nonplus, exceptions$1.notified = notify, exceptions$1.nullified = nullify, exceptions$1.nutted = nut, exceptions$1.nutting = nut, exceptions$1.objectified = objectify, exceptions$1.occupied = occupy, exceptions$1.occurred = occur, exceptions$1.occurring = occur, exceptions$1.offsetting = offset, exceptions$1.omitted = omit, exceptions$1.omitting = omit, exceptions$1.ossified = ossify, exceptions$1.outbidden = outbid, exceptions$1.outbidding = outbid, exceptions$1.outbred = outbreed, exceptions$1.outcried = outcry, exceptions$1.outcropped = outcrop, exceptions$1.outcropping = outcrop, exceptions$1.outdid = outdo, exceptions$1.outdone = outdo, exceptions$1.outdrawn = outdraw, exceptions$1.outdrew = outdraw, exceptions$1.outfitted = outfit, exceptions$1.outfitting = outfit, exceptions$1.outfought = outfight, exceptions$1.outgassed = outgas, exceptions$1.outgasses = outgas, exceptions$1.outgassing = outgas, exceptions$1.outgeneralled = outgeneral, exceptions$1.outgeneralling = outgeneral, exceptions$1.outgone = outgo, exceptions$1.outgrew = outgrow, exceptions$1.outgrown = outgrow, exceptions$1.outlaid = outlay, exceptions$1.outmanned = outman, exceptions$1.outmanning = outman, exceptions$1.outputted = output, exceptions$1.outputting = output, exceptions$1.outran = outrun, exceptions$1.outridden = outride, exceptions$1.outrode = outride, exceptions$1.outrunning = outrun, exceptions$1.outshone = outshine, exceptions$1.outshot = outshoot, exceptions$1.outsold = outsell, exceptions$1.outspanned = outspan, exceptions$1.outspanning = outspan, exceptions$1.outstood = outstand, exceptions$1.outstripped = outstrip, exceptions$1.outstripping = outstrip, exceptions$1.outthought = outthink, exceptions$1.outwent = outgo, exceptions$1.outwitted = outwit, exceptions$1.outwitting = outwit, exceptions$1.outwore = outwear, exceptions$1.outworn = outwear, exceptions$1.overbidden = overbid, exceptions$1.overbidding = overbid, exceptions$1.overblew = overblow, exceptions$1.overblown = overblow, exceptions$1.overbore = overbear, exceptions$1.overborne = overbear, exceptions$1.overbuilt = overbuild, exceptions$1.overcame = overcome, exceptions$1.overcropped = overcrop, exceptions$1.overcropping = overcrop, exceptions$1.overdid = overdo, exceptions$1.overdone = overdo, exceptions$1.overdrawn = overdraw, exceptions$1.overdrew = overdraw, exceptions$1.overdriven = overdrive, exceptions$1.overdrove = overdrive, exceptions$1.overflew = overfly, exceptions$1.overflown = overflow, exceptions$1.overgrew = overgrow, exceptions$1.overgrown = overgrow, exceptions$1.overheard = overhear, exceptions$1.overhung = overhang, exceptions$1.overlaid = overlay, exceptions$1.overlain = overlie, exceptions$1.overlapped = overlap, exceptions$1.overlapping = overlap, exceptions$1.overlay = overlie, exceptions$1.overlying = overlie, exceptions$1.overmanned = overman, exceptions$1.overmanning = overman, exceptions$1.overpaid = overpay, exceptions$1.overpast = overpass, exceptions$1.overran = overrun, exceptions$1.overridden = override, exceptions$1.overrode = override, exceptions$1.overrunning = overrun, exceptions$1.oversaw = oversee, exceptions$1.overseen = oversee, exceptions$1.oversetting = overset, exceptions$1.oversewn = oversew, exceptions$1.overshot = overshoot, exceptions$1.oversimplified = oversimplify, exceptions$1.overslept = oversleep, exceptions$1.oversold = oversell, exceptions$1.overspent = overspend, exceptions$1.overspilt = overspill, exceptions$1.overstepped = overstep, exceptions$1.overstepping = overstep, exceptions$1.overtaken = overtake, exceptions$1.overthrew = overthrow, exceptions$1.overthrown = overthrow, exceptions$1.overtook = overtake, exceptions$1.overtopped = overtop, exceptions$1.overtopping = overtop, exceptions$1.overwound = overwind, exceptions$1.overwritten = overwrite, exceptions$1.overwrote = overwrite, exceptions$1.pacified = pacify, exceptions$1.padded = pad, exceptions$1.padding = pad, exceptions$1.paid = pay, exceptions$1.palled = pal, exceptions$1.palling = pal, exceptions$1.palsied = palsy, exceptions$1.pandied = pandy, exceptions$1.panelled = panel, exceptions$1.panelling = panel, exceptions$1.panicked = panic, exceptions$1.panicking = panic, exceptions$1.panned = pan, exceptions$1.panning = pan, exceptions$1.parallelled = parallel, exceptions$1.parallelling = parallel, exceptions$1.parcelled = parcel, exceptions$1.parcelling = parcel, exceptions$1.parodied = parody, exceptions$1.parried = parry, exceptions$1.partaken = partake, exceptions$1.partook = partake, exceptions$1.pasquil = pasquinade, exceptions$1.pasquilled = pasquinade, exceptions$1.pasquilling = pasquinade, exceptions$1.pasquils = pasquinade, exceptions$1.patrolled = patrol, exceptions$1.patrolling = patrol, exceptions$1.patted = pat, exceptions$1.patting = pat, exceptions$1.pedalled = pedal, exceptions$1.pedalling = pedal, exceptions$1.pegged = peg, exceptions$1.pegging = peg, exceptions$1.pencilled = pencil, exceptions$1.pencilling = pencil, exceptions$1.penned = pen, exceptions$1.penning = pen, exceptions$1.pent = pen, exceptions$1.pepped = pep, exceptions$1.pepping = pep, exceptions$1.permitted = permit, exceptions$1.permitting = permit, exceptions$1.personified = personify, exceptions$1.petrified = petrify, exceptions$1.petted = pet, exceptions$1.pettifogged = pettifog, exceptions$1.pettifogging = pettifog, exceptions$1.petting = pet, exceptions$1.phantasied = phantasy, exceptions$1.photocopied = photocopy, exceptions$1.photomapped = photomap, exceptions$1.photomapping = photomap, exceptions$1.photosetting = photoset, exceptions$1.physicked = physic, exceptions$1.physicking = physic, exceptions$1.picnicked = picnic, exceptions$1.picnicking = picnic, exceptions$1.pigged = pig, exceptions$1.pigging = pig, exceptions$1.pilloried = pillory, exceptions$1.pinned = pin, exceptions$1.pinning = pin, exceptions$1.pipped = pip, exceptions$1.pipping = pip, exceptions$1.pistolled = pistol, exceptions$1.pistolling = pistol, exceptions$1.pitapatted = pitapat, exceptions$1.pitapatting = pitapat, exceptions$1.pitied = pity, exceptions$1.pitted = pit, exceptions$1.pitting = pit, exceptions$1.planned = plan, exceptions$1.planning = plan, exceptions$1.platted = plat, exceptions$1.platting = plat, exceptions$1.pled = plead, exceptions$1.plied = ply, exceptions$1.plodded = plod, exceptions$1.plodding = plod, exceptions$1.plopped = plop, exceptions$1.plopping = plop, exceptions$1.plotted = plot, exceptions$1.plotting = plot, exceptions$1.plugged = plug, exceptions$1.plugging = plug, exceptions$1.podded = pod, exceptions$1.podding = pod, exceptions$1.pommelled = pommel, exceptions$1.pommelling = pommel, exceptions$1.popes = popes, exceptions$1.popped = pop, exceptions$1.popping = pop, exceptions$1.potted = pot, exceptions$1.potting = pot, exceptions$1.preachified = preachify, exceptions$1.precancelled = precancel, exceptions$1.precancelling = precancel, exceptions$1.preferred = prefer, exceptions$1.preferring = prefer, exceptions$1.preoccupied = preoccupy, exceptions$1.prepaid = prepay, exceptions$1.presignified = presignify, exceptions$1.pretermitted = pretermit, exceptions$1.pretermitting = pretermit, exceptions$1.prettied = pretty, exceptions$1.prettified = prettify$2, exceptions$1.pried = pry, exceptions$1.prigged = prig, exceptions$1.prigging = prig, exceptions$1.primmed = prim, exceptions$1.primming = prim, exceptions$1.prodded = prod, exceptions$1.prodding = prod, exceptions$1.programmed = program, exceptions$1.programmes = program, exceptions$1.programming = program, exceptions$1.prologed = prologue, exceptions$1.prologing = prologue, exceptions$1.prologs = prologue, exceptions$1.propelled = propel, exceptions$1.propelling = propel, exceptions$1.prophesied = prophesy, exceptions$1.propped = prop, exceptions$1.propping = prop, exceptions$1.proven = prove, exceptions$1.pubbed = pub, exceptions$1.pubbing = pub, exceptions$1.pugged = pug, exceptions$1.pugging = pug, exceptions$1.pummelled = pummel, exceptions$1.pummelling = pummel, exceptions$1.punned = pun, exceptions$1.punning = pun, exceptions$1.pupped = pup, exceptions$1.pupping = pup, exceptions$1.purified = purify, exceptions$1.putrefied = putrefy, exceptions$1.puttied = putty, exceptions$1.putting = put, exceptions$1.qualified = qualify, exceptions$1.quantified = quantify, exceptions$1.quarrelled = quarrel, exceptions$1.quarrelling = quarrel, exceptions$1.quarried = quarry, exceptions$1.quartersawn = quartersaw, exceptions$1.queried = query, exceptions$1.quickstepped = quickstep, exceptions$1.quickstepping = quickstep, exceptions$1.quipped = quip, exceptions$1.quipping = quip, exceptions$1.quitted = quit, exceptions$1.quitting = quit, exceptions$1.quizzed = quiz, exceptions$1.quizzes = quiz, exceptions$1.quizzing = quiz, exceptions$1.ragged = rag, exceptions$1.ragging = rag, exceptions$1.rallied = rally, exceptions$1.ramified = ramify, exceptions$1.rammed = ram, exceptions$1.ramming = ram, exceptions$1.ran = run, exceptions$1.rang = ring, exceptions$1.rapped = rap, exceptions$1.rappelled = rappel, exceptions$1.rappelling = rappel, exceptions$1.rapping = rap, exceptions$1.rarefied = rarefy, exceptions$1.ratified = ratify, exceptions$1.ratted = rat, exceptions$1.ratting = rat, exceptions$1.ravelled = ravel, exceptions$1.ravelling = ravel, exceptions$1.rebelled = rebel, exceptions$1.rebelling = rebel, exceptions$1.rebuilt = rebuild, exceptions$1.rebutted = rebut, exceptions$1.rebutting = rebut, exceptions$1.recapped = recap, exceptions$1.recapping = recap, exceptions$1.reclassified = reclassify, exceptions$1.recommitted = recommit, exceptions$1.recommitting = recommit, exceptions$1.recopied = recopy, exceptions$1.rectified = rectify, exceptions$1.recurred = recur, exceptions$1.recurring = recur, exceptions$1.red = red, exceptions$1.redded = red, exceptions$1.redding = red, exceptions$1.redid = redo, exceptions$1.redone = redo, exceptions$1.referred = refer, exceptions$1.referring = refer, exceptions$1.refitted = refit, exceptions$1.refitting = refit, exceptions$1.reft = reave, exceptions$1.refuelled = refuel, exceptions$1.refuelling = refuel, exceptions$1.regretted = regret, exceptions$1.regretting = regret, exceptions$1.reheard = rehear, exceptions$1.reified = reify, exceptions$1.relied = rely, exceptions$1.remade = remake, exceptions$1.remarried = remarry, exceptions$1.remitted = remit, exceptions$1.remitting = remit, exceptions$1.rent = rend, exceptions$1.repaid = repay, exceptions$1.repelled = repel, exceptions$1.repelling = repel, exceptions$1.replevied = replevy, exceptions$1.replied = reply, exceptions$1.repotted = repot, exceptions$1.repotting = repot, exceptions$1.reran = rerun, exceptions$1.rerunning = rerun, exceptions$1.resat = resit, exceptions$1.resetting = reset, exceptions$1.resewn = resew, exceptions$1.resitting = resit, exceptions$1.retaken = retake, exceptions$1.rethought = rethink, exceptions$1.retold = retell, exceptions$1.retook = retake, exceptions$1.retransmitted = retransmit, exceptions$1.retransmitting = retransmit, exceptions$1.retried = retry, exceptions$1.retrofitted = retrofit, exceptions$1.retrofitting = retrofit, exceptions$1.retted = ret, exceptions$1.retting = ret, exceptions$1.reunified = reunify, exceptions$1.revelled = revel, exceptions$1.revelling = revel, exceptions$1.revetted = revet, exceptions$1.revetting = revet, exceptions$1.revivified = revivify, exceptions$1.revved = rev, exceptions$1.revving = rev, exceptions$1.rewound = rewind, exceptions$1.rewritten = rewrite, exceptions$1.rewrote = rewrite, exceptions$1.ribbed = rib, exceptions$1.ribbing = rib, exceptions$1.ricochetted = ricochet, exceptions$1.ricochetting = ricochet, exceptions$1.ridded = rid, exceptions$1.ridden = ride, exceptions$1.ridding = rid, exceptions$1.rigged = rig, exceptions$1.rigging = rig, exceptions$1.rigidified = rigidify, exceptions$1.rimmed = rim, exceptions$1.rimming = rim, exceptions$1.ripped = rip, exceptions$1.ripping = rip, exceptions$1.risen = rise, exceptions$1.rivalled = rival, exceptions$1.rivalling = rival, exceptions$1.riven = rive, exceptions$1.robbed = rob, exceptions$1.robbing = rob, exceptions$1.rode = ride, exceptions$1.rose = rise, exceptions$1.rotted = rot, exceptions$1.rotting = rot, exceptions$1.rove = reeve, exceptions$1.rowelled = rowel, exceptions$1.rowelling = rowel, exceptions$1.rubbed = rub, exceptions$1.rubbing = rub, exceptions$1.rung = ring, exceptions$1.running = run, exceptions$1.rutted = rut, exceptions$1.rutting = rut, exceptions$1.saccharified = saccharify, exceptions$1.sagged = sag, exceptions$1.sagging = sag, exceptions$1.said = say, exceptions$1.salaried = salary, exceptions$1.salified = salify, exceptions$1.sallied = sally, exceptions$1.sanctified = sanctify, exceptions$1.sandbagged = sandbag, exceptions$1.sandbagging = sandbag, exceptions$1.sang = sing, exceptions$1.sank = sink, exceptions$1.saponified = saponify, exceptions$1.sapped = sap, exceptions$1.sapping = sap, exceptions$1.sat = sit, exceptions$1.satisfied = satisfy, exceptions$1.savvied = savvy, exceptions$1.saw = see, exceptions$1.sawn = saw, exceptions$1.scagged = scag, exceptions$1.scagging = scag, exceptions$1.scanned = scan, exceptions$1.scanning = scan, exceptions$1.scarified = scarify, exceptions$1.scarred = scar, exceptions$1.scarring = scar, exceptions$1.scatted = scat, exceptions$1.scatting = scat, exceptions$1.scorified = scorify, exceptions$1.scragged = scrag, exceptions$1.scragging = scrag, exceptions$1.scrammed = scram, exceptions$1.scramming = scram, exceptions$1.scrapped = scrap, exceptions$1.scrapping = scrap, exceptions$1.scried = scry, exceptions$1.scrubbed = scrub, exceptions$1.scrubbing = scrub, exceptions$1.scrummed = scrum, exceptions$1.scrumming = scrum, exceptions$1.scudded = scud, exceptions$1.scudding = scud, exceptions$1.scummed = scum, exceptions$1.scumming = scum, exceptions$1.scurried = scurry, exceptions$1.seed = seed, exceptions$1.seen = see, exceptions$1.sent = send, exceptions$1.setting = set, exceptions$1.sewn = sew, exceptions$1.shagged = shag, exceptions$1.shagging = shag, exceptions$1.shaken = shake, exceptions$1.shammed = sham, exceptions$1.shamming = sham, exceptions$1.sharecropped = sharecrop, exceptions$1.sharecropping = sharecrop, exceptions$1.shat = shit, exceptions$1.shaven = shave, exceptions$1.shorn = shear, exceptions$1.shed = shed, exceptions$1.shedding = shed, exceptions$1.shellacked = shellac, exceptions$1.shellacking = shellac, exceptions$1.shent = shend, exceptions$1.shewn = shew, exceptions$1.shied = shy, exceptions$1.shikarred = shikar, exceptions$1.shikarring = shikar, exceptions$1.shillyshallied = shillyshally, exceptions$1.shimmed = shim, exceptions$1.shimmied = shimmy, exceptions$1.shimming = shim, exceptions$1.shinned = shin, exceptions$1.shinning = shin, exceptions$1.shipped = ship, exceptions$1.shipping = ship, exceptions$1.shitted = shit, exceptions$1.shitting = shit, exceptions$1.shod = shoe, exceptions$1.shone = shine, exceptions$1.shook = shake, exceptions$1.shopped = shop, exceptions$1.shopping = shop, exceptions$1.shot = shoot, exceptions$1.shotgunned = shotgun, exceptions$1.shotgunning = shotgun, exceptions$1.shotted = shot, exceptions$1.shotting = shot, exceptions$1.shovelled = shovel, exceptions$1.shovelling = shovel, exceptions$1.shown = show, exceptions$1.shrank = shrink, exceptions$1.shredded = shred, exceptions$1.shredding = shred, exceptions$1.shrivelled = shrivel, exceptions$1.shrivelling = shrivel, exceptions$1.shriven = shrive, exceptions$1.shrove = shrive, exceptions$1.shrugged = shrug, exceptions$1.shrugging = shrug, exceptions$1.shrunk = shrink;
147706
147825
  exceptions$1.shrunken = shrink, exceptions$1.shunned = shun, exceptions$1.shunning = shun, exceptions$1.shutting = shut, exceptions$1.sicked = sic, exceptions$1.sicking = sic, exceptions$1.sideslipped = sideslip, exceptions$1.sideslipping = sideslip, exceptions$1.sidestepped = sidestep, exceptions$1.sidestepping = sidestep, exceptions$1.sightsaw = sightsee, exceptions$1.sightseen = sightsee, exceptions$1.signalled = signal, exceptions$1.signalling = signal, exceptions$1.signified = signify, exceptions$1.silicified = silicify, exceptions$1.simplified = simplify, exceptions$1.singing = sing, exceptions$1.sinned = sin, exceptions$1.sinning = sin, exceptions$1.sipped = sip, exceptions$1.sipping = sip, exceptions$1.sitting = sit, exceptions$1.skellied = skelly, exceptions$1.skenned = sken, exceptions$1.skenning = sken, exceptions$1.sketted = sket, exceptions$1.sketting = sket, exceptions$1.skidded = skid, exceptions$1.skidding = skid, exceptions$1.skimmed = skim, exceptions$1.skimming = skim, exceptions$1.skinned = skin, exceptions$1.skinning = skin, exceptions$1.skipped = skip, exceptions$1.skipping = skip, exceptions$1.skivvied = skivvy, exceptions$1.skydove = skydive, exceptions$1.slabbed = slab$1, exceptions$1.slabbing = slab$1, exceptions$1.slagged = slag, exceptions$1.slagging = slag, exceptions$1.slain = slay, exceptions$1.slammed = slam, exceptions$1.slamming = slam, exceptions$1.slapped = slap, exceptions$1.slapping = slap, exceptions$1.slatted = slat, exceptions$1.slatting = slat, exceptions$1.sledding = sled, exceptions$1.slept = sleep, exceptions$1.slew = slay, exceptions$1.slid = slide, exceptions$1.slidden = slide, exceptions$1.slipped = slip, exceptions$1.slipping = slip, exceptions$1.slitting = slit, exceptions$1.slogged = slog, exceptions$1.slogging = slog, exceptions$1.slopped = slop, exceptions$1.slopping = slop, exceptions$1.slotted = slot, exceptions$1.slotting = slot, exceptions$1.slugged = slug, exceptions$1.slugging = slug, exceptions$1.slummed = slum, exceptions$1.slumming = slum, exceptions$1.slung = sling, exceptions$1.slunk = slink, exceptions$1.slurred = slur, exceptions$1.slurring = slur, exceptions$1.smelt = smell, exceptions$1.smit = smite, exceptions$1.smitten = smite, exceptions$1.smote = smite, exceptions$1.smutted = smut, exceptions$1.smutting = smut, exceptions$1.snagged = snag, exceptions$1.snagging = snag, exceptions$1.snapped = snap, exceptions$1.snapping = snap, exceptions$1.snedded = sned, exceptions$1.snedding = sned, exceptions$1.snipped = snip, exceptions$1.snipping = snip, exceptions$1.snivelled = snivel, exceptions$1.snivelling = snivel, exceptions$1.snogged = snog, exceptions$1.snogging = snog, exceptions$1.snubbed = snub, exceptions$1.snubbing = snub, exceptions$1.snuck = sneak, exceptions$1.snugged = snug, exceptions$1.snugging = snug, exceptions$1.sobbed = sob, exceptions$1.sobbing = sob, exceptions$1.sodded = sod, exceptions$1.sodding = sod, exceptions$1.sold = sell, exceptions$1.solemnified = solemnify, exceptions$1.solidified = solidify, exceptions$1.soothsaid = soothsay, exceptions$1.sopped = sop, exceptions$1.sopping = sop, exceptions$1.sought = seek, exceptions$1.sown = sow, exceptions$1.spagged = spag, exceptions$1.spagging = spag, exceptions$1.spancelled = spancel, exceptions$1.spancelling = spancel, exceptions$1.spanned = span, exceptions$1.spanning = span, exceptions$1.sparred = spar, exceptions$1.sparring = spar, exceptions$1.spat = spit, exceptions$1.spatted = spat, exceptions$1.spatting = spat, exceptions$1.specified = specify, exceptions$1.sped = speed, exceptions$1.speechified = speechify, exceptions$1.spellbound = spellbind, exceptions$1.spelt = spell, exceptions$1.spent = spend, exceptions$1.spied = spy, exceptions$1.spilt = spill, exceptions$1.spinning = spin, exceptions$1.spiralled = spiral, exceptions$1.spiralling = spiral, exceptions$1.spitted = spit, exceptions$1.spitting = spit, exceptions$1.splitting = split, exceptions$1.spoilt = spoil, exceptions$1.spoke = speak, exceptions$1.spoken = speak, exceptions$1.spotlit = spotlight, exceptions$1.spotted = spot, exceptions$1.spotting = spot, exceptions$1.sprang = spring, exceptions$1.sprigged = sprig, exceptions$1.sprigging = sprig, exceptions$1.sprung = spring, exceptions$1.spudded = spud, exceptions$1.spudding = spud, exceptions$1.spun = spin, exceptions$1.spurred = spur, exceptions$1.spurring = spur, exceptions$1.squatted = squat, exceptions$1.squatting = squat, exceptions$1.squibbed = squib, exceptions$1.squibbing = squib, exceptions$1.squidded = squid, exceptions$1.squidding = squid, exceptions$1.squilgee = squeegee, exceptions$1.stabbed = stab, exceptions$1.stabbing = stab, exceptions$1.stank = stink, exceptions$1.starred = star, exceptions$1.starring = star, exceptions$1.steadied = steady, exceptions$1.stellified = stellify, exceptions$1.stemmed = stem$2, exceptions$1.stemming = stem$2, exceptions$1.stencilled = stencil, exceptions$1.stencilling = stencil, exceptions$1.stepped = step, exceptions$1.stepping = step, exceptions$1.stetted = stet, exceptions$1.stetting = stet, exceptions$1.stied = sty, exceptions$1.stilettoeing = stiletto, exceptions$1.stirred = stir, exceptions$1.stirring = stir, exceptions$1.stole = steal, exceptions$1.stolen = steal, exceptions$1.stood = stand, exceptions$1.stopped = stop, exceptions$1.stopping = stop, exceptions$1.storied = story, exceptions$1.stotted = stot, exceptions$1.stotting = stot, exceptions$1.stove = stave, exceptions$1.strapped = strap, exceptions$1.strapping = strap, exceptions$1.stratified = stratify, exceptions$1.strewn = strew, exceptions$1.stridden = stride, exceptions$1.stripped = strip, exceptions$1.stripping = strip, exceptions$1.striven = strive, exceptions$1.strode = stride, exceptions$1.stropped = strop, exceptions$1.stropping = strop, exceptions$1.strove = strive, exceptions$1.strown = strow, exceptions$1.stricken = strike, exceptions$1.struck = strike, exceptions$1.strummed = strum, exceptions$1.strumming = strum, exceptions$1.strung = string, exceptions$1.strutted = strut, exceptions$1.strutting = strut, exceptions$1.stubbed = stub, exceptions$1.stubbing = stub, exceptions$1.stuck = stick, exceptions$1.studded = stud, exceptions$1.studding = stud, exceptions$1.studied = study, exceptions$1.stultified = stultify, exceptions$1.stummed = stum, exceptions$1.stumming = stum, exceptions$1.stung = sting, exceptions$1.stunk = stink, exceptions$1.stunned = stun, exceptions$1.stunning = stun, exceptions$1.stupefied = stupefy, exceptions$1.stymying = stymie, exceptions$1.subbed = sub, exceptions$1.subbing = sub, exceptions$1.subjectified = subjectify, exceptions$1.subletting = sublet, exceptions$1.submitted = submit, exceptions$1.submitting = submit, exceptions$1.subtotalled = subtotal, exceptions$1.subtotalling = subtotal, exceptions$1.sullied = sully, exceptions$1.sulphuretted = sulphuret, exceptions$1.sulphuretting = sulphuret, exceptions$1.summed = sum, exceptions$1.summing = sum, exceptions$1.sung = sing, exceptions$1.sunk = sink, exceptions$1.sunken = sink, exceptions$1.sunned = sun, exceptions$1.sunning = sun, exceptions$1.supped = sup, exceptions$1.supping = sup, exceptions$1.supplied = supply, exceptions$1.swabbed = swab, exceptions$1.swabbing = swab, exceptions$1.swagged = swag, exceptions$1.swagging = swag, exceptions$1.swam = swim, exceptions$1.swapped = swap, exceptions$1.swapping = swap, exceptions$1.swatted = swat, exceptions$1.swatting = swat, exceptions$1.swept = sweep, exceptions$1.swigged = swig, exceptions$1.swigging = swig, exceptions$1.swimming = swim, exceptions$1.swivelled = swivel, exceptions$1.swivelling = swivel, exceptions$1.swollen = swell, exceptions$1.swopped = swap, exceptions$1.swopping = swap, exceptions$1.swops = swap, exceptions$1.swore = swear, exceptions$1.sworn = swear, exceptions$1.swotted = swot, exceptions$1.swotting = swot, exceptions$1.swum = swim, exceptions$1.swung = swing, exceptions$1.syllabified = syllabify, exceptions$1.symbolled = symbol, exceptions$1.symbolling = symbol, exceptions$1.tabbed = tab, exceptions$1.tabbing = tab, exceptions$1.tagged = tag, exceptions$1.tagging = tag, exceptions$1.taken = take, exceptions$1.talcked = talc, exceptions$1.talcking = talc, exceptions$1.tallied = tally, exceptions$1.tammied = tammy, exceptions$1.tanned = tan, exceptions$1.tanning = tan, exceptions$1.tapped = tap, exceptions$1.tapping = tap, exceptions$1.tarred = tar, exceptions$1.tarried = tarry, exceptions$1.tarring = tar, exceptions$1.tasselled = tassel, exceptions$1.tasselling = tassel, exceptions$1.tatted = tat, exceptions$1.tatting = tat, exceptions$1.taught = teach, exceptions$1.taxis = taxis, exceptions$1.taxying = taxi, exceptions$1.teaselled = teasel, exceptions$1.teaselling = teasel, exceptions$1.tedded = ted, exceptions$1.tedding = ted, exceptions$1.tepefied = tepefy, exceptions$1.terrified = terrify, exceptions$1.testes = testes, exceptions$1.testified = testify, exceptions$1.thinned = thin, exceptions$1.thinning = thin, exceptions$1.thought = think, exceptions$1.threw = throw1, exceptions$1.thriven = thrive, exceptions$1.throbbed = throb, exceptions$1.throbbing = throb, exceptions$1.throve = thrive, exceptions$1.thrown = throw1, exceptions$1.thrummed = thrum, exceptions$1.thrumming = thrum, exceptions$1.thudded = thud, exceptions$1.thudding = thud, exceptions$1.tidied = tidy, exceptions$1.tinned = tin, exceptions$1.tinning = tin, exceptions$1.tinselled = tinsel, exceptions$1.tinselling = tinsel, exceptions$1.tipped = tip, exceptions$1.tipping = tip, exceptions$1.tittupped = tittup, exceptions$1.tittupping = tittup, exceptions$1.toadied = toady, exceptions$1.togged = tog, exceptions$1.togging = tog, exceptions$1.told = tell, exceptions$1.took = take, exceptions$1.topped = top, exceptions$1.topping = top, exceptions$1.tore = tear, exceptions$1.torn = tear, exceptions$1.torrefied = torrefy, exceptions$1.torrify = torrefy, exceptions$1.totalled = total, exceptions$1.totalling = total, exceptions$1.totted = tot, exceptions$1.totting = tot, exceptions$1.towelled = towel, exceptions$1.towelling = towel, exceptions$1.trafficked = traffic, exceptions$1.trafficking = traffic, exceptions$1.trameled = trammel, exceptions$1.trameling = trammel, exceptions$1.tramelled = trammel, exceptions$1.tramelling = trammel, exceptions$1.tramels = trammel, exceptions$1.trammed = tram, exceptions$1.tramming = tram, exceptions$1.transferred = transfer, exceptions$1.transferring = transfer, exceptions$1.transfixt = transfix, exceptions$1.tranship = transship, exceptions$1.transhipped = tranship, exceptions$1.transhipping = tranship, exceptions$1.transmitted = transmit, exceptions$1.transmitting = transmit, exceptions$1.transmogrified = transmogrify, exceptions$1.transshipped = transship, exceptions$1.transshipping = transship, exceptions$1.trapanned = trapan, exceptions$1.trapanning = trapan, exceptions$1.trapped = trap, exceptions$1.trapping = trap, exceptions$1.travelled = travel, exceptions$1.travelling = travel, exceptions$1.travestied = travesty, exceptions$1.trekked = trek, exceptions$1.trekking = trek, exceptions$1.trepanned = trepan, exceptions$1.trepanning = trepan, exceptions$1.tried = try1, exceptions$1.trigged = trig, exceptions$1.trigging = trig, exceptions$1.trimmed = trim, exceptions$1.trimming = trim, exceptions$1.tripped = trip, exceptions$1.tripping = trip, exceptions$1.trod = tread, exceptions$1.trodden = tread, exceptions$1.trogged = trog, exceptions$1.trogging = trog, exceptions$1.trotted = trot, exceptions$1.trotting = trot, exceptions$1.trowelled = trowel, exceptions$1.trowelling = trowel, exceptions$1.tugged = tug, exceptions$1.tugging = tug, exceptions$1.tumefied = tumefy, exceptions$1.tunned = tun, exceptions$1.tunnelled = tunnel, exceptions$1.tunnelling = tunnel, exceptions$1.tunning = tun, exceptions$1.tupped = tup, exceptions$1.tupping = tup, exceptions$1.twigged = twig, exceptions$1.twigging = twig, exceptions$1.twinned = twin, exceptions$1.twinning = twin, exceptions$1.twitted = twit, exceptions$1.twitting = twit, exceptions$1.tying = tie, exceptions$1.typesetting = typeset, exceptions$1.typewritten = typewrite, exceptions$1.typewrote = typewrite, exceptions$1.typified = typify, exceptions$1.uglified = uglify, exceptions$1.unbarred = unbar, exceptions$1.unbarring = unbar, exceptions$1.unbent = unbend, exceptions$1.unbound = unbind, exceptions$1.uncapped = uncap, exceptions$1.uncapping = uncap, exceptions$1.unclad = unclothe, exceptions$1.unclogged = unclog, exceptions$1.unclogging = unclog, exceptions$1.underbidding = underbid, exceptions$1.underbought = underbuy, exceptions$1.undercutting = undercut, exceptions$1.underfed = underfeed, exceptions$1.undergirt = undergird, exceptions$1.undergone = undergo, exceptions$1.underlaid = underlay, exceptions$1.underlain = underlie, exceptions$1.underlay = underlie, exceptions$1.underletting = underlet, exceptions$1.underlying = underlie, exceptions$1.underpaid = underpay, exceptions$1.underpinned = underpin, exceptions$1.underpinning = underpin, exceptions$1.underpropped = underprop, exceptions$1.underpropping = underprop, exceptions$1.undersetting = underset, exceptions$1.undershot = undershoot, exceptions$1.undersold = undersell, exceptions$1.understood = understand, exceptions$1.understudied = understudy, exceptions$1.undertaken = undertake, exceptions$1.undertook = undertake, exceptions$1.underwent = undergo, exceptions$1.underwritten = underwrite, exceptions$1.underwrote = underwrite, exceptions$1.undid = undo, exceptions$1.undone = undo, exceptions$1.unfitted = unfit, exceptions$1.unfitting = unfit, exceptions$1.unfroze = unfreeze, exceptions$1.unfrozen = unfreeze, exceptions$1.unified = unify, exceptions$1.unkennelled = unkennel, exceptions$1.unkennelling = unkennel, exceptions$1.unknitted = unknit, exceptions$1.unknitting = unknit, exceptions$1.unlaid = unlay, exceptions$1.unlearnt = unlearn, exceptions$1.unmade = unmake, exceptions$1.unmanned = unman, exceptions$1.unmanning = unman, exceptions$1.unpegged = unpeg, exceptions$1.unpegging = unpeg, exceptions$1.unpinned = unpin, exceptions$1.unpinning = unpin, exceptions$1.unplugged = unplug, exceptions$1.unplugging = unplug, exceptions$1.unravelled = unravel, exceptions$1.unravelling = unravel, exceptions$1.unrigged = unrig, exceptions$1.unrigging = unrig, exceptions$1.unripped = unrip, exceptions$1.unripping = unrip, exceptions$1.unrove = unreeve, exceptions$1.unsaid = unsay, exceptions$1.unshipped = unship, exceptions$1.unshipping = unship, exceptions$1.unslung = unsling, exceptions$1.unsnapped = unsnap, exceptions$1.unsnapping = unsnap, exceptions$1.unspoke = unspeak, exceptions$1.unspoken = unspeak, exceptions$1.unsteadied = unsteady, exceptions$1.unstepped = unstep, exceptions$1.unstepping = unstep, exceptions$1.unstopped = unstop, exceptions$1.unstopping = unstop, exceptions$1.unstrung = unstring, exceptions$1.unstuck = unstick, exceptions$1.unswore = unswear, exceptions$1.unsworn = unswear, exceptions$1.untaught = unteach, exceptions$1.unthought = unthink, exceptions$1.untidied = untidy, exceptions$1.untrod = untread, exceptions$1.untrodden = untread, exceptions$1.untying = untie, exceptions$1.unwound = unwind, exceptions$1.unwrapped = unwrap$1, exceptions$1.unwrapping = unwrap$1, exceptions$1.unzipped = unzip, exceptions$1.unzipping = unzip, exceptions$1.upbuilt = upbuild, exceptions$1.upheld = uphold, exceptions$1.uphove = upheave, exceptions$1.upped = up, exceptions$1.uppercutting = uppercut, exceptions$1.upping = up, exceptions$1.uprisen = uprise, exceptions$1.uprose = uprise, exceptions$1.upsetting = upset, exceptions$1.upsprang = upspring, exceptions$1.upsprung = upspring, exceptions$1.upswept = upsweep, exceptions$1.upswollen = upswell, exceptions$1.upswung = upswing, exceptions$1.vagged = vag, exceptions$1.vagging = vag, exceptions$1.varied = vary, exceptions$1.vatted = vat, exceptions$1.vatting = vat, exceptions$1.verbified = verbify, exceptions$1.verified = verify, exceptions$1.versified = versify, exceptions$1.vetted = vet, exceptions$1.vetting = vet, exceptions$1.victualled = victual, exceptions$1.victualling = victual, exceptions$1.vilified = vilify, exceptions$1.vitrified = vitrify, exceptions$1.vitriolled = vitriol, exceptions$1.vitriolling = vitriol, exceptions$1.vivified = vivify, exceptions$1.vying = vie, exceptions$1.wadded = wad, exceptions$1.waddied = waddy, exceptions$1.wadding = wad, exceptions$1.wadsetted = wadset, exceptions$1.wadsetting = wadset, exceptions$1.wagged = wag, exceptions$1.wagging = wag, exceptions$1.wanned = wan, exceptions$1.wanning = wan, exceptions$1.warred = war, exceptions$1.warring = war, exceptions$1.was = be, exceptions$1.waylaid = waylay, exceptions$1.wearied = weary, exceptions$1.weatherstripped = weatherstrip, exceptions$1.weatherstripping = weatherstrip, exceptions$1.webbed = web, exceptions$1.webbing = web, exceptions$1.wedded = wed, exceptions$1.wedding = wed, exceptions$1.weed = weed, exceptions$1.went = go, exceptions$1.wept = weep, exceptions$1.were = be, exceptions$1.wetted = wet, exceptions$1.wetting = wet, exceptions$1.whammed = wham, exceptions$1.whamming = wham, exceptions$1.whapped = whap, exceptions$1.whapping = whap, exceptions$1.whetted = whet, exceptions$1.whetting = whet, exceptions$1.whinnied = whinny, exceptions$1.whipped = whip, exceptions$1.whipping = whip, exceptions$1.whipsawn = whipsaw, exceptions$1.whirred = whir, exceptions$1.whirring = whir, exceptions$1.whizzed = whiz, exceptions$1.whizzes = whiz, exceptions$1.whizzing = whiz, exceptions$1.whopped = whop, exceptions$1.whopping = whop, exceptions$1.wigged = wig, exceptions$1.wigging = wig, exceptions$1.wigwagged = wigwag, exceptions$1.wigwagging = wigwag, exceptions$1.wildcatted = wildcat, exceptions$1.wildcatting = wildcat, exceptions$1.winning = win, exceptions$1.winterfed = winterfeed, exceptions$1.wiredrawn = wiredraw, exceptions$1.wiredrew = wiredraw, exceptions$1.withdrawn = withdraw, exceptions$1.withdrew = withdraw, exceptions$1.withheld = withhold, exceptions$1.withstood = withstand, exceptions$1.woke = wake, exceptions$1.woken = wake, exceptions$1.won = win, exceptions$1.wonned = won, exceptions$1.wonning = won, exceptions$1.wore = wear, exceptions$1.worn = wear, exceptions$1.worried = worry, exceptions$1.worshipped = worship, exceptions$1.worshipping = worship, exceptions$1.wound = wind, exceptions$1.wove = weave, exceptions$1.woven = weave, exceptions$1.wrapped = wrap$2, exceptions$1.wrapping = wrap$2, exceptions$1.wried = wry, exceptions$1.written = write, exceptions$1.wrote = write, exceptions$1.wrought = work, exceptions$1.wrung = wring, exceptions$1.would = will, exceptions$1.yakked = yak, exceptions$1.yakking = yak, exceptions$1.yapped = yap, exceptions$1.yapping = yap, exceptions$1.ycleped = clepe, exceptions$1.yclept = clepe, exceptions$1.yenned = yen, exceptions$1.yenning = yen, exceptions$1.yodelled = yodel, exceptions$1.yodelling = yodel, exceptions$1.zapped = zap, exceptions$1.zapping = zap, exceptions$1.zigzagged = zigzag, exceptions$1.zigzagging = zigzag, exceptions$1.zipped = zip, exceptions$1.zipping = zip, wnVerbExceptions.exports = exceptions$1;
147707
147826
  var wnVerbExceptionsExports = wnVerbExceptions.exports;
@@ -150473,6 +150592,9 @@ class DiagnosticsRetriever {
150473
150592
  async getDiagnosticPromptMessagePlainText(info2) {
150474
150593
  const errorMessage = info2.message;
150475
150594
  const relatedInfoList = info2.relatedInformation ? (await this.getRelatedInformationPrompt(info2.relatedInformation)).filter(isDefined) : [];
150595
+ if (relatedInfoList.length === 0) {
150596
+ return errorMessage;
150597
+ }
150476
150598
  const relatedInfoPrompt = relatedInfoList.map((info22) => `Err (Related Information) | ${info22.message}, ${info22.file}, ${info22.text}`).join("\n");
150477
150599
  return `${errorMessage}
150478
150600
  ${relatedInfoPrompt}`;
@@ -150526,6 +150648,10 @@ ${relatedInfoPrompt}`;
150526
150648
  document2.lineAt(contextEndLine).range.end.character
150527
150649
  )
150528
150650
  );
150651
+ if (this.contextLines === 0) {
150652
+ return `${prevLines}
150653
+ ${diagnosticText}`;
150654
+ }
150529
150655
  return `${prevLines}
150530
150656
  ${diagnosticText}
150531
150657
  ${nextLines}`;
@@ -150640,6 +150766,145 @@ class RecentCopyRetriever {
150640
150766
  this.disposables = [];
150641
150767
  }
150642
150768
  }
150769
+ function computeDiffWithLineNumbers(uri2, originalContent, modifiedContent, numContextLines) {
150770
+ const hunkDiffs = [];
150771
+ const filename = displayPath(uri2);
150772
+ const patch = structuredPatch(
150773
+ `a/${filename}`,
150774
+ `b/${filename}`,
150775
+ originalContent,
150776
+ modifiedContent,
150777
+ "",
150778
+ "",
150779
+ { context: numContextLines }
150780
+ );
150781
+ for (const hunk of patch.hunks) {
150782
+ const diffString = getDiffStringForHunkWithLineNumbers(hunk);
150783
+ hunkDiffs.push(diffString);
150784
+ }
150785
+ const gitDiff = PromptString.fromStructuredGitDiff(uri2, hunkDiffs.join("\nthen\n"));
150786
+ return gitDiff;
150787
+ }
150788
+ function getDiffStringForHunkWithLineNumbers(hunk) {
150789
+ const lines2 = [];
150790
+ let oldLineNumber = hunk.oldStart;
150791
+ let newLineNumber = hunk.newStart;
150792
+ for (const line of hunk.lines) {
150793
+ if (line.length === 0) {
150794
+ continue;
150795
+ }
150796
+ if (line[0] === "-") {
150797
+ lines2.push(`${oldLineNumber}${line[0]}| ${line.slice(1)}`);
150798
+ oldLineNumber++;
150799
+ } else if (line[0] === "+") {
150800
+ lines2.push(`${newLineNumber}${line[0]}| ${line.slice(1)}`);
150801
+ newLineNumber++;
150802
+ } else if (line[0] === " ") {
150803
+ lines2.push(`${newLineNumber}${line[0]}| ${line.slice(1)}`);
150804
+ oldLineNumber++;
150805
+ newLineNumber++;
150806
+ }
150807
+ }
150808
+ return lines2.join("\n");
150809
+ }
150810
+ function applyTextDocumentChanges(content, changes) {
150811
+ for (const change of changes) {
150812
+ content = content.slice(0, change.rangeOffset) + change.text + content.slice(change.rangeOffset + change.rangeLength);
150813
+ }
150814
+ return content;
150815
+ }
150816
+ class AutoeditWithShortTermDiffStrategy {
150817
+ constructor() {
150818
+ __publicField2(this, "shortTermDiffWindowMs", 5 * 1e3);
150819
+ // 5 seconds
150820
+ __publicField2(this, "longTermContextLines", 3);
150821
+ __publicField2(this, "shortTermContextLines", 0);
150822
+ }
150823
+ getDiffHunks(input) {
150824
+ const [shortTermChanges, longTermChanges] = this.divideChangesIntoWindows(input.changes);
150825
+ const [shortTermHunks, shortTermNewContent] = this.getDiffHunksForChanges(
150826
+ input.uri,
150827
+ input.oldContent,
150828
+ shortTermChanges,
150829
+ this.shortTermContextLines
150830
+ );
150831
+ const [longTermHunks, _2] = this.getDiffHunksForChanges(
150832
+ input.uri,
150833
+ shortTermNewContent,
150834
+ longTermChanges,
150835
+ this.longTermContextLines
150836
+ );
150837
+ return [shortTermHunks, longTermHunks];
150838
+ }
150839
+ getDiffHunksForChanges(uri2, oldContent, changes, numContextLines) {
150840
+ const newContent = applyTextDocumentChanges(
150841
+ oldContent,
150842
+ changes.map((c) => c.change)
150843
+ );
150844
+ const gitDiff = computeDiffWithLineNumbers(uri2, oldContent, newContent, numContextLines);
150845
+ const diffHunk = {
150846
+ diff: gitDiff,
150847
+ latestEditTimestamp: Math.max(...changes.map((c) => c.timestamp))
150848
+ };
150849
+ return [diffHunk, newContent];
150850
+ }
150851
+ divideChangesIntoWindows(changes) {
150852
+ const now = Date.now();
150853
+ const index2 = changes.findIndex((c) => now - c.timestamp < this.shortTermDiffWindowMs);
150854
+ const shortTermChanges = changes.slice(0, index2);
150855
+ const longTermChanges = changes.slice(index2);
150856
+ return [shortTermChanges, longTermChanges];
150857
+ }
150858
+ }
150859
+ class UnifiedDiffStrategy {
150860
+ constructor(options) {
150861
+ __publicField2(this, "addLineNumbers");
150862
+ __publicField2(this, "numContextLines", 3);
150863
+ this.addLineNumbers = options.addLineNumbers;
150864
+ }
150865
+ getDiffHunks(input) {
150866
+ const newContent = applyTextDocumentChanges(
150867
+ input.oldContent,
150868
+ input.changes.map((c) => c.change)
150869
+ );
150870
+ const diff2 = this.getDiffForUnifiedStrategy(input, newContent);
150871
+ return [
150872
+ {
150873
+ diff: diff2,
150874
+ latestEditTimestamp: Math.max(...input.changes.map((c) => c.timestamp))
150875
+ }
150876
+ ];
150877
+ }
150878
+ getDiffForUnifiedStrategy(input, newContent) {
150879
+ if (this.addLineNumbers) {
150880
+ return computeDiffWithLineNumbers(
150881
+ input.uri,
150882
+ input.oldContent,
150883
+ newContent,
150884
+ this.numContextLines
150885
+ );
150886
+ }
150887
+ return PromptString.fromGitDiff(input.uri, input.oldContent, newContent);
150888
+ }
150889
+ }
150890
+ var RecentEditsRetrieverDiffStrategyIdentifier = /* @__PURE__ */ ((RecentEditsRetrieverDiffStrategyIdentifier2) => {
150891
+ RecentEditsRetrieverDiffStrategyIdentifier2["UnifiedDiff"] = "unified-diff";
150892
+ RecentEditsRetrieverDiffStrategyIdentifier2["UnifiedDiffWithLineNumbers"] = "unified-diff-with-line-numbers";
150893
+ RecentEditsRetrieverDiffStrategyIdentifier2["AutoeditWithShortTermDiff"] = "autoedit-with-short-term-diff";
150894
+ return RecentEditsRetrieverDiffStrategyIdentifier2;
150895
+ })(RecentEditsRetrieverDiffStrategyIdentifier || {});
150896
+ function createDiffStrategy(identifier) {
150897
+ switch (identifier) {
150898
+ case "unified-diff":
150899
+ return new UnifiedDiffStrategy({ addLineNumbers: false });
150900
+ case "unified-diff-with-line-numbers":
150901
+ return new UnifiedDiffStrategy({ addLineNumbers: true });
150902
+ case "autoedit-with-short-term-diff":
150903
+ return new AutoeditWithShortTermDiffStrategy();
150904
+ default:
150905
+ throw new Error(`Unknown diff strategy identifier: ${identifier}`);
150906
+ }
150907
+ }
150643
150908
  class RecentEditsRetriever {
150644
150909
  constructor(options, workspace$1 = workspace) {
150645
150910
  // We use a map from the document URI to the set of tracked completions inside that document to
@@ -150648,13 +150913,21 @@ class RecentEditsRetriever {
150648
150913
  __publicField2(this, "identifier", RetrieverIdentifier.RecentEditsRetriever);
150649
150914
  __publicField2(this, "disposables", []);
150650
150915
  __publicField2(this, "maxAgeMs");
150651
- __publicField2(this, "addLineNumbersForDiff");
150916
+ __publicField2(this, "diffStrategyIdentifier");
150917
+ __publicField2(this, "diffStrategy");
150652
150918
  this.workspace = workspace$1;
150653
150919
  this.maxAgeMs = options.maxAgeMs;
150654
- this.addLineNumbersForDiff = options.addLineNumbersForDiff ?? false;
150655
- this.disposables.push(workspace$1.onDidChangeTextDocument(this.onDidChangeTextDocument.bind(this)));
150656
- this.disposables.push(workspace$1.onDidRenameFiles(this.onDidRenameFiles.bind(this)));
150657
- this.disposables.push(workspace$1.onDidDeleteFiles(this.onDidDeleteFiles.bind(this)));
150920
+ this.diffStrategyIdentifier = options.diffStrategyIdentifier;
150921
+ this.diffStrategy = createDiffStrategy(this.diffStrategyIdentifier);
150922
+ for (const document2 of workspace.textDocuments) {
150923
+ this.trackDocument(document2);
150924
+ }
150925
+ this.disposables.push(
150926
+ workspace$1.onDidChangeTextDocument(this.onDidChangeTextDocument.bind(this)),
150927
+ workspace$1.onDidRenameFiles(this.onDidRenameFiles.bind(this)),
150928
+ workspace$1.onDidDeleteFiles(this.onDidDeleteFiles.bind(this)),
150929
+ workspace$1.onDidOpenTextDocument(this.onDidOpenTextDocument.bind(this))
150930
+ );
150658
150931
  }
150659
150932
  async retrieve(options) {
150660
150933
  const rawDiffs = await this.getDiffAcrossDocuments();
@@ -150666,7 +150939,11 @@ class RecentEditsRetriever {
150666
150939
  const autocompleteSnippet = {
150667
150940
  uri: diff2.uri,
150668
150941
  identifier: this.identifier,
150669
- content
150942
+ content,
150943
+ metadata: {
150944
+ timeSinceActionMs: Date.now() - diff2.latestChangeTimestamp,
150945
+ recentEditsRetrieverDiffStrategy: this.diffStrategyIdentifier
150946
+ }
150670
150947
  };
150671
150948
  autocompleteContextSnippets.push(autocompleteSnippet);
150672
150949
  }
@@ -150676,22 +150953,22 @@ class RecentEditsRetriever {
150676
150953
  const diffs = [];
150677
150954
  const diffPromises = Array.from(this.trackedDocuments.entries()).map(
150678
150955
  async ([uri2, trackedDocument]) => {
150679
- const diff2 = await this.getDiff(Uri.parse(uri2));
150680
- if (diff2) {
150681
- return {
150682
- diff: diff2,
150956
+ const diffHunks = await this.getDiff(Uri.parse(uri2));
150957
+ if (diffHunks && trackedDocument.changes.length > 0) {
150958
+ return diffHunks.map((diffHunk) => ({
150959
+ diff: diffHunk.diff,
150683
150960
  uri: trackedDocument.uri,
150684
150961
  languageId: trackedDocument.languageId,
150685
- latestChangeTimestamp: Math.max(
150686
- ...trackedDocument.changes.map((c) => c.timestamp)
150687
- )
150688
- };
150962
+ latestChangeTimestamp: diffHunk.latestEditTimestamp
150963
+ }));
150689
150964
  }
150690
150965
  return null;
150691
150966
  }
150692
150967
  );
150693
150968
  const results = await Promise.all(diffPromises);
150694
- diffs.push(...results.filter((result) => result !== null));
150969
+ diffs.push(
150970
+ ...results.filter((result) => result !== null).flat()
150971
+ );
150695
150972
  return diffs;
150696
150973
  }
150697
150974
  filterCandidateDiffs(allDiffs, document2) {
@@ -150708,9 +150985,6 @@ class RecentEditsRetriever {
150708
150985
  }
150709
150986
  return filterCandidateDiffs;
150710
150987
  }
150711
- isSupportedForLanguageId() {
150712
- return true;
150713
- }
150714
150988
  async getDiff(uri2) {
150715
150989
  if (await contextFiltersProvider.isUriIgnored(uri2)) {
150716
150990
  return null;
@@ -150719,53 +150993,20 @@ class RecentEditsRetriever {
150719
150993
  if (!trackedDocument) {
150720
150994
  return null;
150721
150995
  }
150722
- const oldContent = trackedDocument.content;
150723
- const newContent = applyChanges(
150724
- oldContent,
150725
- trackedDocument.changes.map((c) => c.change)
150726
- );
150727
- if (this.addLineNumbersForDiff) {
150728
- return this.computeDiffWithLineNumbers(uri2, oldContent, newContent);
150729
- }
150730
- return PromptString.fromGitDiff(uri2, oldContent, newContent);
150731
- }
150732
- computeDiffWithLineNumbers(uri2, originalContent, modifiedContent) {
150733
- const hunkDiffs = [];
150734
- const filename = displayPath(uri2);
150735
- const patch = structuredPatch(`a/${filename}`, `b/${filename}`, originalContent, modifiedContent);
150736
- for (const hunk of patch.hunks) {
150737
- const diffString = this.getDiffStringForHunkWithLineNumbers(hunk);
150738
- hunkDiffs.push(diffString);
150739
- }
150740
- const gitDiff = PromptString.fromStructuredGitDiff(uri2, hunkDiffs.join("\nthen\n"));
150741
- return gitDiff;
150742
- }
150743
- getDiffStringForHunkWithLineNumbers(hunk) {
150744
- const lines2 = [];
150745
- let oldLineNumber = hunk.oldStart;
150746
- let newLineNumber = hunk.newStart;
150747
- for (const line of hunk.lines) {
150748
- if (line.length === 0) {
150749
- continue;
150750
- }
150751
- if (line[0] === "-") {
150752
- lines2.push(`${oldLineNumber}${line[0]}| ${line.slice(1)}`);
150753
- oldLineNumber++;
150754
- } else if (line[0] === "+") {
150755
- lines2.push(`${newLineNumber}${line[0]}| ${line.slice(1)}`);
150756
- newLineNumber++;
150757
- } else if (line[0] === " ") {
150758
- lines2.push(`${newLineNumber}${line[0]}| ${line.slice(1)}`);
150759
- oldLineNumber++;
150760
- newLineNumber++;
150761
- }
150762
- }
150763
- return lines2.join("\n");
150996
+ const diffHunks = this.diffStrategy.getDiffHunks({
150997
+ uri: trackedDocument.uri,
150998
+ oldContent: trackedDocument.content,
150999
+ changes: trackedDocument.changes
151000
+ });
151001
+ return diffHunks;
151002
+ }
151003
+ isSupportedForLanguageId() {
151004
+ return true;
150764
151005
  }
150765
151006
  onDidChangeTextDocument(event2) {
150766
- let trackedDocument = this.trackedDocuments.get(event2.document.uri.toString());
151007
+ const trackedDocument = this.trackedDocuments.get(event2.document.uri.toString());
150767
151008
  if (!trackedDocument) {
150768
- trackedDocument = this.trackDocument(event2.document);
151009
+ return;
150769
151010
  }
150770
151011
  const now = Date.now();
150771
151012
  for (const change of event2.contentChanges) {
@@ -150776,6 +151017,11 @@ class RecentEditsRetriever {
150776
151017
  }
150777
151018
  this.reconcileOutdatedChanges();
150778
151019
  }
151020
+ onDidOpenTextDocument(document2) {
151021
+ if (!this.trackedDocuments.has(document2.uri.toString())) {
151022
+ this.trackDocument(document2);
151023
+ }
151024
+ }
150779
151025
  onDidRenameFiles(event2) {
150780
151026
  for (const file of event2.files) {
150781
151027
  const trackedDocument = this.trackedDocuments.get(file.oldUri.toString());
@@ -150790,13 +151036,10 @@ class RecentEditsRetriever {
150790
151036
  this.trackedDocuments.delete(uri2.toString());
150791
151037
  }
150792
151038
  }
150793
- dispose() {
150794
- this.trackedDocuments.clear();
150795
- for (const disposable of this.disposables) {
150796
- disposable.dispose();
150797
- }
150798
- }
150799
151039
  trackDocument(document2) {
151040
+ if (document2.uri.scheme !== "file") {
151041
+ return;
151042
+ }
150800
151043
  const trackedDocument = {
150801
151044
  content: document2.getText(),
150802
151045
  languageId: document2.languageId,
@@ -150804,7 +151047,6 @@ class RecentEditsRetriever {
150804
151047
  changes: []
150805
151048
  };
150806
151049
  this.trackedDocuments.set(document2.uri.toString(), trackedDocument);
150807
- return trackedDocument;
150808
151050
  }
150809
151051
  reconcileOutdatedChanges() {
150810
151052
  const now = Date.now();
@@ -150813,42 +151055,40 @@ class RecentEditsRetriever {
150813
151055
  (c) => now - c.timestamp < this.maxAgeMs
150814
151056
  );
150815
151057
  const outdatedChanges = trackedDocument.changes.slice(0, firstNonOutdatedChangeIndex);
150816
- trackedDocument.content = applyChanges(
151058
+ trackedDocument.content = applyTextDocumentChanges(
150817
151059
  trackedDocument.content,
150818
151060
  outdatedChanges.map((c) => c.change)
150819
151061
  );
150820
151062
  trackedDocument.changes = trackedDocument.changes.slice(firstNonOutdatedChangeIndex);
150821
151063
  }
150822
151064
  }
150823
- }
150824
- function applyChanges(content, changes) {
150825
- for (const change of changes) {
150826
- content = content.slice(0, change.rangeOffset) + change.text + content.slice(change.rangeOffset + change.rangeLength);
151065
+ dispose() {
151066
+ this.trackedDocuments.clear();
151067
+ for (const disposable of this.disposables) {
151068
+ disposable.dispose();
151069
+ }
150827
151070
  }
150828
- return content;
150829
151071
  }
150830
151072
  class RecentViewPortRetriever {
150831
- constructor({
150832
- maxTrackedViewPorts,
150833
- maxRetrievedViewPorts,
150834
- window: window2 = window$1
150835
- }) {
151073
+ constructor(options, window2 = window$1) {
150836
151074
  __publicField2(this, "identifier", RetrieverIdentifier.RecentViewPortRetriever);
150837
151075
  __publicField2(this, "disposables", []);
150838
151076
  __publicField2(this, "viewportsByDocumentUri");
150839
151077
  __publicField2(this, "maxTrackedViewPorts");
150840
151078
  __publicField2(this, "maxRetrievedViewPorts");
150841
- __publicField2(this, "window");
150842
- this.maxTrackedViewPorts = maxTrackedViewPorts;
150843
- this.maxRetrievedViewPorts = maxRetrievedViewPorts;
151079
+ __publicField2(this, "activeTextEditor");
150844
151080
  this.window = window2;
151081
+ this.maxTrackedViewPorts = options.maxTrackedViewPorts;
151082
+ this.maxRetrievedViewPorts = options.maxRetrievedViewPorts;
150845
151083
  this.viewportsByDocumentUri = new LRUCache$1({
150846
151084
  max: this.maxTrackedViewPorts
150847
151085
  });
151086
+ this.activeTextEditor = window2.activeTextEditor;
150848
151087
  this.disposables.push(
150849
- this.window.onDidChangeTextEditorVisibleRanges(
151088
+ window2.onDidChangeTextEditorVisibleRanges(
150850
151089
  debounce$1(this.onDidChangeTextEditorVisibleRanges.bind(this), 300)
150851
- )
151090
+ ),
151091
+ window2.onDidChangeActiveTextEditor(this.onDidChangeActiveTextEditor.bind(this))
150852
151092
  );
150853
151093
  }
150854
151094
  async retrieve({ document: document2 }) {
@@ -150861,7 +151101,10 @@ class RecentViewPortRetriever {
150861
151101
  content,
150862
151102
  startLine: viewPort.visibleRange.start.line,
150863
151103
  endLine: viewPort.visibleRange.end.line,
150864
- identifier: this.identifier
151104
+ identifier: this.identifier,
151105
+ metadata: {
151106
+ timeSinceActionMs: Date.now() - viewPort.lastAccessTimestamp
151107
+ }
150865
151108
  };
150866
151109
  });
150867
151110
  return Promise.all(snippetPromises);
@@ -150882,21 +151125,36 @@ class RecentViewPortRetriever {
150882
151125
  isSupportedForLanguageId() {
150883
151126
  return true;
150884
151127
  }
151128
+ onDidChangeActiveTextEditor(editor) {
151129
+ var _a3;
151130
+ if (this.activeTextEditor) {
151131
+ this.updateTrackedViewPort(
151132
+ this.activeTextEditor.document,
151133
+ this.activeTextEditor.visibleRanges[0],
151134
+ this.activeTextEditor.document.languageId
151135
+ );
151136
+ }
151137
+ this.activeTextEditor = editor;
151138
+ if (!((_a3 = editor == null ? void 0 : editor.visibleRanges) == null ? void 0 : _a3[0])) {
151139
+ return;
151140
+ }
151141
+ this.updateTrackedViewPort(editor.document, editor.visibleRanges[0], editor.document.languageId);
151142
+ }
150885
151143
  onDidChangeTextEditorVisibleRanges(event2) {
150886
151144
  const { textEditor, visibleRanges } = event2;
150887
151145
  if (visibleRanges.length === 0) {
150888
151146
  return;
150889
151147
  }
150890
- const uri2 = textEditor.document.uri;
150891
- const visibleRange = visibleRanges[0];
150892
- const languageId = textEditor.document.languageId;
150893
- this.updateTrackedViewPort(uri2, visibleRange, languageId);
151148
+ this.updateTrackedViewPort(textEditor.document, visibleRanges[0], textEditor.document.languageId);
150894
151149
  }
150895
- updateTrackedViewPort(uri2, visibleRange, languageId) {
151150
+ updateTrackedViewPort(document2, visibleRange, languageId) {
151151
+ if (document2.uri.scheme !== "file") {
151152
+ return;
151153
+ }
150896
151154
  const now = Date.now();
150897
- const key = uri2.toString();
151155
+ const key = document2.uri.toString();
150898
151156
  this.viewportsByDocumentUri.set(key, {
150899
- uri: uri2,
151157
+ uri: document2.uri,
150900
151158
  visibleRange,
150901
151159
  languageId,
150902
151160
  lastAccessTimestamp: now
@@ -150918,11 +151176,9 @@ const _ContextRetrieverDataCollection = class _ContextRetrieverDataCollection {
150918
151176
  __publicField2(this, "dataCollectionFlagState", false);
150919
151177
  __publicField2(this, "gitMetadataInstance", GitHubDotComRepoMetadata.getInstance());
150920
151178
  __publicField2(this, "retrieverConfigs", [
150921
- { identifier: RetrieverIdentifier.RecentCopyRetriever, maxSnippets: 1 },
150922
151179
  { identifier: RetrieverIdentifier.RecentEditsRetriever, maxSnippets: 15 },
150923
151180
  { identifier: RetrieverIdentifier.DiagnosticsRetriever, maxSnippets: 15 },
150924
- { identifier: RetrieverIdentifier.RecentViewPortRetriever, maxSnippets: 10 },
150925
- { identifier: RetrieverIdentifier.JaccardSimilarityRetriever, maxSnippets: 15 }
151181
+ { identifier: RetrieverIdentifier.RecentViewPortRetriever, maxSnippets: 10 }
150926
151182
  ]);
150927
151183
  this.disposables.push(
150928
151184
  subscriptionDisposable(
@@ -150974,12 +151230,14 @@ const _ContextRetrieverDataCollection = class _ContextRetrieverDataCollection {
150974
151230
  switch (config2.identifier) {
150975
151231
  case RetrieverIdentifier.RecentEditsRetriever:
150976
151232
  return new RecentEditsRetriever({
150977
- maxAgeMs: 10 * 60 * 1e3
151233
+ maxAgeMs: 10 * 60 * 1e3,
151234
+ diffStrategyIdentifier: RecentEditsRetrieverDiffStrategyIdentifier.UnifiedDiffWithLineNumbers
150978
151235
  });
150979
151236
  case RetrieverIdentifier.DiagnosticsRetriever:
150980
151237
  return new DiagnosticsRetriever({
150981
- contextLines: 3,
150982
- useXMLForPromptRendering: true
151238
+ contextLines: 0,
151239
+ useXMLForPromptRendering: false,
151240
+ useCaretToIndicateErrorLocation: false
150983
151241
  });
150984
151242
  case RetrieverIdentifier.RecentViewPortRetriever:
150985
151243
  return new RecentViewPortRetriever({
@@ -151019,11 +151277,17 @@ const _ContextRetrieverDataCollection = class _ContextRetrieverDataCollection {
151019
151277
  __publicField2(_ContextRetrieverDataCollection, "MAX_PAYLOAD_SIZE_BYTES", 1024 * 1024);
151020
151278
  let ContextRetrieverDataCollection = _ContextRetrieverDataCollection;
151021
151279
  class ContextMixer {
151022
- constructor({ strategyFactory, dataCollectionEnabled = false }) {
151280
+ constructor({
151281
+ strategyFactory,
151282
+ contextRankingStrategy,
151283
+ dataCollectionEnabled = false
151284
+ }) {
151023
151285
  __publicField2(this, "disposables", []);
151024
151286
  __publicField2(this, "contextDataCollector", null);
151025
151287
  __publicField2(this, "strategyFactory");
151288
+ __publicField2(this, "contextRankingStrategy");
151026
151289
  this.strategyFactory = strategyFactory;
151290
+ this.contextRankingStrategy = contextRankingStrategy;
151027
151291
  if (dataCollectionEnabled) {
151028
151292
  this.contextDataCollector = new ContextRetrieverDataCollection();
151029
151293
  this.disposables.push(this.contextDataCollector);
@@ -151088,7 +151352,7 @@ class ContextMixer {
151088
151352
  contextLoggingSnippets
151089
151353
  };
151090
151354
  }
151091
- const contextRanker = new DefaultCompletionsContextRanker();
151355
+ const contextRanker = new DefaultCompletionsContextRanker(this.contextRankingStrategy);
151092
151356
  const fusedResults = contextRanker.rankAndFuseContext(results);
151093
151357
  let totalChars = options.docContext.prefix.length + options.docContext.suffix.length;
151094
151358
  const mixedContext = [];
@@ -152103,28 +152367,32 @@ class DefaultContextStrategyFactory {
152103
152367
  case "recent-edits":
152104
152368
  this.allLocalRetrievers = [
152105
152369
  new RecentEditsRetriever({
152106
- maxAgeMs: 60 * 1e3
152370
+ maxAgeMs: 60 * 1e3,
152371
+ diffStrategyIdentifier: RecentEditsRetrieverDiffStrategyIdentifier.UnifiedDiff
152107
152372
  })
152108
152373
  ];
152109
152374
  break;
152110
152375
  case "recent-edits-1m":
152111
152376
  this.allLocalRetrievers = [
152112
152377
  new RecentEditsRetriever({
152113
- maxAgeMs: 60 * 1e3
152378
+ maxAgeMs: 60 * 1e3,
152379
+ diffStrategyIdentifier: RecentEditsRetrieverDiffStrategyIdentifier.UnifiedDiff
152114
152380
  })
152115
152381
  ];
152116
152382
  break;
152117
152383
  case "recent-edits-5m":
152118
152384
  this.allLocalRetrievers = [
152119
152385
  new RecentEditsRetriever({
152120
- maxAgeMs: 60 * 5 * 1e3
152386
+ maxAgeMs: 60 * 5 * 1e3,
152387
+ diffStrategyIdentifier: RecentEditsRetrieverDiffStrategyIdentifier.UnifiedDiff
152121
152388
  })
152122
152389
  ];
152123
152390
  break;
152124
152391
  case "recent-edits-mixed":
152125
152392
  this.allLocalRetrievers = [
152126
152393
  new RecentEditsRetriever({
152127
- maxAgeMs: 60 * 1e3
152394
+ maxAgeMs: 60 * 1e3,
152395
+ diffStrategyIdentifier: RecentEditsRetrieverDiffStrategyIdentifier.UnifiedDiff
152128
152396
  }),
152129
152397
  new JaccardSimilarityRetriever()
152130
152398
  ];
@@ -152168,7 +152436,7 @@ class DefaultContextStrategyFactory {
152168
152436
  this.allLocalRetrievers = [
152169
152437
  new RecentEditsRetriever({
152170
152438
  maxAgeMs: 10 * 60 * 1e3,
152171
- addLineNumbersForDiff: true
152439
+ diffStrategyIdentifier: RecentEditsRetrieverDiffStrategyIdentifier.UnifiedDiffWithLineNumbers
152172
152440
  }),
152173
152441
  new DiagnosticsRetriever({
152174
152442
  contextLines: 0,
@@ -152178,12 +152446,7 @@ class DefaultContextStrategyFactory {
152178
152446
  new RecentViewPortRetriever({
152179
152447
  maxTrackedViewPorts: 50,
152180
152448
  maxRetrievedViewPorts: 10
152181
- }),
152182
- new RecentCopyRetriever({
152183
- maxAgeMs: 60 * 1e3,
152184
- maxSelections: 100
152185
- }),
152186
- new JaccardSimilarityRetriever()
152449
+ })
152187
152450
  ];
152188
152451
  break;
152189
152452
  case "jaccard-similarity":
@@ -152251,12 +152514,30 @@ class DefaultContextStrategyFactory {
152251
152514
  this.contextStrategySubscription.unsubscribe();
152252
152515
  }
152253
152516
  }
152254
- async function getModelResponse(url, body2, apiKey) {
152517
+ function completionMatchesSuffix(completion, currentLineSuffix) {
152518
+ if (typeof completion.insertText !== "string") {
152519
+ return false;
152520
+ }
152521
+ const insertion = completion.insertText;
152522
+ let j = 0;
152523
+ for (let i = 0; i < insertion.length; i++) {
152524
+ if (insertion[i] === currentLineSuffix[j]) {
152525
+ j++;
152526
+ }
152527
+ }
152528
+ if (j === currentLineSuffix.length) {
152529
+ return true;
152530
+ }
152531
+ return false;
152532
+ }
152533
+ const autoeditsLogger = new Logger("AutoEdits Testing");
152534
+ async function getModelResponse(url, body2, apiKey, customHeaders = {}) {
152255
152535
  const response = await fetch(url, {
152256
152536
  method: "POST",
152257
152537
  headers: {
152258
152538
  "Content-Type": "application/json",
152259
- Authorization: `Bearer ${apiKey}`
152539
+ Authorization: `Bearer ${apiKey}`,
152540
+ ...customHeaders
152260
152541
  },
152261
152542
  body: body2
152262
152543
  });
@@ -152267,6 +152548,253 @@ async function getModelResponse(url, body2, apiKey) {
152267
152548
  const data2 = await response.json();
152268
152549
  return data2;
152269
152550
  }
152551
+ function getDecorationInfo(originalText, modifiedText) {
152552
+ const originalLines = originalText.split(getNewLineChar(originalText));
152553
+ const modifiedLines = modifiedText.split(getNewLineChar(modifiedText));
152554
+ const lineInfos = computeDiffOperations(originalLines, modifiedLines);
152555
+ const decorationInfo = {
152556
+ modifiedLines: [],
152557
+ removedLines: [],
152558
+ addedLines: [],
152559
+ unchangedLines: []
152560
+ };
152561
+ for (const lineInfo of lineInfos) {
152562
+ switch (lineInfo.type) {
152563
+ case "unchanged":
152564
+ decorationInfo.unchangedLines.push(lineInfo);
152565
+ break;
152566
+ case "added":
152567
+ decorationInfo.addedLines.push(lineInfo);
152568
+ break;
152569
+ case "removed":
152570
+ decorationInfo.removedLines.push(lineInfo);
152571
+ break;
152572
+ case "modified":
152573
+ decorationInfo.modifiedLines.push(lineInfo);
152574
+ break;
152575
+ }
152576
+ }
152577
+ return decorationInfo;
152578
+ }
152579
+ function computeDiffOperations(originalLines, modifiedLines) {
152580
+ const diffs = diff_1(originalLines, modifiedLines);
152581
+ const lineInfos = [];
152582
+ let originalIndex = 0;
152583
+ let modifiedIndex = 0;
152584
+ for (const [originalStart, originalEnd, modifiedStart, modifiedEnd] of diffs) {
152585
+ while (originalIndex < originalStart && modifiedIndex < modifiedStart) {
152586
+ lineInfos.push({
152587
+ type: "unchanged",
152588
+ lineNumber: modifiedIndex,
152589
+ text: modifiedLines[modifiedIndex]
152590
+ });
152591
+ originalIndex++;
152592
+ modifiedIndex++;
152593
+ }
152594
+ const numDeletions = originalEnd - originalStart;
152595
+ const numInsertions = modifiedEnd - modifiedStart;
152596
+ const numReplacements = Math.min(numDeletions, numInsertions);
152597
+ for (let i = 0; i < numReplacements; i++) {
152598
+ const modifiedLineInfo = createModifiedLineInfo({
152599
+ modifiedLineNumber: modifiedStart + i,
152600
+ originalText: originalLines[originalStart + i],
152601
+ modifiedText: modifiedLines[modifiedStart + i]
152602
+ });
152603
+ lineInfos.push(modifiedLineInfo);
152604
+ }
152605
+ for (let i = numReplacements; i < numDeletions; i++) {
152606
+ lineInfos.push({
152607
+ type: "removed",
152608
+ lineNumber: originalStart + i,
152609
+ // Line number in the originalLines
152610
+ text: originalLines[originalStart + i]
152611
+ });
152612
+ }
152613
+ for (let i = numReplacements; i < numInsertions; i++) {
152614
+ lineInfos.push({
152615
+ type: "added",
152616
+ lineNumber: modifiedStart + i,
152617
+ // Line number in the modifiedLines
152618
+ text: modifiedLines[modifiedStart + i]
152619
+ });
152620
+ }
152621
+ originalIndex = originalEnd;
152622
+ modifiedIndex = modifiedEnd;
152623
+ }
152624
+ while (originalIndex < originalLines.length && modifiedIndex < modifiedLines.length) {
152625
+ lineInfos.push({
152626
+ type: "unchanged",
152627
+ lineNumber: modifiedIndex,
152628
+ text: modifiedLines[modifiedIndex]
152629
+ });
152630
+ originalIndex++;
152631
+ modifiedIndex++;
152632
+ }
152633
+ return lineInfos;
152634
+ }
152635
+ function createModifiedLineInfo({
152636
+ modifiedLineNumber,
152637
+ originalText,
152638
+ modifiedText
152639
+ }) {
152640
+ const oldChunks = splitLineIntoChunks(originalText);
152641
+ const newChunks = splitLineIntoChunks(modifiedText);
152642
+ const lineChanges = computeLineChanges({ oldChunks, newChunks, lineNumber: modifiedLineNumber });
152643
+ return {
152644
+ type: "modified",
152645
+ lineNumber: modifiedLineNumber,
152646
+ oldText: originalText,
152647
+ newText: modifiedText,
152648
+ changes: lineChanges
152649
+ };
152650
+ }
152651
+ function computeLineChanges({
152652
+ oldChunks,
152653
+ newChunks,
152654
+ lineNumber
152655
+ }) {
152656
+ const changes = [];
152657
+ const chunkDiffs = diff_1(oldChunks, newChunks);
152658
+ let oldIndex = 0;
152659
+ let newIndex = 0;
152660
+ let oldOffset = 0;
152661
+ let newOffset = 0;
152662
+ for (const [oldStart, oldEnd, newStart, newEnd] of chunkDiffs) {
152663
+ while (oldIndex < oldStart && newIndex < newStart) {
152664
+ oldOffset += oldChunks[oldIndex].length;
152665
+ newOffset += newChunks[newIndex].length;
152666
+ oldIndex++;
152667
+ newIndex++;
152668
+ }
152669
+ let deletionText = "";
152670
+ const deletionStartOffset = oldOffset;
152671
+ for (let i = oldStart; i < oldEnd; i++) {
152672
+ deletionText += oldChunks[i];
152673
+ oldOffset += oldChunks[i].length;
152674
+ oldIndex++;
152675
+ }
152676
+ if (deletionText) {
152677
+ const deleteRange = new Range(lineNumber, deletionStartOffset, lineNumber, oldOffset);
152678
+ const lastChange = changes[changes.length - 1];
152679
+ if (lastChange && lastChange.type === "delete" && lastChange.range.end.isEqual(deleteRange.start)) {
152680
+ lastChange.text += deletionText;
152681
+ lastChange.range = new Range(lastChange.range.start, deleteRange.end);
152682
+ } else {
152683
+ changes.push({
152684
+ type: "delete",
152685
+ range: deleteRange,
152686
+ text: deletionText
152687
+ });
152688
+ }
152689
+ }
152690
+ let insertionText = "";
152691
+ const insertionStartOffset = newOffset;
152692
+ for (let i = newStart; i < newEnd; i++) {
152693
+ insertionText += newChunks[i];
152694
+ newOffset += newChunks[i].length;
152695
+ newIndex++;
152696
+ }
152697
+ if (insertionText) {
152698
+ const insertRange = new Range(
152699
+ lineNumber,
152700
+ insertionStartOffset,
152701
+ lineNumber,
152702
+ insertionStartOffset + insertionText.length
152703
+ );
152704
+ const lastChange = changes[changes.length - 1];
152705
+ if (lastChange && lastChange.type === "insert" && lastChange.range.end.isEqual(insertRange.start)) {
152706
+ lastChange.text += insertionText;
152707
+ lastChange.range = new Range(lastChange.range.start, insertRange.end);
152708
+ } else {
152709
+ changes.push({
152710
+ type: "insert",
152711
+ range: insertRange,
152712
+ text: insertionText
152713
+ });
152714
+ }
152715
+ }
152716
+ }
152717
+ while (oldIndex < oldChunks.length && newIndex < newChunks.length) {
152718
+ oldOffset += oldChunks[oldIndex].length;
152719
+ newOffset += newChunks[newIndex].length;
152720
+ oldIndex++;
152721
+ newIndex++;
152722
+ }
152723
+ return changes;
152724
+ }
152725
+ function splitLineIntoChunks(line) {
152726
+ return line.match(/(\w+|\s+|\W)/g) || [];
152727
+ }
152728
+ function splitLinesKeepEnds(s) {
152729
+ const pattern = /[^\r\n]*(?:\r\n|\n|\r|$)/g;
152730
+ const lines2 = s.match(pattern) || [];
152731
+ if (lines2.length > 1 && lines2[lines2.length - 1] === "") {
152732
+ lines2.pop();
152733
+ }
152734
+ return lines2;
152735
+ }
152736
+ function extractInlineCompletionFromRewrittenCode(prediction, codeToRewritePrefix, codeToRewriteSuffix) {
152737
+ const predictionWithoutPrefix = prediction.slice(codeToRewritePrefix.length);
152738
+ const endIndex = predictionWithoutPrefix.length - codeToRewriteSuffix.length;
152739
+ const completion = predictionWithoutPrefix.slice(0, endIndex);
152740
+ const completionNumLines = lines(completion).length;
152741
+ const completionWithSameLineSuffix = lines(predictionWithoutPrefix).slice(0, completionNumLines);
152742
+ return completionWithSameLineSuffix.join(getNewLineChar(codeToRewritePrefix + codeToRewriteSuffix));
152743
+ }
152744
+ function isPredictedTextAlreadyInSuffix({
152745
+ codeToRewrite,
152746
+ prediction,
152747
+ suffix
152748
+ }) {
152749
+ const { addedLines } = getDecorationInfo(codeToRewrite, prediction);
152750
+ if (addedLines.length === 0) {
152751
+ return false;
152752
+ }
152753
+ const allAddedLinesText = addedLines.sort((a, b) => a.lineNumber - b.lineNumber).map((line) => line.text).join(getNewLineChar(codeToRewrite));
152754
+ return suffix.startsWith(allAddedLinesText);
152755
+ }
152756
+ function adjustPredictionIfInlineCompletionPossible(originalPrediction, prefix, suffix) {
152757
+ const prefixWithoutNewLine = trimNewLineCharsFromString(prefix);
152758
+ const suffixWithoutNewLine = trimNewLineCharsFromString(suffix);
152759
+ const indexPrefix = originalPrediction.indexOf(prefixWithoutNewLine);
152760
+ const indexSuffix = originalPrediction.lastIndexOf(suffixWithoutNewLine);
152761
+ if (indexPrefix === -1 || indexSuffix === -1) {
152762
+ return originalPrediction;
152763
+ }
152764
+ const predictionBeforePrefixMatch = originalPrediction.slice(0, indexPrefix);
152765
+ const predictionAfterSuffixMatch = originalPrediction.slice(
152766
+ indexSuffix + suffixWithoutNewLine.length
152767
+ );
152768
+ if (!isAllNewLineChars(predictionBeforePrefixMatch) || !isAllNewLineChars(predictionAfterSuffixMatch)) {
152769
+ return originalPrediction;
152770
+ }
152771
+ let completion = originalPrediction.slice(indexPrefix + prefixWithoutNewLine.length, indexSuffix);
152772
+ const trimStartChars = Math.min(countNewLineCharsStart(completion), countNewLineCharsEnd(prefix));
152773
+ const trimEndChars = Math.min(countNewLineCharsEnd(completion), countNewLineCharsStart(suffix));
152774
+ completion = completion.substring(
152775
+ trimStartChars,
152776
+ Math.max(trimStartChars, completion.length - trimEndChars)
152777
+ );
152778
+ const prediction = prefix + completion + suffix;
152779
+ return prediction;
152780
+ }
152781
+ function countNewLineCharsEnd(text) {
152782
+ const match2 = text.match(/(?:\r\n|\n)+$/);
152783
+ return match2 ? match2[0].length : 0;
152784
+ }
152785
+ function countNewLineCharsStart(text) {
152786
+ const match2 = text.match(/^(?:\r\n|\n)+/);
152787
+ return match2 ? match2[0].length : 0;
152788
+ }
152789
+ function isAllNewLineChars(text) {
152790
+ return /^[\r\n]*$/.test(text);
152791
+ }
152792
+ function trimNewLineCharsFromString(text) {
152793
+ return text.replace(/^(?:\r\n|\n)+|(?:\r\n|\n)+$/g, "");
152794
+ }
152795
+ function clip(line, min, max) {
152796
+ return Math.max(Math.min(line, max), min);
152797
+ }
152270
152798
  const LINT_ERRORS_TAG_OPEN = ps`<lint_errors>`;
152271
152799
  const LINT_ERRORS_TAG_CLOSE = ps`</lint_errors>`;
152272
152800
  const EXTRACTED_CODE_SNIPPETS_TAG_OPEN = ps`<extracted_code_snippets>`;
@@ -152295,7 +152823,7 @@ const RECENT_EDITS_INSTRUCTION = ps`Here is my recent series of edits from oldes
152295
152823
  const LINT_ERRORS_INSTRUCTION = ps`Here are some linter errors from the code that you will rewrite.\n`;
152296
152824
  const RECENT_COPY_INSTRUCTION = ps`Here is some recent code I copied from the editor.\n`;
152297
152825
  const CURRENT_FILE_INSTRUCTION = ps`Here is the file that I am looking at `;
152298
- function getBaseUserPrompt(docContext, document2, context2, tokenBudget) {
152826
+ function getBaseUserPrompt(docContext, document2, position, context2, tokenBudget) {
152299
152827
  const contextItemMapping = getContextItemMappingWithTokenLimit(
152300
152828
  context2,
152301
152829
  tokenBudget.contextSpecificTokenLimit
@@ -152303,6 +152831,7 @@ function getBaseUserPrompt(docContext, document2, context2, tokenBudget) {
152303
152831
  const { fileWithMarkerPrompt, areaPrompt, codeToReplace } = getCurrentFilePromptComponents({
152304
152832
  docContext,
152305
152833
  document: document2,
152834
+ position,
152306
152835
  maxPrefixLinesInArea: tokenBudget.maxPrefixLinesInArea,
152307
152836
  maxSuffixLinesInArea: tokenBudget.maxSuffixLinesInArea,
152308
152837
  codeToRewritePrefixLines: tokenBudget.codeToRewritePrefixLines,
@@ -152343,10 +152872,10 @@ ${recentCopyPrompt}
152343
152872
  ${areaPrompt}
152344
152873
  ${FINAL_USER_PROMPT}
152345
152874
  `;
152346
- logDebug$1("AutoEdits", "Prompt\n", finalPrompt);
152875
+ autoeditsLogger.logDebug("AutoEdits", "Prompt\n", finalPrompt);
152347
152876
  return {
152348
152877
  codeToReplace,
152349
- promptResponse: finalPrompt
152878
+ prompt: finalPrompt
152350
152879
  };
152351
152880
  }
152352
152881
  function getPromptForTheContextSource(contextItems, instructionPrompt, callback) {
@@ -152357,33 +152886,20 @@ function getPromptForTheContextSource(contextItems, instructionPrompt, callback)
152357
152886
  return ps`${instructionPrompt}${prompt}\n`;
152358
152887
  }
152359
152888
  function getCurrentFilePromptComponents(options) {
152360
- const { prefix, suffix } = PromptString.fromAutocompleteDocumentContext(
152361
- options.docContext,
152362
- options.document.uri
152363
- );
152364
- const completePrefixLines = options.docContext.completePrefix.split("\n").length;
152365
- const prefixContext = getPrefixContext(
152366
- prefix,
152367
- options.maxPrefixLinesInArea,
152368
- options.codeToRewritePrefixLines
152369
- );
152370
- const suffixContext = getSuffixContext(
152371
- suffix,
152372
- options.maxSuffixLinesInArea,
152373
- options.codeToRewriteSuffixLines
152374
- );
152375
- const codeToRewrite = PromptString.join(
152376
- [prefixContext.codeToRewritePrefix, suffixContext.codeToRewriteSuffix],
152377
- ps``
152378
- );
152889
+ const currentFileContext = getCurrentFileContext(options);
152379
152890
  const codeToReplace = {
152380
- codeToRewrite,
152381
- startLine: completePrefixLines - prefixContext.codeToRewriteStartLines,
152382
- endLine: completePrefixLines + suffixContext.codeToRewriteEndLines
152891
+ codeToRewrite: currentFileContext.codeToRewrite.toString(),
152892
+ range: currentFileContext.range,
152893
+ codeToRewritePrefix: currentFileContext.codeToRewritePrefix.toString(),
152894
+ codeToRewriteSuffix: currentFileContext.codeToRewriteSuffix.toString(),
152895
+ prefixBeforeArea: currentFileContext.prefixBeforeArea.toString(),
152896
+ suffixAfterArea: currentFileContext.suffixAfterArea.toString(),
152897
+ prefixInArea: currentFileContext.prefixInArea.toString(),
152898
+ suffixInArea: currentFileContext.suffixInArea.toString()
152383
152899
  };
152384
- const fileWithMarker = ps`${prefixContext.prefixBeforeArea}
152900
+ const fileWithMarker = ps`${currentFileContext.prefixBeforeArea}
152385
152901
  ${AREA_FOR_CODE_MARKER}
152386
- ${suffixContext.suffixAfterArea}`;
152902
+ ${currentFileContext.suffixAfterArea}`;
152387
152903
  const filePrompt = getContextPromptWithPath(
152388
152904
  PromptString.fromDisplayPath(options.document.uri),
152389
152905
  ps`${FILE_TAG_OPEN}
@@ -152392,15 +152908,68 @@ ${FILE_TAG_CLOSE}
152392
152908
  `
152393
152909
  );
152394
152910
  const areaPrompt = ps`${AREA_FOR_CODE_MARKER_OPEN}
152395
- ${prefixContext.prefixInArea}
152911
+ ${currentFileContext.prefixInArea}
152396
152912
  ${CODE_TO_REWRITE_TAG_OPEN}
152397
- ${codeToRewrite}
152913
+ ${currentFileContext.codeToRewrite}
152398
152914
  ${CODE_TO_REWRITE_TAG_CLOSE}
152399
- ${suffixContext.suffixInArea}
152915
+ ${currentFileContext.suffixInArea}
152400
152916
  ${AREA_FOR_CODE_MARKER_CLOSE}
152401
152917
  `;
152402
152918
  return { fileWithMarkerPrompt: filePrompt, areaPrompt, codeToReplace };
152403
152919
  }
152920
+ function getCurrentFileContext(options) {
152921
+ const { position, document: document2, docContext } = options;
152922
+ const numContextLines = splitLinesKeepEnds(docContext.prefix + docContext.suffix).length;
152923
+ const numPrefixLines = splitLinesKeepEnds(docContext.prefix).length;
152924
+ const adjustment = position.character !== 0 ? 1 : 0;
152925
+ const minLine = clip(position.line - numPrefixLines + adjustment, 0, document2.lineCount - 1);
152926
+ const maxLine = clip(minLine + numContextLines - 1, 0, document2.lineCount - 1);
152927
+ const codeToRewriteStart = clip(position.line - options.codeToRewritePrefixLines, minLine, maxLine);
152928
+ const codeToRewriteEnd = clip(position.line + options.codeToRewriteSuffixLines, minLine, maxLine);
152929
+ const areaStart = clip(
152930
+ position.line - options.maxPrefixLinesInArea - options.codeToRewritePrefixLines,
152931
+ minLine,
152932
+ maxLine
152933
+ );
152934
+ const areaEnd = clip(
152935
+ position.line + options.maxSuffixLinesInArea + options.codeToRewriteSuffixLines,
152936
+ minLine,
152937
+ maxLine
152938
+ );
152939
+ const positionAtLineStart = (line) => new Position(line, 0);
152940
+ const positionAtLineEnd = (line) => document2.lineAt(line).rangeIncludingLineBreak.end;
152941
+ const ranges2 = {
152942
+ codeToRewrite: new Range(
152943
+ positionAtLineStart(codeToRewriteStart),
152944
+ positionAtLineEnd(codeToRewriteEnd)
152945
+ ),
152946
+ codeToRewritePrefix: new Range(
152947
+ positionAtLineStart(codeToRewriteStart),
152948
+ new Position(position.line, position.character)
152949
+ ),
152950
+ codeToRewriteSuffix: new Range(
152951
+ new Position(position.line, position.character),
152952
+ positionAtLineEnd(codeToRewriteEnd)
152953
+ ),
152954
+ prefixInArea: new Range(
152955
+ positionAtLineStart(areaStart),
152956
+ positionAtLineStart(codeToRewriteStart)
152957
+ ),
152958
+ suffixInArea: new Range(positionAtLineEnd(codeToRewriteEnd), positionAtLineEnd(areaEnd)),
152959
+ prefixBeforeArea: new Range(positionAtLineStart(minLine), positionAtLineStart(areaStart)),
152960
+ suffixAfterArea: new Range(positionAtLineEnd(areaEnd), positionAtLineEnd(maxLine))
152961
+ };
152962
+ return {
152963
+ codeToRewrite: PromptString.fromDocumentText(document2, ranges2.codeToRewrite),
152964
+ codeToRewritePrefix: PromptString.fromDocumentText(document2, ranges2.codeToRewritePrefix),
152965
+ codeToRewriteSuffix: PromptString.fromDocumentText(document2, ranges2.codeToRewriteSuffix),
152966
+ prefixInArea: PromptString.fromDocumentText(document2, ranges2.prefixInArea),
152967
+ suffixInArea: PromptString.fromDocumentText(document2, ranges2.suffixInArea),
152968
+ prefixBeforeArea: PromptString.fromDocumentText(document2, ranges2.prefixBeforeArea),
152969
+ suffixAfterArea: PromptString.fromDocumentText(document2, ranges2.suffixAfterArea),
152970
+ range: ranges2.codeToRewrite
152971
+ };
152972
+ }
152404
152973
  function getLintErrorsPrompt(contextItems) {
152405
152974
  const lintErrors = getContextItemsForIdentifier(
152406
152975
  contextItems,
@@ -152524,54 +153093,6 @@ ${snippetsPrompt}
152524
153093
  ${EXTRACTED_CODE_SNIPPETS_TAG_CLOSE}
152525
153094
  `;
152526
153095
  }
152527
- function getPrefixContext(prefix, prefixAreaLinesBudget, codeToRewritePrefixLines) {
152528
- const prefixLines = prefix.split("\n");
152529
- const totalLines = prefixLines.length;
152530
- const actualPrefixLinesBudget = Math.min(
152531
- prefixAreaLinesBudget + codeToRewritePrefixLines,
152532
- totalLines
152533
- );
152534
- const actualCodeToRewritePrefixLines = Math.min(codeToRewritePrefixLines, actualPrefixLinesBudget);
152535
- const codeToRewriteStart = totalLines - actualCodeToRewritePrefixLines;
152536
- const prefixInAreaStart = codeToRewriteStart - (actualPrefixLinesBudget - actualCodeToRewritePrefixLines);
152537
- const prefixBeforeArea = PromptString.join(prefixLines.slice(0, prefixInAreaStart), ps`\n`);
152538
- const prefixInArea = PromptString.join(
152539
- prefixLines.slice(prefixInAreaStart, codeToRewriteStart),
152540
- ps`\n`
152541
- );
152542
- const codeToRewritePrefix = PromptString.join(prefixLines.slice(codeToRewriteStart), ps`\n`);
152543
- return {
152544
- prefixBeforeArea,
152545
- prefixInArea,
152546
- codeToRewritePrefix,
152547
- codeToRewriteStartLines: totalLines - codeToRewriteStart,
152548
- totalPrefixLines: totalLines
152549
- };
152550
- }
152551
- function getSuffixContext(suffix, suffixAreaLinesBudget, codeToRewriteSuffixLines) {
152552
- const suffixLines = suffix.split("\n");
152553
- const totalLines = suffixLines.length;
152554
- const actualSuffixAreaLinesBudget = Math.min(
152555
- suffixAreaLinesBudget + codeToRewriteSuffixLines,
152556
- totalLines
152557
- );
152558
- const actualCodeToRewriteSuffixLines = Math.min(
152559
- codeToRewriteSuffixLines,
152560
- actualSuffixAreaLinesBudget
152561
- );
152562
- const codeToRewriteEnd = actualCodeToRewriteSuffixLines;
152563
- const suffixInAreaEnd = actualSuffixAreaLinesBudget;
152564
- const codeToRewriteSuffix = PromptString.join(suffixLines.slice(0, codeToRewriteEnd), ps`\n`);
152565
- const suffixInArea = PromptString.join(suffixLines.slice(codeToRewriteEnd, suffixInAreaEnd), ps`\n`);
152566
- const suffixAfterArea = PromptString.join(suffixLines.slice(suffixInAreaEnd), ps`\n`);
152567
- return {
152568
- codeToRewriteSuffix,
152569
- suffixInArea,
152570
- suffixAfterArea,
152571
- codeToRewriteEndLines: codeToRewriteEnd - 1,
152572
- totalSuffixLines: totalLines
152573
- };
152574
- }
152575
153096
  function getContextItemMappingWithTokenLimit(contextItems, contextTokenLimitMapping) {
152576
153097
  const contextItemMapping = /* @__PURE__ */ new Map();
152577
153098
  for (const item of contextItems) {
@@ -152586,23 +153107,25 @@ function getContextItemMappingWithTokenLimit(contextItems, contextTokenLimitMapp
152586
153107
  if (tokenLimit !== void 0) {
152587
153108
  contextItemMapping.set(identifier, getContextItemsInTokenBudget(items, tokenLimit));
152588
153109
  } else {
152589
- logDebug$1("AutoEdits", `No token limit for ${identifier}`);
153110
+ autoeditsLogger.logDebug("AutoEdits", `No token limit for ${identifier}`);
152590
153111
  contextItemMapping.set(identifier, []);
152591
153112
  }
152592
153113
  }
152593
153114
  return contextItemMapping;
152594
153115
  }
152595
153116
  function getContextItemsInTokenBudget(contextItems, tokenBudget) {
152596
- const CHARS_PER_TOKEN = 4;
153117
+ const autocompleteItemsWithBudget = [];
152597
153118
  let currentCharsCount = 0;
152598
- const charsBudget = tokenBudget * CHARS_PER_TOKEN;
153119
+ const charsBudget = tokensToChars(tokenBudget);
152599
153120
  for (let i = 0; i < contextItems.length; i++) {
152600
- currentCharsCount += contextItems[i].content.length;
152601
- if (currentCharsCount > charsBudget) {
152602
- return contextItems.slice(0, i);
153121
+ const item = contextItems[i];
153122
+ if (currentCharsCount + item.content.length > charsBudget) {
153123
+ continue;
152603
153124
  }
153125
+ currentCharsCount += item.content.length;
153126
+ autocompleteItemsWithBudget.push(item);
152604
153127
  }
152605
- return contextItems;
153128
+ return autocompleteItemsWithBudget;
152606
153129
  }
152607
153130
  function getContextItemsForIdentifier(contextItems, identifier) {
152608
153131
  return contextItems.filter((item) => item.identifier === identifier);
@@ -152610,56 +153133,117 @@ function getContextItemsForIdentifier(contextItems, identifier) {
152610
153133
  function getContextPromptWithPath(filePath, content) {
152611
153134
  return ps`(\`${filePath}\`)\n\n${content}\n`;
152612
153135
  }
152613
- class DeepSeekPromptProvider {
152614
- constructor() {
152615
- __publicField2(this, "bosToken", ps`<|begin▁of▁sentence|>`);
152616
- __publicField2(this, "userToken", ps`User: `);
152617
- __publicField2(this, "assistantToken", ps`Assistant: `);
153136
+ class CodyGatewayAdapter {
153137
+ getPrompt(docContext, document2, position, context2, tokenBudget) {
153138
+ const { codeToReplace, prompt: userPrompt } = getBaseUserPrompt(
153139
+ docContext,
153140
+ document2,
153141
+ position,
153142
+ context2,
153143
+ tokenBudget
153144
+ );
153145
+ const promptResponse = [
153146
+ {
153147
+ role: "system",
153148
+ content: SYSTEM_PROMPT
153149
+ },
153150
+ {
153151
+ role: "user",
153152
+ content: userPrompt
153153
+ }
153154
+ ];
153155
+ return { codeToReplace, promptResponse };
153156
+ }
153157
+ postProcessResponse(codeToReplace, response) {
153158
+ return response;
153159
+ }
153160
+ async getModelResponse(option) {
153161
+ try {
153162
+ const headers = {
153163
+ "X-Sourcegraph-Feature": "code_completions"
153164
+ };
153165
+ const body2 = {
153166
+ stream: false,
153167
+ model: option.model,
153168
+ messages: option.prompt,
153169
+ temperature: 0.2,
153170
+ max_tokens: 256,
153171
+ response_format: {
153172
+ type: "text"
153173
+ },
153174
+ speculation: option.codeToRewrite,
153175
+ user: option.userId
153176
+ };
153177
+ const response = await getModelResponse(
153178
+ option.url,
153179
+ JSON.stringify(body2),
153180
+ option.apiKey,
153181
+ headers
153182
+ );
153183
+ return response.choices[0].message.content;
153184
+ } catch (error) {
153185
+ autoeditsLogger.logDebug("AutoEdits", "Error calling Cody Gateway:", error);
153186
+ throw error;
153187
+ }
152618
153188
  }
152619
- getPrompt(docContext, document2, context2, tokenBudget) {
152620
- const { codeToReplace, promptResponse: userPrompt } = getBaseUserPrompt(
153189
+ }
153190
+ class FireworksAdapter {
153191
+ getPrompt(docContext, document2, position, context2, tokenBudget) {
153192
+ const { codeToReplace, prompt: userPrompt } = getBaseUserPrompt(
152621
153193
  docContext,
152622
153194
  document2,
153195
+ position,
152623
153196
  context2,
152624
153197
  tokenBudget
152625
153198
  );
152626
- const prompt = ps`${this.bosToken}${SYSTEM_PROMPT}
152627
-
152628
- ${this.userToken}${userPrompt}
152629
-
152630
- ${this.assistantToken}`;
153199
+ const prompt = [
153200
+ {
153201
+ role: "system",
153202
+ content: SYSTEM_PROMPT
153203
+ },
153204
+ {
153205
+ role: "user",
153206
+ content: userPrompt
153207
+ }
153208
+ ];
152631
153209
  return {
152632
153210
  codeToReplace,
152633
153211
  promptResponse: prompt
152634
153212
  };
152635
153213
  }
152636
- postProcessResponse(response) {
153214
+ postProcessResponse(codeToReplace, response) {
152637
153215
  return response;
152638
153216
  }
152639
- async getModelResponse(model2, apiKey, prompt) {
153217
+ async getModelResponse(option) {
152640
153218
  try {
152641
153219
  const response = await getModelResponse(
152642
- "https://api.fireworks.ai/inference/v1/completions",
153220
+ option.url,
152643
153221
  JSON.stringify({
152644
- model: model2,
152645
- prompt: prompt.toString(),
152646
- temperature: 0.5,
152647
- max_tokens: 256
153222
+ model: option.model,
153223
+ messages: option.prompt,
153224
+ temperature: 0.2,
153225
+ max_tokens: 256,
153226
+ response_format: {
153227
+ type: "text"
153228
+ },
153229
+ speculation: option.codeToRewrite,
153230
+ user: option.userId
152648
153231
  }),
152649
- apiKey
153232
+ option.apiKey
152650
153233
  );
152651
- return response.choices[0].text;
153234
+ return response.choices[0].message.content;
152652
153235
  } catch (error) {
152653
- logDebug$1("AutoEdits", "Error calling Fireworks API:", error);
153236
+ autoeditsLogger.logDebug("AutoEdits", "Error calling Fireworks API:", error);
152654
153237
  throw error;
152655
153238
  }
152656
153239
  }
152657
153240
  }
152658
- class OpenAIPromptProvider {
152659
- getPrompt(docContext, document2, context2, tokenBudget) {
152660
- const { codeToReplace, promptResponse: userPrompt } = getBaseUserPrompt(
153241
+ class OpenAIAdapter {
153242
+ getPrompt(docContext, document2, position, context2, tokenBudget) {
153243
+ const { codeToReplace, prompt: userPrompt } = getBaseUserPrompt(
152661
153244
  docContext,
152662
153245
  document2,
153246
+ position,
152663
153247
  context2,
152664
153248
  tokenBudget
152665
153249
  );
@@ -152678,27 +153262,27 @@ class OpenAIPromptProvider {
152678
153262
  promptResponse: prompt
152679
153263
  };
152680
153264
  }
152681
- postProcessResponse(response) {
153265
+ postProcessResponse(_2, response) {
152682
153266
  return response;
152683
153267
  }
152684
- async getModelResponse(model2, apiKey, prompt) {
153268
+ async getModelResponse(option) {
152685
153269
  try {
152686
153270
  const response = await getModelResponse(
152687
- "https://api.openai.com/v1/chat/completions",
153271
+ option.url,
152688
153272
  JSON.stringify({
152689
- model: model2,
152690
- messages: prompt,
153273
+ model: option.model,
153274
+ messages: option.prompt,
152691
153275
  temperature: 0.5,
152692
153276
  max_tokens: 256,
152693
153277
  response_format: {
152694
153278
  type: "text"
152695
153279
  }
152696
153280
  }),
152697
- apiKey
153281
+ option.apiKey
152698
153282
  );
152699
153283
  return response.choices[0].message.content;
152700
153284
  } catch (error) {
152701
- logDebug$1("AutoEdits", "Error calling OpenAI API:", error);
153285
+ autoeditsLogger.logDebug("AutoEdits", "Error calling OpenAI API:", error);
152702
153286
  throw error;
152703
153287
  }
152704
153288
  }
@@ -152972,250 +153556,724 @@ class GhostHintDecorator {
152972
153556
  this.activeDisposables = [];
152973
153557
  }
152974
153558
  }
152975
- const strikeThroughDecorationType = window$1.createTextEditorDecorationType({
152976
- textDecoration: "line-through"
152977
- });
152978
- const suggesterType = window$1.createTextEditorDecorationType({
152979
- before: { color: GHOST_TEXT_COLOR$1 },
152980
- after: { color: GHOST_TEXT_COLOR$1 }
152981
- });
152982
- class AutoEditsRenderer {
152983
- constructor() {
152984
- __publicField2(this, "disposables", []);
152985
- __publicField2(this, "activeProposedChange", null);
152986
- this.disposables.push(
152987
- commands$1.registerCommand(
152988
- "cody.supersuggest.accept",
152989
- () => this.acceptProposedChange(),
152990
- this.disposables
152991
- )
152992
- );
152993
- this.disposables.push(
152994
- commands$1.registerCommand(
152995
- "cody.supersuggest.dismiss",
152996
- () => this.dismissProposedChange(),
152997
- this.disposables
152998
- )
152999
- );
153559
+ class DefaultDecorator {
153560
+ constructor(editor) {
153561
+ __publicField2(this, "decorationTypes");
153562
+ __publicField2(this, "removedTextDecorationType");
153563
+ __publicField2(this, "modifiedTextDecorationType");
153564
+ __publicField2(this, "suggesterType");
153565
+ __publicField2(this, "hideRemainderDecorationType");
153566
+ __publicField2(this, "addedLinesDecorationType");
153567
+ __publicField2(this, "insertMarkerDecorationType");
153568
+ __publicField2(this, "editor");
153569
+ this.editor = editor;
153570
+ this.removedTextDecorationType = window$1.createTextEditorDecorationType({
153571
+ backgroundColor: new ThemeColor("diffEditor.removedTextBackground")
153572
+ });
153573
+ this.modifiedTextDecorationType = window$1.createTextEditorDecorationType({
153574
+ backgroundColor: new ThemeColor("diffEditor.removedTextBackground")
153575
+ });
153576
+ this.suggesterType = window$1.createTextEditorDecorationType({
153577
+ before: { color: GHOST_TEXT_COLOR$1 },
153578
+ after: { color: GHOST_TEXT_COLOR$1 }
153579
+ });
153580
+ this.hideRemainderDecorationType = window$1.createTextEditorDecorationType({
153581
+ opacity: "0"
153582
+ });
153583
+ this.addedLinesDecorationType = window$1.createTextEditorDecorationType({
153584
+ backgroundColor: "red",
153585
+ // SENTINEL (should not actually appear)
153586
+ before: {
153587
+ backgroundColor: "rgba(100, 255, 100, 0.1)",
153588
+ color: GHOST_TEXT_COLOR$1,
153589
+ height: "100%"
153590
+ }
153591
+ });
153592
+ this.insertMarkerDecorationType = window$1.createTextEditorDecorationType({
153593
+ border: "1px dashed rgba(100, 255, 100, 0.5)",
153594
+ borderWidth: "1px 1px 0 0"
153595
+ });
153596
+ this.decorationTypes = [
153597
+ this.removedTextDecorationType,
153598
+ this.modifiedTextDecorationType,
153599
+ this.suggesterType,
153600
+ this.hideRemainderDecorationType,
153601
+ this.addedLinesDecorationType,
153602
+ this.insertMarkerDecorationType
153603
+ ];
153000
153604
  }
153001
- async render(options, codeToReplace, predictedText) {
153002
- const editor = window$1.activeTextEditor;
153003
- const document2 = editor == null ? void 0 : editor.document;
153004
- if (!editor || !document2 || this.activeProposedChange) {
153005
- return;
153605
+ clearDecorations() {
153606
+ for (const decorationType of this.decorationTypes) {
153607
+ this.editor.setDecorations(decorationType, []);
153006
153608
  }
153007
- const prevSuffixLine = codeToReplace.endLine - 1;
153008
- const range2 = new Range(
153009
- codeToReplace.startLine,
153010
- 0,
153011
- prevSuffixLine,
153012
- options.document.lineAt(prevSuffixLine).range.end.character
153013
- );
153014
- this.activeProposedChange = {
153015
- range: range2,
153016
- newText: predictedText
153017
- };
153018
- const currentFileText = options.document.getText();
153019
- const predictedFileText = currentFileText.slice(0, document2.offsetAt(range2.start)) + predictedText + currentFileText.slice(document2.offsetAt(range2.end));
153020
- this.logDiff(options.document.uri, currentFileText, predictedText, predictedFileText);
153021
- const filename = displayPath(document2.uri);
153022
- const patch = structuredPatch(
153023
- `a/${filename}`,
153024
- `b/${filename}`,
153025
- currentFileText,
153026
- predictedFileText
153027
- );
153028
- let isChanged = false;
153029
- const removedLines = [];
153030
- const addedLines = [];
153031
- for (const hunk of patch.hunks) {
153032
- let oldLineNumber = hunk.oldStart;
153033
- let newLineNumber = hunk.newStart;
153034
- for (const line of hunk.lines) {
153035
- if (line.length === 0) {
153036
- continue;
153037
- }
153038
- if (line[0] === "-") {
153039
- isChanged = true;
153040
- removedLines.push({ line: oldLineNumber - 1, text: line.slice(1) });
153041
- oldLineNumber++;
153042
- } else if (line[0] === "+") {
153043
- isChanged = true;
153044
- addedLines.push({ line: newLineNumber - 1, text: line.slice(1) });
153045
- newLineNumber++;
153046
- } else if (line[0] === " ") {
153047
- oldLineNumber++;
153048
- newLineNumber++;
153609
+ }
153610
+ /**
153611
+ * Renders decorations using an inline diff strategy to show changes between two versions of text.
153612
+ * It splits the decorations into three parts:
153613
+ * 1. Modified lines: Either show inline ghost text or a combination of ("red" decorations + "green" decorations)
153614
+ * 2. Removed lines: Show inline decoration with "red" marker indicating deletions
153615
+ * 3. Added lines: Show inline decoration with "green" marker indicating additions
153616
+ */
153617
+ setDecorations(decorationInfo) {
153618
+ const { modifiedLines, removedLines, addedLines } = decorationInfo;
153619
+ const removedLinesRanges = removedLines.map((line) => this.createFullLineRange(line.lineNumber));
153620
+ this.editor.setDecorations(this.removedTextDecorationType, removedLinesRanges);
153621
+ if (addedLines.length > 0 || !isOnlyAddingTextForModifiedLines(modifiedLines)) {
153622
+ this.renderDiffDecorations(decorationInfo);
153623
+ } else {
153624
+ this.renderInlineGhostTextDecorations(modifiedLines);
153625
+ }
153626
+ }
153627
+ renderDiffDecorations(decorationInfo) {
153628
+ const { modifiedLines, addedLines, unchangedLines } = decorationInfo;
153629
+ const removedRanges = [];
153630
+ const addedLinesInfo = [];
153631
+ let firstModifiedLineMatch = null;
153632
+ for (const modifiedLine of modifiedLines) {
153633
+ const changes = modifiedLine.changes;
153634
+ const addedRanges = [];
153635
+ for (const change of changes) {
153636
+ if (change.type === "delete") {
153637
+ removedRanges.push(change.range);
153638
+ } else if (change.type === "insert") {
153639
+ addedRanges.push([change.range.start.character, change.range.end.character]);
153640
+ }
153641
+ }
153642
+ if (addedRanges.length > 0) {
153643
+ if (!firstModifiedLineMatch) {
153644
+ firstModifiedLineMatch = {
153645
+ beforeLine: modifiedLine.lineNumber,
153646
+ afterLine: modifiedLine.lineNumber
153647
+ };
153049
153648
  }
153649
+ addedLinesInfo.push({
153650
+ ranges: addedRanges,
153651
+ afterLine: modifiedLine.lineNumber,
153652
+ lineText: modifiedLine.newText
153653
+ });
153050
153654
  }
153051
153655
  }
153052
- if (!isChanged) {
153053
- await this.showNoChangeMessageAtCursor();
153656
+ this.editor.setDecorations(this.modifiedTextDecorationType, removedRanges);
153657
+ for (const addedLine of addedLines) {
153658
+ addedLinesInfo.push({
153659
+ ranges: [],
153660
+ afterLine: addedLine.lineNumber,
153661
+ lineText: addedLine.text
153662
+ });
153663
+ }
153664
+ const lineNumbers = addedLinesInfo.map((d2) => d2.afterLine);
153665
+ const min = Math.min(...lineNumbers);
153666
+ const max = Math.max(...lineNumbers);
153667
+ for (const unchangedLine of unchangedLines) {
153668
+ const lineNumber = unchangedLine.lineNumber;
153669
+ if (lineNumber < min || lineNumber > max) {
153670
+ continue;
153671
+ }
153672
+ addedLinesInfo.push({
153673
+ ranges: [],
153674
+ afterLine: lineNumber,
153675
+ lineText: unchangedLine.text
153676
+ });
153677
+ }
153678
+ addedLinesInfo.sort((a, b) => a.afterLine - b.afterLine);
153679
+ if (addedLinesInfo.length === 0) {
153054
153680
  return;
153055
153681
  }
153056
- editor.setDecorations(
153057
- strikeThroughDecorationType,
153058
- removedLines.map((line) => ({
153059
- range: new Range(line.line, 0, line.line, document2.lineAt(line.line).text.length)
153060
- }))
153061
- );
153062
- editor.setDecorations(
153063
- suggesterType,
153064
- addedLines.map((line) => ({
153065
- range: new Range(line.line, 0, line.line, document2.lineAt(line.line).text.length),
153682
+ let startLine = this.editor.selection.active.line;
153683
+ if (firstModifiedLineMatch) {
153684
+ startLine = firstModifiedLineMatch.beforeLine - (firstModifiedLineMatch.afterLine - addedLinesInfo[0].afterLine);
153685
+ }
153686
+ const oldLines = addedLinesInfo.map((info2) => this.editor.document.lineAt(info2.afterLine));
153687
+ const replacerCol = Math.max(...oldLines.map((line) => line.range.end.character));
153688
+ this.renderAddedLinesDecorations(addedLinesInfo, startLine, replacerCol);
153689
+ }
153690
+ renderAddedLinesDecorations(addedLinesInfo, startLine, replacerCol) {
153691
+ blockify(addedLinesInfo);
153692
+ const replacerDecorations = [];
153693
+ for (let i = 0; i < addedLinesInfo.length; i++) {
153694
+ const j = i + startLine;
153695
+ const line = this.editor.document.lineAt(j);
153696
+ const decoration = addedLinesInfo[i];
153697
+ if (replacerCol >= line.range.end.character) {
153698
+ replacerDecorations.push({
153699
+ range: new Range(j, line.range.end.character, j, line.range.end.character),
153700
+ renderOptions: {
153701
+ // Show the suggested code but keep it positioned absolute to ensure
153702
+ // the cursor does not jump there.
153703
+ before: {
153704
+ contentText: " ".repeat(3) + _replaceLeadingTrailingChars(decoration.lineText, " ", " "),
153705
+ margin: `0 0 0 ${replacerCol - line.range.end.character}ch`,
153706
+ textDecoration: "none; position: absolute;"
153707
+ },
153708
+ // Create an empty HTML element with the width required to show the suggested code.
153709
+ // Required to make the viewport scrollable to view the suggestion if it's outside.
153710
+ after: {
153711
+ contentText: " ".repeat(3) + _replaceLeadingTrailingChars(
153712
+ decoration.lineText.replace(/\S/g, " "),
153713
+ " ",
153714
+ " "
153715
+ ),
153716
+ margin: `0 0 0 ${replacerCol - line.range.end.character}ch`
153717
+ }
153718
+ }
153719
+ });
153720
+ } else {
153721
+ replacerDecorations.push({
153722
+ range: new Range(j, replacerCol, j, replacerCol),
153723
+ renderOptions: {
153724
+ before: {
153725
+ contentText: " " + _replaceLeadingTrailingChars(decoration.lineText, " ", " "),
153726
+ textDecoration: "none; position: absolute;"
153727
+ },
153728
+ after: {
153729
+ contentText: " ".repeat(3) + _replaceLeadingTrailingChars(
153730
+ decoration.lineText.replace(/\S/g, " "),
153731
+ " ",
153732
+ " "
153733
+ )
153734
+ }
153735
+ }
153736
+ });
153737
+ }
153738
+ }
153739
+ const startLineLength = this.editor.document.lineAt(startLine).range.end.character;
153740
+ this.editor.setDecorations(this.insertMarkerDecorationType, [
153741
+ {
153742
+ range: new Range(startLine, 0, startLine, startLineLength)
153743
+ }
153744
+ ]);
153745
+ this.editor.setDecorations(this.addedLinesDecorationType, replacerDecorations);
153746
+ }
153747
+ renderInlineGhostTextDecorations(decorationLines) {
153748
+ const inlineModifiedRanges = decorationLines.flatMap((line) => line.changes).filter((change) => change.type === "insert").map((change) => {
153749
+ return {
153750
+ range: change.range,
153066
153751
  renderOptions: {
153067
- after: {
153068
- contentText: line.text
153752
+ before: {
153753
+ contentText: change.text
153069
153754
  }
153070
153755
  }
153071
- }))
153756
+ };
153757
+ });
153758
+ this.editor.setDecorations(this.suggesterType, inlineModifiedRanges);
153759
+ }
153760
+ createFullLineRange(lineNumber) {
153761
+ const lineTextLength = this.editor.document.lineAt(lineNumber).text.length;
153762
+ return new Range(lineNumber, 0, lineNumber, lineTextLength);
153763
+ }
153764
+ dispose() {
153765
+ this.clearDecorations();
153766
+ for (const decorationType of this.decorationTypes) {
153767
+ decorationType.dispose();
153768
+ }
153769
+ }
153770
+ }
153771
+ function _replaceLeadingTrailingChars(str, oldS, newS) {
153772
+ let prefixLen = str.length;
153773
+ for (let i = 0; i < str.length; i++) {
153774
+ if (str[i] !== oldS) {
153775
+ prefixLen = i;
153776
+ break;
153777
+ }
153778
+ }
153779
+ str = newS.repeat(prefixLen) + str.substring(prefixLen);
153780
+ let suffixLen = str.length;
153781
+ for (let i = 0; i < str.length; i++) {
153782
+ const j = str.length - 1 - i;
153783
+ if (str[j] !== oldS) {
153784
+ suffixLen = i;
153785
+ break;
153786
+ }
153787
+ }
153788
+ str = str.substring(0, str.length - suffixLen) + newS.repeat(suffixLen);
153789
+ return str;
153790
+ }
153791
+ function blockify(addedLines) {
153792
+ removeLeadingWhitespaceBlock(addedLines);
153793
+ padTrailingWhitespaceBlock(addedLines);
153794
+ }
153795
+ function padTrailingWhitespaceBlock(addedLines) {
153796
+ let maxLineWidth = 0;
153797
+ for (const addedLine of addedLines) {
153798
+ maxLineWidth = Math.max(maxLineWidth, addedLine.lineText.length);
153799
+ }
153800
+ for (const addedLine of addedLines) {
153801
+ addedLine.lineText = addedLine.lineText.padEnd(maxLineWidth, " ");
153802
+ }
153803
+ }
153804
+ function removeLeadingWhitespaceBlock(addedLines) {
153805
+ let leastCommonWhitespacePrefix = void 0;
153806
+ for (const addedLine of addedLines) {
153807
+ const leadingWhitespaceMatch = addedLine.lineText.match(/^\s*/);
153808
+ if (leadingWhitespaceMatch === null) {
153809
+ leastCommonWhitespacePrefix = "";
153810
+ break;
153811
+ }
153812
+ const leadingWhitespace = leadingWhitespaceMatch[0];
153813
+ if (leastCommonWhitespacePrefix === void 0) {
153814
+ leastCommonWhitespacePrefix = leadingWhitespace;
153815
+ continue;
153816
+ }
153817
+ leastCommonWhitespacePrefix = getCommonPrefix(leastCommonWhitespacePrefix, leadingWhitespace);
153818
+ }
153819
+ if (!leastCommonWhitespacePrefix) {
153820
+ return;
153821
+ }
153822
+ for (const addedLine of addedLines) {
153823
+ addedLine.lineText = addedLine.lineText.replace(leastCommonWhitespacePrefix, "");
153824
+ }
153825
+ }
153826
+ function getCommonPrefix(s1, s2) {
153827
+ const minLength = Math.min(s1.length, s2.length);
153828
+ let commonPrefix = "";
153829
+ for (let i = 0; i < minLength; i++) {
153830
+ if (s1[i] === s2[i]) {
153831
+ commonPrefix += s1[i];
153832
+ } else {
153833
+ break;
153834
+ }
153835
+ }
153836
+ return commonPrefix;
153837
+ }
153838
+ function isOnlyAddingTextForModifiedLines(modifiedLines) {
153839
+ for (const modifiedLine of modifiedLines) {
153840
+ if (modifiedLine.changes.some((change) => change.type === "delete")) {
153841
+ return false;
153842
+ }
153843
+ }
153844
+ return true;
153845
+ }
153846
+ class AutoEditsRendererManager {
153847
+ constructor(createDecorator) {
153848
+ // Keeps track of the current active edit (there can only be one active edit at a time)
153849
+ __publicField2(this, "activeEdit", null);
153850
+ __publicField2(this, "disposables", []);
153851
+ this.createDecorator = createDecorator;
153852
+ this.disposables.push(
153853
+ commands$1.registerCommand("cody.supersuggest.accept", () => this.acceptEdit()),
153854
+ commands$1.registerCommand("cody.supersuggest.dismiss", () => this.dismissEdit()),
153855
+ workspace.onDidChangeTextDocument((event2) => this.onDidChangeTextDocument(event2)),
153856
+ window$1.onDidChangeTextEditorSelection(
153857
+ (event2) => this.onDidChangeTextEditorSelection(event2)
153858
+ ),
153859
+ window$1.onDidChangeActiveTextEditor(
153860
+ (editor) => this.onDidChangeActiveTextEditor(editor)
153861
+ ),
153862
+ workspace.onDidCloseTextDocument((document2) => this.onDidCloseTextDocument(document2))
153072
153863
  );
153073
- await commands$1.executeCommand("setContext", "cody.supersuggest.active", true);
153074
153864
  }
153075
- async acceptProposedChange() {
153076
- if (this.activeProposedChange === null) {
153865
+ hasActiveEdit() {
153866
+ return this.activeEdit !== null;
153867
+ }
153868
+ async showEdit({
153869
+ document: document2,
153870
+ range: range2,
153871
+ prediction,
153872
+ currentFileText,
153873
+ predictedFileText
153874
+ }) {
153875
+ await this.dismissEdit();
153876
+ const editor = window$1.activeTextEditor;
153877
+ if (!editor || document2 !== editor.document) {
153077
153878
  return;
153078
153879
  }
153880
+ this.activeEdit = {
153881
+ uri: document2.uri.toString(),
153882
+ range: range2,
153883
+ prediction,
153884
+ decorator: this.createDecorator(editor)
153885
+ };
153886
+ const decorationInformation = getDecorationInfo(currentFileText, predictedFileText);
153887
+ this.activeEdit.decorator.setDecorations(decorationInformation);
153888
+ await commands$1.executeCommand("setContext", "cody.supersuggest.active", true);
153889
+ }
153890
+ async dismissEdit() {
153891
+ var _a3;
153892
+ const decorator = (_a3 = this.activeEdit) == null ? void 0 : _a3.decorator;
153893
+ if (decorator) {
153894
+ decorator.dispose();
153895
+ }
153896
+ this.activeEdit = null;
153897
+ await commands$1.executeCommand("setContext", "cody.supersuggest.active", false);
153898
+ }
153899
+ async acceptEdit() {
153079
153900
  const editor = window$1.activeTextEditor;
153080
- if (!editor) {
153081
- await this.dismissProposedChange();
153901
+ if (!this.activeEdit || !editor || editor.document.uri.toString() !== this.activeEdit.uri) {
153902
+ await this.dismissEdit();
153082
153903
  return;
153083
153904
  }
153084
- const currentActiveChange = this.activeProposedChange;
153085
153905
  await editor.edit((editBuilder) => {
153086
- editBuilder.replace(currentActiveChange.range, currentActiveChange.newText);
153906
+ editBuilder.replace(this.activeEdit.range, this.activeEdit.prediction);
153087
153907
  });
153088
- await this.dismissProposedChange();
153908
+ await this.dismissEdit();
153089
153909
  }
153090
- async dismissProposedChange() {
153091
- this.activeProposedChange = null;
153092
- await commands$1.executeCommand("setContext", "cody.supersuggest.active", false);
153093
- const editor = window$1.activeTextEditor;
153094
- if (!editor) {
153910
+ async onDidChangeTextDocument(event2) {
153911
+ var _a3;
153912
+ if (event2.document.uri.toString() !== ((_a3 = this.activeEdit) == null ? void 0 : _a3.uri)) {
153095
153913
  return;
153096
153914
  }
153097
- editor.setDecorations(strikeThroughDecorationType, []);
153098
- editor.setDecorations(suggesterType, []);
153915
+ await this.dismissEdit();
153099
153916
  }
153100
- async showNoChangeMessageAtCursor() {
153101
- this.activeProposedChange = null;
153102
- const editor = window$1.activeTextEditor;
153103
- if (!editor) {
153104
- return;
153917
+ async onDidChangeActiveTextEditor(editor) {
153918
+ var _a3;
153919
+ if (!editor || editor.document.uri.toString() !== ((_a3 = this.activeEdit) == null ? void 0 : _a3.uri)) {
153920
+ await this.dismissEdit();
153105
153921
  }
153106
- const position = editor.selection.active;
153107
- const lineLength = editor.document.lineAt(position.line).text.length;
153108
- const range2 = new Range(position.line, 0, position.line, lineLength);
153109
- editor.setDecorations(suggesterType, [
153110
- {
153111
- range: range2,
153112
- renderOptions: {
153113
- after: {
153114
- contentText: "Cody: no suggested changes",
153115
- color: GHOST_TEXT_COLOR$1,
153116
- fontStyle: "italic"
153117
- }
153118
- }
153119
- }
153120
- ]);
153121
- await commands$1.executeCommand("setContext", "cody.supersuggest.active", true);
153122
153922
  }
153123
- logDiff(uri2, codeToRewrite, predictedText, prediction) {
153124
- const predictedCodeXML = `<code>
153125
- ${predictedText}
153126
- </code>`;
153127
- logDebug$1("AutoEdits", "(Predicted Code@ Cursor Position)\n", predictedCodeXML);
153128
- const diff2 = createGitDiff(displayPath(uri2), codeToRewrite, prediction);
153129
- logDebug$1("AutoEdits", "(Diff@ Cursor Position)\n", diff2);
153923
+ async onDidCloseTextDocument(document2) {
153924
+ var _a3;
153925
+ if (document2.uri.toString() === ((_a3 = this.activeEdit) == null ? void 0 : _a3.uri)) {
153926
+ await this.dismissEdit();
153927
+ }
153928
+ }
153929
+ async onDidChangeTextEditorSelection(event2) {
153930
+ var _a3;
153931
+ if (event2.textEditor.document.uri.toString() !== ((_a3 = this.activeEdit) == null ? void 0 : _a3.uri)) {
153932
+ return;
153933
+ }
153934
+ const currentSelectionRange = event2.selections.at(-1);
153935
+ if (!(currentSelectionRange == null ? void 0 : currentSelectionRange.intersection(this.activeEdit.range))) {
153936
+ await this.dismissEdit();
153937
+ }
153130
153938
  }
153131
153939
  dispose() {
153940
+ this.dismissEdit();
153132
153941
  for (const disposable of this.disposables) {
153133
153942
  disposable.dispose();
153134
153943
  }
153135
153944
  }
153136
153945
  }
153137
153946
  const AUTOEDITS_CONTEXT_STRATEGY = "auto-edits";
153947
+ const INLINE_COMPLETETION_DEFAULT_DEBOUNCE_INTERVAL_MS = 150;
153948
+ const ONSELECTION_CHANGE_DEFAULT_DEBOUNCE_INTERVAL_MS = 150;
153949
+ const RESET_SUGGESTION_ON_CURSOR_CHANGE_AFTER_INTERVAL_MS = 60 * 1e3;
153138
153950
  class AutoeditsProvider {
153139
153951
  constructor() {
153140
153952
  __publicField2(this, "disposables", []);
153141
- __publicField2(this, "contextMixer", new ContextMixer({
153142
- strategyFactory: new DefaultContextStrategyFactory(Observable.of(AUTOEDITS_CONTEXT_STRATEGY)),
153953
+ __publicField2(this, "contextMixer");
153954
+ __publicField2(this, "rendererManager");
153955
+ __publicField2(this, "config");
153956
+ __publicField2(this, "onSelectionChangeDebounced");
153957
+ // Keeps track of the last time the text was changed in the editor.
153958
+ __publicField2(this, "lastTextChangeTimeStamp");
153959
+ this.contextMixer = new ContextMixer({
153960
+ strategyFactory: new DefaultContextStrategyFactory(
153961
+ Observable.of(AUTOEDITS_CONTEXT_STRATEGY)
153962
+ ),
153963
+ contextRankingStrategy: ContextRankingStrategy.TimeBased,
153143
153964
  dataCollectionEnabled: false
153144
- }));
153145
- __publicField2(this, "autoEditsTokenLimit");
153146
- __publicField2(this, "provider");
153147
- __publicField2(this, "model");
153148
- __publicField2(this, "apiKey");
153149
- __publicField2(this, "renderer", new AutoEditsRenderer());
153150
- const config2 = getConfiguration().experimentalAutoedits;
153151
- if (config2 === void 0) {
153152
- logDebug$1("AutoEdits", "No Configuration found in the settings");
153153
- return;
153154
- }
153155
- this.initizlizePromptProvider(config2.provider);
153156
- this.autoEditsTokenLimit = config2.tokenLimit;
153157
- this.model = config2.model;
153158
- this.apiKey = config2.apiKey;
153965
+ });
153966
+ this.rendererManager = new AutoEditsRendererManager(
153967
+ (editor) => new DefaultDecorator(editor)
153968
+ );
153969
+ this.onSelectionChangeDebounced = lodashExports.debounce(
153970
+ (event2) => this.autoeditOnSelectionChange(event2),
153971
+ ONSELECTION_CHANGE_DEFAULT_DEBOUNCE_INTERVAL_MS
153972
+ );
153973
+ this.config = this.initializeConfig();
153159
153974
  this.disposables.push(
153160
153975
  this.contextMixer,
153161
- this.renderer,
153162
- commands$1.registerCommand("cody.experimental.suggest", () => this.getAutoedit())
153976
+ this.rendererManager,
153977
+ window$1.onDidChangeTextEditorSelection(this.onSelectionChangeDebounced),
153978
+ workspace.onDidChangeTextDocument((event2) => {
153979
+ this.onDidChangeTextDocument(event2);
153980
+ })
153163
153981
  );
153164
153982
  }
153165
- initizlizePromptProvider(provider) {
153166
- if (provider === "openai") {
153167
- this.provider = new OpenAIPromptProvider();
153168
- } else if (provider === "deepseek") {
153169
- this.provider = new DeepSeekPromptProvider();
153170
- } else {
153171
- logDebug$1("AutoEdits", `provider ${provider} not supported`);
153983
+ initializeConfig() {
153984
+ const userConfig = getConfiguration().experimentalAutoeditsConfigOverride;
153985
+ const baseConfig = userConfig ?? this.getDefaultConfig();
153986
+ return {
153987
+ experimentalAutoeditsConfigOverride: userConfig,
153988
+ providerName: baseConfig.provider,
153989
+ provider: this.createPromptProvider(baseConfig.provider),
153990
+ model: baseConfig.model,
153991
+ url: baseConfig.url,
153992
+ tokenLimit: baseConfig.tokenLimit
153993
+ };
153994
+ }
153995
+ createPromptProvider(providerName) {
153996
+ switch (providerName) {
153997
+ case "openai":
153998
+ return new OpenAIAdapter();
153999
+ case "fireworks":
154000
+ return new FireworksAdapter();
154001
+ case "cody-gateway-fastpath-chat":
154002
+ return new CodyGatewayAdapter();
154003
+ default:
154004
+ autoeditsLogger.logDebug("Config", `Provider ${providerName} not supported`);
154005
+ throw new Error(`Provider ${providerName} not supported`);
154006
+ }
154007
+ }
154008
+ async autoeditOnSelectionChange(event2) {
154009
+ const lastSelection = event2.selections.at(-1);
154010
+ const { document: document2 } = event2.textEditor;
154011
+ if (!(lastSelection == null ? void 0 : lastSelection.isEmpty) || document2.uri.scheme !== "file") {
154012
+ return;
154013
+ }
154014
+ if (this.rendererManager.hasActiveEdit()) {
154015
+ return;
153172
154016
  }
154017
+ if (this.lastTextChangeTimeStamp && Date.now() - this.lastTextChangeTimeStamp < RESET_SUGGESTION_ON_CURSOR_CHANGE_AFTER_INTERVAL_MS) {
154018
+ await commands$1.executeCommand("editor.action.inlineSuggest.trigger");
154019
+ }
154020
+ }
154021
+ async provideInlineCompletionItems(document2, position, context2, token) {
154022
+ const controller2 = new AbortController();
154023
+ token == null ? void 0 : token.onCancellationRequested(() => controller2.abort());
154024
+ await new Promise(
154025
+ (resolve2) => setTimeout(resolve2, INLINE_COMPLETETION_DEFAULT_DEBOUNCE_INTERVAL_MS)
154026
+ );
154027
+ return this.showAutoEdit(document2, position, controller2.signal);
153173
154028
  }
153174
- getAutoedit() {
153175
- this.predictAutoeditAtDocAndPosition({
153176
- document: window$1.activeTextEditor.document,
153177
- position: window$1.activeTextEditor.selection.active
154029
+ async showAutoEdit(document2, position, abortSignal) {
154030
+ if (abortSignal.aborted) {
154031
+ return null;
154032
+ }
154033
+ const docContext = getCurrentDocContext({
154034
+ document: document2,
154035
+ position,
154036
+ maxPrefixLength: tokensToChars(this.config.tokenLimit.prefixTokens),
154037
+ maxSuffixLength: tokensToChars(this.config.tokenLimit.suffixTokens)
153178
154038
  });
154039
+ const autoeditResponse = await this.inferEdit({
154040
+ document: document2,
154041
+ position,
154042
+ docContext,
154043
+ abortSignal
154044
+ });
154045
+ if (abortSignal.aborted || !autoeditResponse) {
154046
+ return null;
154047
+ }
154048
+ const { prediction, codeToReplaceData } = autoeditResponse;
154049
+ const inlineCompletionItems = this.tryMakeInlineCompletionResponse(
154050
+ prediction,
154051
+ codeToReplaceData,
154052
+ document2,
154053
+ position,
154054
+ docContext
154055
+ );
154056
+ if (inlineCompletionItems) {
154057
+ return inlineCompletionItems;
154058
+ }
154059
+ await this.showEditAsDecorations(document2, codeToReplaceData, prediction);
154060
+ return null;
153179
154061
  }
153180
- async predictAutoeditAtDocAndPosition(options) {
153181
- if (!this.provider || !this.autoEditsTokenLimit || !this.model || !this.apiKey) {
153182
- logDebug$1("AutoEdits", "No Provider or Token Limit found in the settings");
153183
- return;
154062
+ tryMakeInlineCompletionResponse(originalPrediction, codeToReplace, document2, position, docContext) {
154063
+ const prediction = adjustPredictionIfInlineCompletionPossible(
154064
+ originalPrediction,
154065
+ codeToReplace.codeToRewritePrefix,
154066
+ codeToReplace.codeToRewriteSuffix
154067
+ );
154068
+ const codeToRewriteAfterCurrentLine = codeToReplace.codeToRewriteSuffix.slice(
154069
+ docContext.currentLineSuffix.length + 1
154070
+ // Additional char for newline
154071
+ );
154072
+ const isPrefixMatch = prediction.startsWith(codeToReplace.codeToRewritePrefix);
154073
+ const isSuffixMatch = (
154074
+ // The current line suffix should not require any char removals to render the completion.
154075
+ completionMatchesSuffix({ insertText: prediction }, docContext.currentLineSuffix) && // The new lines suggested after the current line must be equal to the prediction.
154076
+ prediction.endsWith(codeToRewriteAfterCurrentLine)
154077
+ );
154078
+ if (isPrefixMatch && isSuffixMatch) {
154079
+ const autocompleteInlineResponse = extractInlineCompletionFromRewrittenCode(
154080
+ prediction,
154081
+ codeToReplace.codeToRewritePrefix,
154082
+ codeToReplace.codeToRewriteSuffix
154083
+ );
154084
+ const autocompleteResponse = docContext.currentLinePrefix + autocompleteInlineResponse;
154085
+ const inlineCompletionItem = new InlineCompletionItem(
154086
+ autocompleteResponse,
154087
+ new Range(
154088
+ document2.lineAt(position).range.start,
154089
+ document2.lineAt(position).range.end
154090
+ )
154091
+ );
154092
+ autoeditsLogger.logDebug("Autocomplete Inline Response: ", autocompleteResponse);
154093
+ return [inlineCompletionItem];
153184
154094
  }
154095
+ return null;
154096
+ }
154097
+ async inferEdit(options) {
154098
+ var _a3;
153185
154099
  const start2 = Date.now();
153186
- const docContext = this.getDocContext(options.document, options.position);
153187
154100
  const { context: context2 } = await this.contextMixer.getContext({
153188
154101
  document: options.document,
153189
154102
  position: options.position,
153190
- docContext,
153191
- maxChars: 1e5
154103
+ docContext: options.docContext,
154104
+ maxChars: 32e3
153192
154105
  });
153193
- const { codeToReplace, promptResponse: prompt } = this.provider.getPrompt(
153194
- docContext,
154106
+ const { codeToReplace, promptResponse: prompt } = this.config.provider.getPrompt(
154107
+ options.docContext,
153195
154108
  options.document,
154109
+ options.position,
153196
154110
  context2,
153197
- this.autoEditsTokenLimit
154111
+ this.config.tokenLimit
153198
154112
  );
153199
- const response = await this.provider.getModelResponse(this.model, this.apiKey, prompt);
153200
- const timeToResponse = Date.now() - start2;
153201
- logDebug$1("AutoEdits: (Time LLM Query):", timeToResponse.toString());
153202
- await this.renderer.render(options, codeToReplace, response);
154113
+ const apiKey = await this.getApiKey();
154114
+ const response = await this.config.provider.getModelResponse({
154115
+ url: this.config.url,
154116
+ model: this.config.model,
154117
+ apiKey,
154118
+ prompt,
154119
+ codeToRewrite: codeToReplace.codeToRewrite,
154120
+ userId: (await currentResolvedConfig()).clientState.anonymousUserID
154121
+ });
154122
+ const postProcessedResponse = this.config.provider.postProcessResponse(codeToReplace, response);
154123
+ if (((_a3 = options.abortSignal) == null ? void 0 : _a3.aborted) || !postProcessedResponse) {
154124
+ return null;
154125
+ }
154126
+ autoeditsLogger.logDebug(
154127
+ "Autoedits",
154128
+ "========================== Response:\n",
154129
+ postProcessedResponse,
154130
+ "\n",
154131
+ "========================== Time Taken For LLM (Msec): ",
154132
+ (Date.now() - start2).toString(),
154133
+ "\n"
154134
+ );
154135
+ return {
154136
+ codeToReplaceData: codeToReplace,
154137
+ prediction: postProcessedResponse
154138
+ };
153203
154139
  }
153204
- getDocContext(document2, position) {
153205
- var _a3, _b2;
153206
- return getCurrentDocContext({
154140
+ async showEditAsDecorations(document2, codeToReplaceData, prediction) {
154141
+ const currentFileText = document2.getText();
154142
+ const predictedFileText = currentFileText.slice(0, document2.offsetAt(codeToReplaceData.range.start)) + prediction + currentFileText.slice(document2.offsetAt(codeToReplaceData.range.end));
154143
+ if (isPredictedTextAlreadyInSuffix({
154144
+ codeToRewrite: codeToReplaceData.codeToRewrite,
154145
+ prediction,
154146
+ suffix: codeToReplaceData.suffixInArea + codeToReplaceData.suffixAfterArea
154147
+ })) {
154148
+ autoeditsLogger.logDebug(
154149
+ "Autoedits",
154150
+ "Skipping autoedit - predicted text already exists in suffix"
154151
+ );
154152
+ return;
154153
+ }
154154
+ await this.rendererManager.showEdit({
153207
154155
  document: document2,
153208
- position,
153209
- maxPrefixLength: tokensToChars(((_a3 = this.autoEditsTokenLimit) == null ? void 0 : _a3.prefixTokens) ?? 0),
153210
- maxSuffixLength: tokensToChars(((_b2 = this.autoEditsTokenLimit) == null ? void 0 : _b2.suffixTokens) ?? 0)
154156
+ range: codeToReplaceData.range,
154157
+ prediction,
154158
+ currentFileText,
154159
+ predictedFileText
153211
154160
  });
153212
154161
  }
154162
+ onDidChangeTextDocument(event2) {
154163
+ if (event2.document.uri.scheme !== "file") {
154164
+ return;
154165
+ }
154166
+ this.lastTextChangeTimeStamp = Date.now();
154167
+ }
154168
+ getDefaultConfig() {
154169
+ const defaultTokenLimit = {
154170
+ prefixTokens: 2500,
154171
+ suffixTokens: 2500,
154172
+ maxPrefixLinesInArea: 11,
154173
+ maxSuffixLinesInArea: 4,
154174
+ codeToRewritePrefixLines: 1,
154175
+ codeToRewriteSuffixLines: 2,
154176
+ contextSpecificTokenLimit: {
154177
+ [RetrieverIdentifier.RecentEditsRetriever]: 1500,
154178
+ [RetrieverIdentifier.JaccardSimilarityRetriever]: 0,
154179
+ [RetrieverIdentifier.RecentCopyRetriever]: 500,
154180
+ [RetrieverIdentifier.DiagnosticsRetriever]: 500,
154181
+ [RetrieverIdentifier.RecentViewPortRetriever]: 2500
154182
+ }
154183
+ };
154184
+ return {
154185
+ provider: "cody-gateway-fastpath-chat",
154186
+ model: "cody-model-auto-edits-fireworks-default",
154187
+ url: "https://cody-gateway.sourcegraph.com/v1/completions/fireworks",
154188
+ tokenLimit: defaultTokenLimit
154189
+ };
154190
+ }
154191
+ async getApiKey() {
154192
+ var _a3;
154193
+ if (this.config.providerName === "cody-gateway-fastpath-chat") {
154194
+ const config2 = await currentResolvedConfig();
154195
+ const fastPathAccessToken = dotcomTokenToGatewayToken(config2.auth.accessToken);
154196
+ if (!fastPathAccessToken) {
154197
+ autoeditsLogger.logError("Autoedits", "FastPath access token is not available");
154198
+ throw new Error("FastPath access token is not available");
154199
+ }
154200
+ return fastPathAccessToken;
154201
+ }
154202
+ if ((_a3 = this.config.experimentalAutoeditsConfigOverride) == null ? void 0 : _a3.apiKey) {
154203
+ return this.config.experimentalAutoeditsConfigOverride.apiKey;
154204
+ }
154205
+ autoeditsLogger.logError("Autoedits", "No api key provided in the config override");
154206
+ throw new Error("No api key provided in the config override");
154207
+ }
153213
154208
  dispose() {
154209
+ this.onSelectionChangeDebounced.cancel();
153214
154210
  for (const disposable of this.disposables) {
153215
154211
  disposable.dispose();
153216
154212
  }
153217
154213
  }
153218
154214
  }
154215
+ function registerTestRenderCommand() {
154216
+ return commands$1.registerCommand("cody.supersuggest.testExample", () => {
154217
+ const editor = window$1.activeTextEditor;
154218
+ const document2 = editor == null ? void 0 : editor.document;
154219
+ if (!editor || !document2) {
154220
+ return;
154221
+ }
154222
+ const selection = editor.selection;
154223
+ const offset2 = editor.document.offsetAt(selection.start);
154224
+ const text = editor.document.getText();
154225
+ const ret2 = (() => {
154226
+ const i = text.substring(0, offset2).lastIndexOf("\n<<<<\n", offset2);
154227
+ if (i === -1) {
154228
+ return void 0;
154229
+ }
154230
+ const textToReplaceStart = i + "\n<<<<\n".length;
154231
+ const j = text.indexOf("\n====\n", textToReplaceStart);
154232
+ if (j === -1) {
154233
+ return void 0;
154234
+ }
154235
+ const textToReplaceEnd = j;
154236
+ const replacerTextStart = j + "\n====\n".length;
154237
+ const k = text.indexOf("\n>>>>\n", textToReplaceEnd);
154238
+ if (k === -1) {
154239
+ return void 0;
154240
+ }
154241
+ const replacerTextEnd = k;
154242
+ return [
154243
+ text.slice(textToReplaceStart, textToReplaceEnd),
154244
+ text.slice(replacerTextStart, replacerTextEnd),
154245
+ replacerTextEnd + "\n~~~~\n".length
154246
+ ];
154247
+ })();
154248
+ if (!ret2) {
154249
+ return;
154250
+ }
154251
+ const [textToReplace, replacerText, replacerBlockEnd] = ret2;
154252
+ const replaceStartOffset = text.indexOf(textToReplace, replacerBlockEnd);
154253
+ if (replaceStartOffset === -1) {
154254
+ console.error("Could not find replacement text");
154255
+ return;
154256
+ }
154257
+ const replaceEndOffset = replaceStartOffset + textToReplace.length;
154258
+ const replaceStartLine = editor.document.positionAt(replaceStartOffset).line;
154259
+ const replaceEndLine = editor.document.positionAt(replaceEndOffset).line;
154260
+ const decorator = new DefaultDecorator(editor);
154261
+ const currentFileText = document2.getText();
154262
+ const newLineChar = getNewLineChar(currentFileText);
154263
+ const lines2 = currentFileText.split(newLineChar);
154264
+ const predictedFileText = [
154265
+ ...lines2.slice(0, replaceStartLine),
154266
+ replacerText,
154267
+ ...lines2.slice(replaceEndLine + 1)
154268
+ ].join(newLineChar);
154269
+ const decorationInformation = getDecorationInfo(currentFileText, predictedFileText);
154270
+ decorator.setDecorations(decorationInformation);
154271
+ const listener = window$1.onDidChangeTextEditorSelection((e) => {
154272
+ decorator.dispose();
154273
+ listener.dispose();
154274
+ });
154275
+ });
154276
+ }
153219
154277
  async function getContextFileFromUri(file, range2) {
153220
154278
  return wrapInActiveSpan("commands.context.filePath", async (span2) => {
153221
154279
  try {
@@ -155912,19 +156970,21 @@ async function getCurrentRepositoryInfo(initialContext) {
155912
156970
  }
155913
156971
  const PROMPT_CURRENT_FILE_PLACEHOLDER = "cody://current-file";
155914
156972
  const PROMPT_CURRENT_SELECTION_PLACEHOLDER = "cody://selection";
156973
+ const PROMPT_CURRENT_SELECTION_OLD_PLACEHOLDER = "cody://current-selection";
155915
156974
  const PROMPT_CURRENT_DIRECTORY_PLACEHOLDER = "cody://current-dir";
155916
156975
  const PROMPT_EDITOR_OPEN_TABS_PLACEHOLDER = "cody://tabs";
155917
156976
  const PROMPT_CURRENT_REPOSITORY_PLACEHOLDER = "cody://repository";
155918
156977
  const PROMPT_HYDRATION_MODIFIERS = {
155919
156978
  [PROMPT_CURRENT_FILE_PLACEHOLDER]: hydrateWithCurrentFile,
155920
156979
  [PROMPT_CURRENT_SELECTION_PLACEHOLDER]: hydrateWithCurrentSelection,
156980
+ [PROMPT_CURRENT_SELECTION_OLD_PLACEHOLDER]: hydrateWithCurrentSelectionLegacy,
155921
156981
  [PROMPT_CURRENT_DIRECTORY_PLACEHOLDER]: hydrateWithCurrentDirectory,
155922
156982
  [PROMPT_EDITOR_OPEN_TABS_PLACEHOLDER]: hydrateWithOpenTabs,
155923
156983
  [PROMPT_CURRENT_REPOSITORY_PLACEHOLDER]: hydrateWithCurrentWorkspace
155924
156984
  };
155925
156985
  async function hydratePromptText(promptRawText, initialContext) {
155926
156986
  const promptText = PromptString.unsafe_fromUserQuery(promptRawText);
155927
- const promptTextMentionMatches = promptText.toString().match(/cody:\/\/\S+/gm) ?? [];
156987
+ const promptTextMentionMatches = promptText.toString().match(/cody:\/\/[^\s.,;:]+/gm) ?? [];
155928
156988
  let hydratedPromptText = promptText;
155929
156989
  const contextItemsMap = /* @__PURE__ */ new Map();
155930
156990
  for (const currentMatch of promptTextMentionMatches) {
@@ -155970,6 +157030,20 @@ async function hydrateWithCurrentSelection(promptText, initialContext) {
155970
157030
  [currentSelection]
155971
157031
  ];
155972
157032
  }
157033
+ async function hydrateWithCurrentSelectionLegacy(promptText, initialContext) {
157034
+ const initialContextFile = initialContext.find((item) => item.type === "file" && item.range);
157035
+ const currentSelection = initialContextFile ?? (await getSelectionOrFileContext())[0];
157036
+ if (!currentSelection) {
157037
+ return [promptText, []];
157038
+ }
157039
+ return [
157040
+ promptText.replaceAll(
157041
+ PROMPT_CURRENT_SELECTION_OLD_PLACEHOLDER,
157042
+ selectedCodePromptWithExtraFiles(currentSelection, [])
157043
+ ),
157044
+ [currentSelection]
157045
+ ];
157046
+ }
155973
157047
  async function hydrateWithCurrentDirectory(promptText, initialContext) {
155974
157048
  const initialContextDirectory = initialContext.find(
155975
157049
  (item) => item.type === "openctx" && item.providerUri === REMOTE_DIRECTORY_PROVIDER_URI
@@ -156190,25 +157264,19 @@ const STANDARD_PROMPTS_LIKE_COMMAND = [
156190
157264
  async function mergedPromptsAndLegacyCommands(input, signal2) {
156191
157265
  const { query: query2, recommendedOnly, first } = input;
156192
157266
  const queryLower = query2.toLowerCase();
156193
- const [customPrompts, isUnifiedPromptsEnabled] = await Promise.all([
157267
+ const [customPrompts, isUnifiedPromptsEnabled, isNewPromptsSgVersion] = await Promise.all([
156194
157268
  fetchCustomPrompts(queryLower, first, recommendedOnly, signal2),
156195
- featureFlagProvider.evaluateFeatureFlagEphemerally(FeatureFlag.CodyUnifiedPrompts)
157269
+ // Unified prompts flag provides prompts-like commands API
157270
+ featureFlagProvider.evaluateFeatureFlagEphemerally(FeatureFlag.CodyUnifiedPrompts),
157271
+ // 5.10.0 Contains new prompts library API which provides unified prompts
157272
+ // and standard (built-in) prompts
157273
+ isValidVersion({ minimumVersion: "5.10.0" })
156196
157274
  ]);
156197
- const codyCommands = getCodyCommandList();
156198
- const allCommands = !clientCapabilities().isCodyWeb ? (
156199
- // Ignore commands since with unified prompts vital commands will be replaced by out-of-box
156200
- // prompts, see main.ts register cody commands for unified prompts
156201
- isUnifiedPromptsEnabled ? STANDARD_PROMPTS_LIKE_COMMAND : [...codyCommands, ...[]].map((c) => ({
156202
- ...c,
156203
- actionType: "command"
156204
- }))
156205
- ) : (
156206
- // Ignore any commands for Cody Web since no commands are supported
156207
- []
156208
- );
156209
- const matchingCommands = allCommands.filter(
156210
- (c) => matchesQuery(queryLower, c.key) || matchesQuery(queryLower, c.description ?? "") || matchesQuery(queryLower, c.prompt)
156211
- );
157275
+ const matchingCommands = await getLocalCommands({
157276
+ query: queryLower,
157277
+ isUnifiedPromptsEnabled,
157278
+ remoteBuiltinPrompts: isNewPromptsSgVersion
157279
+ });
156212
157280
  const actions = customPrompts === "unsupported" ? matchingCommands : [...customPrompts, ...matchingCommands];
156213
157281
  return {
156214
157282
  query: query2,
@@ -156238,6 +157306,28 @@ async function fetchCustomPrompts(query2, first, recommendedOnly, signal2) {
156238
157306
  return [];
156239
157307
  }
156240
157308
  }
157309
+ async function getLocalCommands(input) {
157310
+ const { query: query2, isUnifiedPromptsEnabled, remoteBuiltinPrompts } = input;
157311
+ if (remoteBuiltinPrompts) {
157312
+ const remoteStandardPrompts = await graphqlClient.queryBuiltinPrompts({ query: query2 });
157313
+ return remoteStandardPrompts.map((prompt) => ({ ...prompt, actionType: "prompt", builtin: true }));
157314
+ }
157315
+ const codyCommands = getCodyCommandList();
157316
+ const allCommands = !clientCapabilities().isCodyWeb ? (
157317
+ // Ignore commands since with unified prompts vital commands will be replaced by out-of-box
157318
+ // prompts, see main.ts register cody commands for unified prompts
157319
+ isUnifiedPromptsEnabled ? STANDARD_PROMPTS_LIKE_COMMAND : [...codyCommands, ...[]].map((c) => ({
157320
+ ...c,
157321
+ actionType: "command"
157322
+ }))
157323
+ ) : (
157324
+ // Ignore any commands for Cody Web since no commands are supported
157325
+ []
157326
+ );
157327
+ return allCommands.filter(
157328
+ (c) => matchesQuery(query2, c.key) || matchesQuery(query2, c.description ?? "") || matchesQuery(query2, c.prompt)
157329
+ );
157330
+ }
156241
157331
  class AuthProviderSimplified {
156242
157332
  async openExternalAuthUrl(method, tokenReceiverUrl) {
156243
157333
  if (!await openExternalAuthUrl(method, tokenReceiverUrl)) {
@@ -159702,15 +160792,21 @@ class ContextRetriever {
159702
160792
  var _a3;
159703
160793
  (_a3 = this.symf) == null ? void 0 : _a3.dispose();
159704
160794
  }
159705
- async retrieveContext(mentions, inputTextWithoutContextChips, span2, signal2) {
160795
+ async retrieveContext(mentions, inputTextWithoutContextChips, span2, signal2, skipQueryRewrite = false) {
159706
160796
  const roots = await codebaseRootsFromMentions(mentions, signal2);
159707
- return await this._retrieveContext(roots, inputTextWithoutContextChips, span2, signal2);
160797
+ return await this._retrieveContext(
160798
+ roots,
160799
+ inputTextWithoutContextChips,
160800
+ span2,
160801
+ signal2,
160802
+ skipQueryRewrite
160803
+ );
159708
160804
  }
159709
- async _retrieveContext(roots, query2, span2, signal2) {
160805
+ async _retrieveContext(roots, query2, span2, signal2, skipQueryRewrite = false) {
159710
160806
  if (roots.length === 0) {
159711
160807
  return [];
159712
160808
  }
159713
- const rewritten = await rewriteKeywordQuery(this.llms, query2, signal2);
160809
+ const rewritten = skipQueryRewrite ? query2.toString() : await rewriteKeywordQuery(this.llms, query2, signal2);
159714
160810
  const rewrittenQuery = {
159715
160811
  ...query2,
159716
160812
  rewritten
@@ -160305,7 +161401,9 @@ class SearchTool extends CodyTool {
160305
161401
  const context2 = await this.contextRetriever.retrieveContext(
160306
161402
  toStructuredMentions([repo]),
160307
161403
  PromptString.unsafe_fromLLMResponse(query2),
160308
- span2
161404
+ span2,
161405
+ void 0,
161406
+ true
160309
161407
  );
160310
161408
  this.performedSearch.add(query2);
160311
161409
  const maxSearchItems = 30;
@@ -160816,7 +161914,9 @@ In this environment you have access to this set of tools you can use to fetch co
160816
161914
  4. The user is working in the VS Code editor on ${getOSPromptString()}.
160817
161915
 
160818
161916
  [GOAL]
160819
- Determine if you can answer the question with the given context, or if you need more information. The output will be processed by a bot to gather the necessary context for the user's question, so skip answering the question directly or comments.`;
161917
+ - Determine if you can answer the question with the given context, or if you need more information.
161918
+ - Do not provide the actual answer or comments in this step. This is an auto-generated message.
161919
+ - Your response should only contains the word "CONTEXT_SUFFICIENT" or the appropriate <TOOL*> tag(s) and nothing else.`;
160820
161920
  const CODYAGENT_PROMPTS = {
160821
161921
  review: REVIEW_PROMPT
160822
161922
  };
@@ -160843,10 +161943,7 @@ class DeepCodyAgent extends CodyChatAgent {
160843
161943
  * @returns The context items retrieved for the current chat.
160844
161944
  */
160845
161945
  async getContext(span2, chatAbortSignal, maxLoops = 2) {
160846
- const fastChatModel = modelsService.getModelByID(
160847
- "anthropic::2024-10-22::claude-3-5-haiku-latest"
160848
- );
160849
- this.models.review = (fastChatModel == null ? void 0 : fastChatModel.id) ?? this.chatBuilder.selectedModel;
161946
+ this.models.review = this.chatBuilder.selectedModel;
160850
161947
  const startTime = performance.now();
160851
161948
  const count = await this.reviewLoop(span2, chatAbortSignal, maxLoops);
160852
161949
  telemetryRecorder.recordEvent("cody.deep-cody.context", "reviewed", {
@@ -161011,7 +162108,7 @@ async function startPromptsMigration() {
161011
162108
  for (let index2 = 0; index2 < commandsToMigrate.length; index2++) {
161012
162109
  try {
161013
162110
  const command = commandsToMigrate[index2];
161014
- const commandKey = (command.key ?? command.slashCommand).replace(/\s+/g, "-");
162111
+ const commandKey = getPromptNameFromCommandKey(command.key ?? command.slashCommand);
161015
162112
  const promptText = generatePromptTextFromCommand(command);
161016
162113
  if (!promptText) {
161017
162114
  continue;
@@ -161078,6 +162175,13 @@ function generatePromptTextFromCommand(command) {
161078
162175
  }
161079
162176
  return promptText;
161080
162177
  }
162178
+ function getPromptNameFromCommandKey(commandKey) {
162179
+ try {
162180
+ return commandKey.replaceAll(/(?![\dA-Za-z](?:[\dA-Za-z]|[.-](?=[\dA-Za-z]))*-?)[^-]/g, "-").replaceAll(/-{2,}/g, "-");
162181
+ } catch {
162182
+ return commandKey.replaceAll(/\s+/g, "-");
162183
+ }
162184
+ }
161081
162185
  class ChatController {
161082
162186
  constructor({
161083
162187
  extensionUri,
@@ -161721,7 +162825,9 @@ class ChatController {
161721
162825
  configuration: {
161722
162826
  instruction,
161723
162827
  mode,
161724
- intent: mode === "edit" ? "edit" : "add"
162828
+ // Only document code uses non-edit (insert mode), set doc intent for Document code prompt
162829
+ // to specialize cody command runner for document code case.
162830
+ intent: mode === "edit" ? "edit" : "doc"
161725
162831
  }
161726
162832
  });
161727
162833
  if ((result == null ? void 0 : result.type) !== "edit" || !result.task) {
@@ -161731,6 +162837,15 @@ class ChatController {
161731
162837
  const task = result.task;
161732
162838
  let responseMessage = `Here is the response for the ${task.intent} instruction:
161733
162839
  `;
162840
+ if (!task.diff && task.replacement) {
162841
+ task.diff = [
162842
+ {
162843
+ type: "insertion",
162844
+ text: task.replacement,
162845
+ range: task.originalRange
162846
+ }
162847
+ ];
162848
+ }
161734
162849
  (_a3 = task.diff) == null ? void 0 : _a3.map((diff2) => {
161735
162850
  responseMessage += "\n```diff\n";
161736
162851
  if (diff2.type === "deletion") {
@@ -162500,6 +163615,21 @@ class ChatsController {
162500
163615
  panel2.dispose();
162501
163616
  }
162502
163617
  }
163618
+ async executePrompt({
163619
+ text,
163620
+ mode,
163621
+ autoSubmit
163622
+ }) {
163623
+ await commands$1.executeCommand("cody.chat.new");
163624
+ const webviewPanelOrView = this.panel.webviewPanelOrView || await this.panel.createWebviewViewOrPanel();
163625
+ setTimeout(
163626
+ () => webviewPanelOrView.webview.postMessage({
163627
+ type: "clientAction",
163628
+ setPromptAsInput: { text, mode, autoSubmit }
163629
+ }),
163630
+ 1e3
163631
+ );
163632
+ }
162503
163633
  registerViewsAndCommands() {
162504
163634
  this.disposables.push(
162505
163635
  window$1.registerWebviewViewProvider("cody.chat", this.panel, {
@@ -163959,7 +165089,11 @@ const createQuickPick = ({
163959
165089
  }
163960
165090
  }
163961
165091
  quickPick.show();
163962
- }
165092
+ },
165093
+ setItems: (items) => {
165094
+ quickPick.items = items;
165095
+ },
165096
+ hide: () => quickPick.hide()
163963
165097
  };
163964
165098
  };
163965
165099
  const PREVIEW_RANGE_DECORATION = window$1.createTextEditorDecorationType({
@@ -164150,12 +165284,14 @@ const getInput = async (document2, initialValues, source) => {
164150
165284
  const editInput = createQuickPick({
164151
165285
  title: activeTitle,
164152
165286
  placeHolder: "Enter edit instructions (type @ to include code, ⏎ to submit)",
164153
- getItems: () => getEditInputItems(
164154
- editInput.input.value,
164155
- activeRangeItem,
164156
- activeModelItem,
164157
- showModelSelector
164158
- ),
165287
+ getItems: () => {
165288
+ return getEditInputItems(
165289
+ editInput.input.value,
165290
+ activeRangeItem,
165291
+ activeModelItem,
165292
+ showModelSelector
165293
+ );
165294
+ },
164159
165295
  onDidHide: () => editor.setDecorations(PREVIEW_RANGE_DECORATION, []),
164160
165296
  ...source === "menu" ? {
164161
165297
  buttons: [QuickInputButtons.Back],
@@ -164285,7 +165421,7 @@ const getInput = async (document2, initialValues, source) => {
164285
165421
  }
164286
165422
  });
164287
165423
  };
164288
- function getOverridenModelForIntent(intent, currentModel, authStatus2) {
165424
+ function getOverriddenModelForIntent(intent, currentModel, authStatus2) {
164289
165425
  if (!isDotCom(authStatus2)) {
164290
165426
  return currentModel;
164291
165427
  }
@@ -164489,6 +165625,7 @@ class FixupTask {
164489
165625
  __publicField2(this, "originalDiff");
164490
165626
  /** The number of times we've submitted this to the LLM. */
164491
165627
  __publicField2(this, "spinCount", 0);
165628
+ __publicField2(this, "createdAt", performance.now());
164492
165629
  this.fixupFile = fixupFile;
164493
165630
  this.document = document2;
164494
165631
  this.instruction = instruction;
@@ -165295,7 +166432,7 @@ class FixupController {
165295
166432
  }
165296
166433
  async createTask(document2, instruction, userContextFiles, selectionRange, intent, mode, model2, source, destinationFile, insertionPoint, telemetryMetadata, taskId) {
165297
166434
  const authStatus2 = currentAuthStatus();
165298
- const overridenModel = getOverridenModelForIntent(intent, model2, authStatus2);
166435
+ const overriddenModel = getOverriddenModelForIntent(intent, model2, authStatus2);
165299
166436
  const fixupFile = this.files.forUri(document2.uri);
165300
166437
  const task = new FixupTask(
165301
166438
  fixupFile,
@@ -165305,7 +166442,7 @@ class FixupController {
165305
166442
  intent,
165306
166443
  selectionRange,
165307
166444
  mode,
165308
- overridenModel,
166445
+ overriddenModel,
165309
166446
  source,
165310
166447
  destinationFile,
165311
166448
  insertionPoint,
@@ -165376,11 +166513,16 @@ class FixupController {
165376
166513
  contentChanges: task.getContentChanges(),
165377
166514
  reason: void 0
165378
166515
  });
166516
+ const originalCodeCounts = countCode(task.original);
165379
166517
  const legacyMetadata = {
165380
166518
  intent: EditIntentTelemetryMetadataMapping[task.intent] || task.intent,
165381
166519
  mode: EditModeTelemetryMetadataMapping[task.mode] || task.mode,
165382
166520
  source: EventSourceTelemetryMetadataMapping[task.source || DEFAULT_EVENT_SOURCE] || task.source,
166521
+ originalCharCount: originalCodeCounts.charCount,
166522
+ originalLineCount: originalCodeCounts.lineCount,
166523
+ languageId: document2.languageId,
165383
166524
  model: task.model,
166525
+ latency: performance.now() - task.createdAt,
165384
166526
  ...this.countEditInsertions(task),
165385
166527
  ...task.telemetryMetadata,
165386
166528
  ...charactersLoggerMetadata
@@ -166994,8 +168136,7 @@ class EditProvider {
166994
168136
  onTurnComplete: async () => {
166995
168137
  typewriter.close();
166996
168138
  typewriter.stop();
166997
- void this.handleResponse(text, false);
166998
- return Promise.resolve();
168139
+ return this.handleResponse(text, false);
166999
168140
  }
167000
168141
  });
167001
168142
  if (this.config.task.intent === "test") {
@@ -167023,6 +168164,12 @@ class EditProvider {
167023
168164
  stopSequences,
167024
168165
  maxTokensToSample: contextWindow.output
167025
168166
  };
168167
+ if (model2.includes("gpt-4o")) {
168168
+ params.prediction = {
168169
+ type: "content",
168170
+ content: this.config.task.original
168171
+ };
168172
+ }
167026
168173
  if (modelsService.isStreamDisabled(model2)) {
167027
168174
  params.stream = false;
167028
168175
  }
@@ -167044,7 +168191,7 @@ class EditProvider {
167044
168191
  break;
167045
168192
  }
167046
168193
  case "complete": {
167047
- void multiplexer2.notifyTurnComplete();
168194
+ await multiplexer2.notifyTurnComplete();
167048
168195
  break;
167049
168196
  }
167050
168197
  case "error": {
@@ -169304,6 +170451,76 @@ const showSetupNotification = async (auth) => {
169304
170451
  ]
169305
170452
  });
169306
170453
  };
170454
+ class PromptsManager {
170455
+ constructor(args2) {
170456
+ __publicField2(this, "disposables", []);
170457
+ __publicField2(this, "chatsController");
170458
+ __publicField2(this, "showPromptsQuickPick", async (args2) => {
170459
+ const getItems = async (query2) => {
170460
+ const prompts = await graphqlClient.queryPrompts({
170461
+ query: query2 || "",
170462
+ first: 10,
170463
+ recommendedOnly: false
170464
+ });
170465
+ return {
170466
+ items: prompts.map(
170467
+ (prompt) => ({
170468
+ label: prompt.name,
170469
+ detail: prompt.description,
170470
+ value: JSON.stringify({
170471
+ id: prompt.id,
170472
+ text: prompt.definition.text,
170473
+ mode: prompt.mode,
170474
+ autoSubmit: prompt.autoSubmit
170475
+ })
170476
+ })
170477
+ )
170478
+ };
170479
+ };
170480
+ const quickPick = createQuickPick({
170481
+ title: "Prompts",
170482
+ placeHolder: "Search a prompt",
170483
+ getItems,
170484
+ onDidAccept: async (item) => {
170485
+ console.log(item);
170486
+ if (!item) {
170487
+ return;
170488
+ }
170489
+ const {
170490
+ text,
170491
+ mode,
170492
+ autoSubmit
170493
+ } = JSON.parse(
170494
+ item.value
170495
+ );
170496
+ this.chatsController.executePrompt({
170497
+ text,
170498
+ mode,
170499
+ autoSubmit
170500
+ });
170501
+ quickPick.hide();
170502
+ },
170503
+ onDidChangeValue: async (query2) => {
170504
+ const { items } = await getItems(query2);
170505
+ quickPick.setItems(items);
170506
+ }
170507
+ });
170508
+ quickPick.render("");
170509
+ });
170510
+ this.chatsController = args2.chatsController;
170511
+ const executePrompt = commands$1.registerCommand(
170512
+ "cody.command.execute-prompt",
170513
+ this.showPromptsQuickPick
170514
+ );
170515
+ this.disposables.push(executePrompt);
170516
+ }
170517
+ dispose() {
170518
+ for (const disposable of this.disposables) {
170519
+ disposable.dispose();
170520
+ }
170521
+ this.disposables = [];
170522
+ }
170523
+ }
169307
170524
  const BUTTON = {
169308
170525
  run: "Confirm and run",
169309
170526
  skip: "Do not ask again"
@@ -170358,6 +171575,9 @@ const IDE_BLOG_TOPICS = {
170358
171575
  };
170359
171576
  function getReleaseNotesURLByIDE(version2, IDE) {
170360
171577
  const blogTopic = IDE in IDE_BLOG_TOPICS && IDE_BLOG_TOPICS[IDE];
171578
+ if (IDE === CodyIDE.VSCode && blogTopic) {
171579
+ return new URL(VSCODE_CHANGELOG_URL).href;
171580
+ }
170361
171581
  if (IDE in IDE_BLOG_TOPICS && blogTopic) {
170362
171582
  const blogURL = new URL(SG_CHANGELOG_URL);
170363
171583
  blogURL.searchParams.set("topics", blogTopic);
@@ -171177,10 +172397,11 @@ async function* getSupercompletions({
171177
172397
  if (await contextFiltersProvider.isUriIgnored(document2.uri)) {
171178
172398
  return null;
171179
172399
  }
171180
- const diff2 = await recentEditsRetriever.getDiff(document2.uri);
171181
- if (diff2 === null) {
172400
+ const diffHunks = await recentEditsRetriever.getDiff(document2.uri);
172401
+ if (diffHunks === null || diffHunks.length === 0) {
171182
172402
  return null;
171183
172403
  }
172404
+ const diff2 = diffHunks[0].diff;
171184
172405
  const messages = buildInteraction(document2, diff2);
171185
172406
  for await (const rawChange of generateRawChanges(chat2, messages, abortSignal)) {
171186
172407
  const supercompletion = parseRawChange(document2, rawChange);
@@ -171588,7 +172809,8 @@ class SupercompletionProvider {
171588
172809
  this.renderer = new SupercompletionRenderer();
171589
172810
  this.recentEditsRetriever = new RecentEditsRetriever(
171590
172811
  {
171591
- maxAgeMs: EDIT_HISTORY_TIMEOUT
172812
+ maxAgeMs: EDIT_HISTORY_TIMEOUT,
172813
+ diffStrategyIdentifier: RecentEditsRetrieverDiffStrategyIdentifier.UnifiedDiff
171592
172814
  },
171593
172815
  workspace$1
171594
172816
  );
@@ -171830,7 +173052,7 @@ const register = async (context2, platform2, isExtensionModeDevOrTest) => {
171830
173052
  async function initializeSingletons(platform2, disposables) {
171831
173053
  var _a3;
171832
173054
  commandControllerInit((_a3 = platform2.createCommandsProvider) == null ? void 0 : _a3.call(platform2), platform2.extensionClient.capabilities);
171833
- modelsService.storage = localStorage;
173055
+ modelsService.setStorage(localStorage);
171834
173056
  if (platform2.otherInitialization) {
171835
173057
  disposables.push(platform2.otherInitialization());
171836
173058
  }
@@ -171937,10 +173159,11 @@ async function registerCodyCommands(statusBar, chatClient, disposables) {
171937
173159
  () => new SupercompletionProvider({ statusBar, chat: chatClient })
171938
173160
  )
171939
173161
  );
173162
+ registerAutoEdits(disposables);
171940
173163
  disposables.push(
171941
173164
  enableFeature(
171942
- ({ configuration: configuration2 }) => configuration2.experimentalAutoedits !== void 0,
171943
- () => new AutoeditsProvider()
173165
+ ({ configuration: configuration2 }) => configuration2.experimentalAutoeditsRendererTesting !== false,
173166
+ () => registerTestRenderCommand()
171944
173167
  )
171945
173168
  );
171946
173169
  disposables.push(
@@ -172125,10 +173348,41 @@ async function registerDebugCommands(context2, disposables) {
172125
173348
  }
172126
173349
  async function tryRegisterTutorial(context2, disposables) {
172127
173350
  if (!isRunningInsideAgent()) {
172128
- const { registerInteractiveTutorial } = await import("./index-DdCtag8k.mjs");
173351
+ const { registerInteractiveTutorial } = await import("./index-CPZYEb47.mjs");
172129
173352
  registerInteractiveTutorial(context2).then((disposable) => disposables.push(...disposable));
172130
173353
  }
172131
173354
  }
173355
+ function registerAutoEdits(disposables) {
173356
+ disposables.push(
173357
+ subscriptionDisposable(
173358
+ combineLatest$1(
173359
+ resolvedConfig,
173360
+ authStatus,
173361
+ featureFlagProvider.evaluatedFeatureFlag(
173362
+ FeatureFlag.CodyAutoeditExperimentEnabledFeatureFlag
173363
+ )
173364
+ ).pipe(
173365
+ map$1(([config2, authStatus2, autoeditEnabled]) => {
173366
+ if (shouldEnableExperimentalAutoedits(config2, autoeditEnabled, authStatus2)) {
173367
+ const provider = new AutoeditsProvider();
173368
+ const completionRegistration = languages$1.registerInlineCompletionItemProvider(
173369
+ [{ scheme: "file", language: "*" }, { notebookType: "*" }],
173370
+ provider
173371
+ );
173372
+ return Disposable.from(provider, completionRegistration);
173373
+ }
173374
+ return [];
173375
+ })
173376
+ ).subscribe({})
173377
+ )
173378
+ );
173379
+ }
173380
+ function shouldEnableExperimentalAutoedits(config2, autoeditExperimentFlag, authStatus2) {
173381
+ if (config2.configuration.experimentalAutoeditsEnabled !== void 0) {
173382
+ return config2.configuration.experimentalAutoeditsEnabled;
173383
+ }
173384
+ return autoeditExperimentFlag && isS2(authStatus2);
173385
+ }
172132
173386
  function registerAutocomplete(platform2, statusBar, disposables) {
172133
173387
  let statusBarLoader = statusBar.addLoader({
172134
173388
  title: "Completion Provider is starting",
@@ -172140,13 +173394,23 @@ function registerAutocomplete(platform2, statusBar, disposables) {
172140
173394
  };
172141
173395
  disposables.push(
172142
173396
  subscriptionDisposable(
172143
- combineLatest$1(resolvedConfig, authStatus).pipe(
173397
+ combineLatest$1(
173398
+ resolvedConfig,
173399
+ authStatus,
173400
+ featureFlagProvider.evaluatedFeatureFlag(
173401
+ FeatureFlag.CodyAutoeditExperimentEnabledFeatureFlag
173402
+ )
173403
+ ).pipe(
172144
173404
  //TODO(@rnauta -> @sqs): It feels yuk to handle the invalidation outside of
172145
173405
  //where the state is picked. It's also very tedious
172146
173406
  distinctUntilChanged$1((a, b) => {
172147
- return lodashExports.isEqual(a[0].configuration, b[0].configuration) && lodashExports.isEqual(a[1], b[1]);
173407
+ return lodashExports.isEqual(a[0].configuration, b[0].configuration) && lodashExports.isEqual(a[1], b[1]) && lodashExports.isEqual(a[2], b[2]);
172148
173408
  }),
172149
- switchMap$1(([config2, authStatus2]) => {
173409
+ switchMap$1(([config2, authStatus2, autoeditEnabled]) => {
173410
+ if (shouldEnableExperimentalAutoedits(config2, autoeditEnabled, authStatus2)) {
173411
+ finishLoading();
173412
+ return NEVER;
173413
+ }
172150
173414
  if (!authStatus2.pendingValidation && !statusBarLoader) {
172151
173415
  statusBarLoader = statusBar.addLoader({
172152
173416
  title: "Completion Provider is starting"
@@ -172224,7 +173488,8 @@ function registerChat({
172224
173488
  ghostHintDecorator,
172225
173489
  extensionClient: platform2.extensionClient
172226
173490
  });
172227
- disposables.push(ghostHintDecorator, editorManager, new CodeActionProvider());
173491
+ const promptsManager = new PromptsManager({ chatsController });
173492
+ disposables.push(ghostHintDecorator, editorManager, new CodeActionProvider(), promptsManager);
172228
173493
  if (window$1.registerWebviewPanelSerializer) {
172229
173494
  window$1.registerWebviewPanelSerializer(CodyChatEditorViewType, {
172230
173495
  async deserializeWebviewPanel(webviewPanel2, chatID) {
@@ -172237,10 +173502,15 @@ function registerChat({
172237
173502
  }
172238
173503
  return { chatsController };
172239
173504
  }
172240
- async function activate(context2, { initializeNetworkAgent, ...platformContext }) {
173505
+ async function activate(context2, {
173506
+ initializeNetworkAgent,
173507
+ initializeNoxideLib,
173508
+ ...platformContext
173509
+ }) {
173510
+ platformContext.noxide = (initializeNoxideLib == null ? void 0 : initializeNoxideLib()) || void 0;
172241
173511
  const api = new ExtensionApi(context2.extensionMode);
172242
173512
  try {
172243
- const networkAgent = await (initializeNetworkAgent == null ? void 0 : initializeNetworkAgent());
173513
+ const networkAgent = await (initializeNetworkAgent == null ? void 0 : initializeNetworkAgent(platformContext));
172244
173514
  if (networkAgent) {
172245
173515
  context2.subscriptions.push(networkAgent);
172246
173516
  platformContext.networkAgent = networkAgent;