#
tokens: 49325/50000 41/825 files (page 5/61)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 5 of 61. Use http://codebase.md/taurgis/sfcc-dev-mcp?lines=true&page={x} to view the full context.

# Directory Structure

```
├── .DS_Store
├── .github
│   ├── dependabot.yml
│   ├── instructions
│   │   ├── mcp-node-tests.instructions.md
│   │   └── mcp-yml-tests.instructions.md
│   ├── ISSUE_TEMPLATE
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   ├── documentation.yml
│   │   ├── feature_request.yml
│   │   └── question.yml
│   ├── PULL_REQUEST_TEMPLATE
│   │   ├── bug_fix.md
│   │   ├── documentation.md
│   │   └── new_tool.md
│   ├── pull_request_template.md
│   └── workflows
│       ├── ci.yml
│       ├── deploy-pages.yml
│       ├── publish.yml
│       └── update-docs.yml
├── .gitignore
├── .husky
│   └── pre-commit
├── aegis.config.docs-only.json
├── aegis.config.json
├── aegis.config.with-dw.json
├── AGENTS.md
├── ai-instructions
│   ├── claude-desktop
│   │   └── claude_custom_instructions.md
│   ├── cursor
│   │   └── .cursor
│   │       └── rules
│   │           ├── debugging-workflows.mdc
│   │           ├── hooks-development.mdc
│   │           ├── isml-templates.mdc
│   │           ├── job-framework.mdc
│   │           ├── performance-optimization.mdc
│   │           ├── scapi-endpoints.mdc
│   │           ├── security-patterns.mdc
│   │           ├── sfcc-development.mdc
│   │           ├── sfra-controllers.mdc
│   │           ├── sfra-models.mdc
│   │           ├── system-objects.mdc
│   │           └── testing-patterns.mdc
│   └── github-copilot
│       └── copilot-instructions.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── docs
│   ├── best-practices
│   │   ├── cartridge_creation.md
│   │   ├── isml_templates.md
│   │   ├── job_framework.md
│   │   ├── localserviceregistry.md
│   │   ├── ocapi_hooks.md
│   │   ├── performance.md
│   │   ├── scapi_custom_endpoint.md
│   │   ├── scapi_hooks.md
│   │   ├── security.md
│   │   ├── sfra_client_side_js.md
│   │   ├── sfra_controllers.md
│   │   ├── sfra_models.md
│   │   └── sfra_scss.md
│   ├── dw_campaign
│   │   ├── ABTest.md
│   │   ├── ABTestMgr.md
│   │   ├── ABTestSegment.md
│   │   ├── AmountDiscount.md
│   │   ├── ApproachingDiscount.md
│   │   ├── BonusChoiceDiscount.md
│   │   ├── BonusDiscount.md
│   │   ├── Campaign.md
│   │   ├── CampaignMgr.md
│   │   ├── CampaignStatusCodes.md
│   │   ├── Coupon.md
│   │   ├── CouponMgr.md
│   │   ├── CouponRedemption.md
│   │   ├── CouponStatusCodes.md
│   │   ├── Discount.md
│   │   ├── DiscountPlan.md
│   │   ├── FixedPriceDiscount.md
│   │   ├── FixedPriceShippingDiscount.md
│   │   ├── FreeDiscount.md
│   │   ├── FreeShippingDiscount.md
│   │   ├── PercentageDiscount.md
│   │   ├── PercentageOptionDiscount.md
│   │   ├── PriceBookPriceDiscount.md
│   │   ├── Promotion.md
│   │   ├── PromotionMgr.md
│   │   ├── PromotionPlan.md
│   │   ├── SlotContent.md
│   │   ├── SourceCodeGroup.md
│   │   ├── SourceCodeInfo.md
│   │   ├── SourceCodeStatusCodes.md
│   │   └── TotalFixedPriceDiscount.md
│   ├── dw_catalog
│   │   ├── Catalog.md
│   │   ├── CatalogMgr.md
│   │   ├── Category.md
│   │   ├── CategoryAssignment.md
│   │   ├── CategoryLink.md
│   │   ├── PriceBook.md
│   │   ├── PriceBookMgr.md
│   │   ├── Product.md
│   │   ├── ProductActiveData.md
│   │   ├── ProductAttributeModel.md
│   │   ├── ProductAvailabilityLevels.md
│   │   ├── ProductAvailabilityModel.md
│   │   ├── ProductInventoryList.md
│   │   ├── ProductInventoryMgr.md
│   │   ├── ProductInventoryRecord.md
│   │   ├── ProductLink.md
│   │   ├── ProductMgr.md
│   │   ├── ProductOption.md
│   │   ├── ProductOptionModel.md
│   │   ├── ProductOptionValue.md
│   │   ├── ProductPriceInfo.md
│   │   ├── ProductPriceModel.md
│   │   ├── ProductPriceTable.md
│   │   ├── ProductSearchHit.md
│   │   ├── ProductSearchModel.md
│   │   ├── ProductSearchRefinementDefinition.md
│   │   ├── ProductSearchRefinements.md
│   │   ├── ProductSearchRefinementValue.md
│   │   ├── ProductVariationAttribute.md
│   │   ├── ProductVariationAttributeValue.md
│   │   ├── ProductVariationModel.md
│   │   ├── Recommendation.md
│   │   ├── SearchModel.md
│   │   ├── SearchRefinementDefinition.md
│   │   ├── SearchRefinements.md
│   │   ├── SearchRefinementValue.md
│   │   ├── SortingOption.md
│   │   ├── SortingRule.md
│   │   ├── Store.md
│   │   ├── StoreGroup.md
│   │   ├── StoreInventoryFilter.md
│   │   ├── StoreInventoryFilterValue.md
│   │   ├── StoreMgr.md
│   │   ├── Variant.md
│   │   └── VariationGroup.md
│   ├── dw_content
│   │   ├── Content.md
│   │   ├── ContentMgr.md
│   │   ├── ContentSearchModel.md
│   │   ├── ContentSearchRefinementDefinition.md
│   │   ├── ContentSearchRefinements.md
│   │   ├── ContentSearchRefinementValue.md
│   │   ├── Folder.md
│   │   ├── Library.md
│   │   ├── MarkupText.md
│   │   └── MediaFile.md
│   ├── dw_crypto
│   │   ├── CertificateRef.md
│   │   ├── CertificateUtils.md
│   │   ├── Cipher.md
│   │   ├── Encoding.md
│   │   ├── JWE.md
│   │   ├── JWEHeader.md
│   │   ├── JWS.md
│   │   ├── JWSHeader.md
│   │   ├── KeyRef.md
│   │   ├── Mac.md
│   │   ├── MessageDigest.md
│   │   ├── SecureRandom.md
│   │   ├── Signature.md
│   │   ├── WeakCipher.md
│   │   ├── WeakMac.md
│   │   ├── WeakMessageDigest.md
│   │   ├── WeakSignature.md
│   │   └── X509Certificate.md
│   ├── dw_customer
│   │   ├── AddressBook.md
│   │   ├── AgentUserMgr.md
│   │   ├── AgentUserStatusCodes.md
│   │   ├── AuthenticationStatus.md
│   │   ├── Credentials.md
│   │   ├── Customer.md
│   │   ├── CustomerActiveData.md
│   │   ├── CustomerAddress.md
│   │   ├── CustomerCDPData.md
│   │   ├── CustomerContextMgr.md
│   │   ├── CustomerGroup.md
│   │   ├── CustomerList.md
│   │   ├── CustomerMgr.md
│   │   ├── CustomerPasswordConstraints.md
│   │   ├── CustomerPaymentInstrument.md
│   │   ├── CustomerStatusCodes.md
│   │   ├── EncryptedObject.md
│   │   ├── ExternalProfile.md
│   │   ├── OrderHistory.md
│   │   ├── ProductList.md
│   │   ├── ProductListItem.md
│   │   ├── ProductListItemPurchase.md
│   │   ├── ProductListMgr.md
│   │   ├── ProductListRegistrant.md
│   │   ├── Profile.md
│   │   └── Wallet.md
│   ├── dw_extensions.applepay
│   │   ├── ApplePayHookResult.md
│   │   └── ApplePayHooks.md
│   ├── dw_extensions.facebook
│   │   ├── FacebookFeedHooks.md
│   │   └── FacebookProduct.md
│   ├── dw_extensions.paymentrequest
│   │   ├── PaymentRequestHookResult.md
│   │   └── PaymentRequestHooks.md
│   ├── dw_extensions.payments
│   │   ├── SalesforceBancontactPaymentDetails.md
│   │   ├── SalesforceCardPaymentDetails.md
│   │   ├── SalesforceEpsPaymentDetails.md
│   │   ├── SalesforceIdealPaymentDetails.md
│   │   ├── SalesforceKlarnaPaymentDetails.md
│   │   ├── SalesforcePaymentDetails.md
│   │   ├── SalesforcePaymentIntent.md
│   │   ├── SalesforcePaymentMethod.md
│   │   ├── SalesforcePaymentRequest.md
│   │   ├── SalesforcePaymentsHooks.md
│   │   ├── SalesforcePaymentsMgr.md
│   │   ├── SalesforcePaymentsSiteConfiguration.md
│   │   ├── SalesforcePayPalOrder.md
│   │   ├── SalesforcePayPalOrderAddress.md
│   │   ├── SalesforcePayPalOrderPayer.md
│   │   ├── SalesforcePayPalPaymentDetails.md
│   │   ├── SalesforceSepaDebitPaymentDetails.md
│   │   └── SalesforceVenmoPaymentDetails.md
│   ├── dw_extensions.pinterest
│   │   ├── PinterestAvailability.md
│   │   ├── PinterestFeedHooks.md
│   │   ├── PinterestOrder.md
│   │   ├── PinterestOrderHooks.md
│   │   └── PinterestProduct.md
│   ├── dw_io
│   │   ├── CSVStreamReader.md
│   │   ├── CSVStreamWriter.md
│   │   ├── File.md
│   │   ├── FileReader.md
│   │   ├── FileWriter.md
│   │   ├── InputStream.md
│   │   ├── OutputStream.md
│   │   ├── PrintWriter.md
│   │   ├── RandomAccessFileReader.md
│   │   ├── Reader.md
│   │   ├── StringWriter.md
│   │   ├── Writer.md
│   │   ├── XMLIndentingStreamWriter.md
│   │   ├── XMLStreamConstants.md
│   │   ├── XMLStreamReader.md
│   │   └── XMLStreamWriter.md
│   ├── dw_job
│   │   ├── JobExecution.md
│   │   └── JobStepExecution.md
│   ├── dw_net
│   │   ├── FTPClient.md
│   │   ├── FTPFileInfo.md
│   │   ├── HTTPClient.md
│   │   ├── HTTPRequestPart.md
│   │   ├── Mail.md
│   │   ├── SFTPClient.md
│   │   ├── SFTPFileInfo.md
│   │   ├── WebDAVClient.md
│   │   └── WebDAVFileInfo.md
│   ├── dw_object
│   │   ├── ActiveData.md
│   │   ├── CustomAttributes.md
│   │   ├── CustomObject.md
│   │   ├── CustomObjectMgr.md
│   │   ├── Extensible.md
│   │   ├── ExtensibleObject.md
│   │   ├── Note.md
│   │   ├── ObjectAttributeDefinition.md
│   │   ├── ObjectAttributeGroup.md
│   │   ├── ObjectAttributeValueDefinition.md
│   │   ├── ObjectTypeDefinition.md
│   │   ├── PersistentObject.md
│   │   ├── SimpleExtensible.md
│   │   └── SystemObjectMgr.md
│   ├── dw_order
│   │   ├── AbstractItem.md
│   │   ├── AbstractItemCtnr.md
│   │   ├── Appeasement.md
│   │   ├── AppeasementItem.md
│   │   ├── Basket.md
│   │   ├── BasketMgr.md
│   │   ├── BonusDiscountLineItem.md
│   │   ├── CouponLineItem.md
│   │   ├── CreateAgentBasketLimitExceededException.md
│   │   ├── CreateBasketFromOrderException.md
│   │   ├── CreateCouponLineItemException.md
│   │   ├── CreateOrderException.md
│   │   ├── CreateTemporaryBasketLimitExceededException.md
│   │   ├── GiftCertificate.md
│   │   ├── GiftCertificateLineItem.md
│   │   ├── GiftCertificateMgr.md
│   │   ├── GiftCertificateStatusCodes.md
│   │   ├── Invoice.md
│   │   ├── InvoiceItem.md
│   │   ├── LineItem.md
│   │   ├── LineItemCtnr.md
│   │   ├── Order.md
│   │   ├── OrderAddress.md
│   │   ├── OrderItem.md
│   │   ├── OrderMgr.md
│   │   ├── OrderPaymentInstrument.md
│   │   ├── OrderProcessStatusCodes.md
│   │   ├── PaymentCard.md
│   │   ├── PaymentInstrument.md
│   │   ├── PaymentMethod.md
│   │   ├── PaymentMgr.md
│   │   ├── PaymentProcessor.md
│   │   ├── PaymentStatusCodes.md
│   │   ├── PaymentTransaction.md
│   │   ├── PriceAdjustment.md
│   │   ├── PriceAdjustmentLimitTypes.md
│   │   ├── ProductLineItem.md
│   │   ├── ProductShippingCost.md
│   │   ├── ProductShippingLineItem.md
│   │   ├── ProductShippingModel.md
│   │   ├── Return.md
│   │   ├── ReturnCase.md
│   │   ├── ReturnCaseItem.md
│   │   ├── ReturnItem.md
│   │   ├── Shipment.md
│   │   ├── ShipmentShippingCost.md
│   │   ├── ShipmentShippingModel.md
│   │   ├── ShippingLineItem.md
│   │   ├── ShippingLocation.md
│   │   ├── ShippingMethod.md
│   │   ├── ShippingMgr.md
│   │   ├── ShippingOrder.md
│   │   ├── ShippingOrderItem.md
│   │   ├── SumItem.md
│   │   ├── TaxGroup.md
│   │   ├── TaxItem.md
│   │   ├── TaxMgr.md
│   │   ├── TrackingInfo.md
│   │   └── TrackingRef.md
│   ├── dw_order.hooks
│   │   ├── CalculateHooks.md
│   │   ├── OrderHooks.md
│   │   ├── PaymentHooks.md
│   │   ├── ReturnHooks.md
│   │   └── ShippingOrderHooks.md
│   ├── dw_rpc
│   │   ├── SOAPUtil.md
│   │   ├── Stub.md
│   │   └── WebReference.md
│   ├── dw_suggest
│   │   ├── BrandSuggestions.md
│   │   ├── CategorySuggestions.md
│   │   ├── ContentSuggestions.md
│   │   ├── CustomSuggestions.md
│   │   ├── ProductSuggestions.md
│   │   ├── SearchPhraseSuggestions.md
│   │   ├── SuggestedCategory.md
│   │   ├── SuggestedContent.md
│   │   ├── SuggestedPhrase.md
│   │   ├── SuggestedProduct.md
│   │   ├── SuggestedTerm.md
│   │   ├── SuggestedTerms.md
│   │   ├── Suggestions.md
│   │   └── SuggestModel.md
│   ├── dw_svc
│   │   ├── FTPService.md
│   │   ├── FTPServiceDefinition.md
│   │   ├── HTTPFormService.md
│   │   ├── HTTPFormServiceDefinition.md
│   │   ├── HTTPService.md
│   │   ├── HTTPServiceDefinition.md
│   │   ├── LocalServiceRegistry.md
│   │   ├── Result.md
│   │   ├── Service.md
│   │   ├── ServiceCallback.md
│   │   ├── ServiceConfig.md
│   │   ├── ServiceCredential.md
│   │   ├── ServiceDefinition.md
│   │   ├── ServiceProfile.md
│   │   ├── ServiceRegistry.md
│   │   ├── SOAPService.md
│   │   └── SOAPServiceDefinition.md
│   ├── dw_system
│   │   ├── AgentUserStatusCodes.md
│   │   ├── Cache.md
│   │   ├── CacheMgr.md
│   │   ├── HookMgr.md
│   │   ├── InternalObject.md
│   │   ├── JobProcessMonitor.md
│   │   ├── Log.md
│   │   ├── Logger.md
│   │   ├── LogNDC.md
│   │   ├── OrganizationPreferences.md
│   │   ├── Pipeline.md
│   │   ├── PipelineDictionary.md
│   │   ├── RemoteInclude.md
│   │   ├── Request.md
│   │   ├── RequestHooks.md
│   │   ├── Response.md
│   │   ├── RESTErrorResponse.md
│   │   ├── RESTResponseMgr.md
│   │   ├── RESTSuccessResponse.md
│   │   ├── SearchStatus.md
│   │   ├── Session.md
│   │   ├── Site.md
│   │   ├── SitePreferences.md
│   │   ├── Status.md
│   │   ├── StatusItem.md
│   │   ├── System.md
│   │   └── Transaction.md
│   ├── dw_util
│   │   ├── ArrayList.md
│   │   ├── Assert.md
│   │   ├── BigInteger.md
│   │   ├── Bytes.md
│   │   ├── Calendar.md
│   │   ├── Collection.md
│   │   ├── Currency.md
│   │   ├── DateUtils.md
│   │   ├── Decimal.md
│   │   ├── FilteringCollection.md
│   │   ├── Geolocation.md
│   │   ├── HashMap.md
│   │   ├── HashSet.md
│   │   ├── Iterator.md
│   │   ├── LinkedHashMap.md
│   │   ├── LinkedHashSet.md
│   │   ├── List.md
│   │   ├── Locale.md
│   │   ├── Map.md
│   │   ├── MapEntry.md
│   │   ├── MappingKey.md
│   │   ├── MappingMgr.md
│   │   ├── PropertyComparator.md
│   │   ├── SecureEncoder.md
│   │   ├── SecureFilter.md
│   │   ├── SeekableIterator.md
│   │   ├── Set.md
│   │   ├── SortedMap.md
│   │   ├── SortedSet.md
│   │   ├── StringUtils.md
│   │   ├── Template.md
│   │   └── UUIDUtils.md
│   ├── dw_value
│   │   ├── EnumValue.md
│   │   ├── MimeEncodedText.md
│   │   ├── Money.md
│   │   └── Quantity.md
│   ├── dw_web
│   │   ├── ClickStream.md
│   │   ├── ClickStreamEntry.md
│   │   ├── Cookie.md
│   │   ├── Cookies.md
│   │   ├── CSRFProtection.md
│   │   ├── Form.md
│   │   ├── FormAction.md
│   │   ├── FormElement.md
│   │   ├── FormElementValidationResult.md
│   │   ├── FormField.md
│   │   ├── FormFieldOption.md
│   │   ├── FormFieldOptions.md
│   │   ├── FormGroup.md
│   │   ├── FormList.md
│   │   ├── FormListItem.md
│   │   ├── Forms.md
│   │   ├── HttpParameter.md
│   │   ├── HttpParameterMap.md
│   │   ├── LoopIterator.md
│   │   ├── PageMetaData.md
│   │   ├── PageMetaTag.md
│   │   ├── PagingModel.md
│   │   ├── Resource.md
│   │   ├── URL.md
│   │   ├── URLAction.md
│   │   ├── URLParameter.md
│   │   ├── URLRedirect.md
│   │   ├── URLRedirectMgr.md
│   │   └── URLUtils.md
│   ├── sfra
│   │   ├── account.md
│   │   ├── address.md
│   │   ├── billing.md
│   │   ├── cart.md
│   │   ├── categories.md
│   │   ├── content.md
│   │   ├── locale.md
│   │   ├── order.md
│   │   ├── payment.md
│   │   ├── price-default.md
│   │   ├── price-range.md
│   │   ├── price-tiered.md
│   │   ├── product-bundle.md
│   │   ├── product-full.md
│   │   ├── product-line-items.md
│   │   ├── product-search.md
│   │   ├── product-tile.md
│   │   ├── querystring.md
│   │   ├── render.md
│   │   ├── request.md
│   │   ├── response.md
│   │   ├── server.md
│   │   ├── shipping.md
│   │   ├── store.md
│   │   ├── stores.md
│   │   └── totals.md
│   └── TopLevel
│       ├── APIException.md
│       ├── arguments.md
│       ├── Array.md
│       ├── ArrayBuffer.md
│       ├── BigInt.md
│       ├── Boolean.md
│       ├── ConversionError.md
│       ├── DataView.md
│       ├── Date.md
│       ├── Error.md
│       ├── ES6Iterator.md
│       ├── EvalError.md
│       ├── Fault.md
│       ├── Float32Array.md
│       ├── Float64Array.md
│       ├── Function.md
│       ├── Generator.md
│       ├── global.md
│       ├── Int16Array.md
│       ├── Int32Array.md
│       ├── Int8Array.md
│       ├── InternalError.md
│       ├── IOError.md
│       ├── Iterable.md
│       ├── Iterator.md
│       ├── JSON.md
│       ├── Map.md
│       ├── Math.md
│       ├── Module.md
│       ├── Namespace.md
│       ├── Number.md
│       ├── Object.md
│       ├── QName.md
│       ├── RangeError.md
│       ├── ReferenceError.md
│       ├── RegExp.md
│       ├── Set.md
│       ├── StopIteration.md
│       ├── String.md
│       ├── Symbol.md
│       ├── SyntaxError.md
│       ├── SystemError.md
│       ├── TypeError.md
│       ├── Uint16Array.md
│       ├── Uint32Array.md
│       ├── Uint8Array.md
│       ├── Uint8ClampedArray.md
│       ├── URIError.md
│       ├── WeakMap.md
│       ├── WeakSet.md
│       ├── XML.md
│       ├── XMLList.md
│       └── XMLStreamError.md
├── docs-site
│   ├── .gitignore
│   ├── App.tsx
│   ├── components
│   │   ├── Badge.tsx
│   │   ├── BreadcrumbSchema.tsx
│   │   ├── CodeBlock.tsx
│   │   ├── Collapsible.tsx
│   │   ├── ConfigBuilder.tsx
│   │   ├── ConfigHero.tsx
│   │   ├── ConfigModeTabs.tsx
│   │   ├── icons.tsx
│   │   ├── Layout.tsx
│   │   ├── LightCodeContainer.tsx
│   │   ├── NewcomerCTA.tsx
│   │   ├── NextStepsStrip.tsx
│   │   ├── OnThisPage.tsx
│   │   ├── Search.tsx
│   │   ├── SEO.tsx
│   │   ├── Sidebar.tsx
│   │   ├── StructuredData.tsx
│   │   ├── ToolCard.tsx
│   │   ├── ToolFilters.tsx
│   │   ├── Typography.tsx
│   │   └── VersionBadge.tsx
│   ├── constants.tsx
│   ├── index.html
│   ├── main.tsx
│   ├── metadata.json
│   ├── package-lock.json
│   ├── package.json
│   ├── pages
│   │   ├── AIInterfacesPage.tsx
│   │   ├── ConfigurationPage.tsx
│   │   ├── DevelopmentPage.tsx
│   │   ├── ExamplesPage.tsx
│   │   ├── FeaturesPage.tsx
│   │   ├── HomePage.tsx
│   │   ├── SecurityPage.tsx
│   │   ├── ToolsPage.tsx
│   │   └── TroubleshootingPage.tsx
│   ├── postcss.config.js
│   ├── public
│   │   ├── .well-known
│   │   │   └── security.txt
│   │   ├── 404.html
│   │   ├── android-chrome-192x192.png
│   │   ├── android-chrome-512x512.png
│   │   ├── apple-touch-icon.png
│   │   ├── explain-product-pricing-methods-no-mcp.png
│   │   ├── explain-product-pricing-methods.png
│   │   ├── favicon-16x16.png
│   │   ├── favicon-32x32.png
│   │   ├── favicon.ico
│   │   ├── llms.txt
│   │   ├── robots.txt
│   │   ├── site.webmanifest
│   │   └── sitemap.xml
│   ├── README.md
│   ├── scripts
│   │   ├── generate-search-index.js
│   │   ├── generate-sitemap.js
│   │   └── search-dev.js
│   ├── src
│   │   └── styles
│   │       ├── input.css
│   │       └── prism-theme.css
│   ├── tailwind.config.js
│   ├── tsconfig.json
│   ├── types.ts
│   ├── utils
│   │   ├── search.ts
│   │   └── toolsData.ts
│   └── vite.config.ts
├── eslint.config.js
├── jest.config.js
├── LICENSE
├── package-lock.json
├── package.json
├── README.md
├── scripts
│   └── convert-docs.js
├── SECURITY.md
├── server.json
├── src
│   ├── clients
│   │   ├── base
│   │   │   ├── http-client.ts
│   │   │   ├── oauth-token.ts
│   │   │   └── ocapi-auth-client.ts
│   │   ├── best-practices-client.ts
│   │   ├── cartridge-generation-client.ts
│   │   ├── docs
│   │   │   ├── class-content-parser.ts
│   │   │   ├── class-name-resolver.ts
│   │   │   ├── documentation-scanner.ts
│   │   │   ├── index.ts
│   │   │   └── referenced-types-extractor.ts
│   │   ├── docs-client.ts
│   │   ├── log-client.ts
│   │   ├── logs
│   │   │   ├── index.ts
│   │   │   ├── log-analyzer.ts
│   │   │   ├── log-client.ts
│   │   │   ├── log-constants.ts
│   │   │   ├── log-file-discovery.ts
│   │   │   ├── log-file-reader.ts
│   │   │   ├── log-formatter.ts
│   │   │   ├── log-processor.ts
│   │   │   ├── log-types.ts
│   │   │   └── webdav-client-manager.ts
│   │   ├── ocapi
│   │   │   ├── code-versions-client.ts
│   │   │   ├── site-preferences-client.ts
│   │   │   └── system-objects-client.ts
│   │   ├── ocapi-client.ts
│   │   └── sfra-client.ts
│   ├── config
│   │   ├── configuration-factory.ts
│   │   └── dw-json-loader.ts
│   ├── core
│   │   ├── handlers
│   │   │   ├── abstract-log-tool-handler.ts
│   │   │   ├── base-handler.ts
│   │   │   ├── best-practices-handler.ts
│   │   │   ├── cartridge-handler.ts
│   │   │   ├── client-factory.ts
│   │   │   ├── code-version-handler.ts
│   │   │   ├── docs-handler.ts
│   │   │   ├── job-log-handler.ts
│   │   │   ├── job-log-tool-config.ts
│   │   │   ├── log-handler.ts
│   │   │   ├── log-tool-config.ts
│   │   │   ├── sfra-handler.ts
│   │   │   ├── system-object-handler.ts
│   │   │   └── validation-helpers.ts
│   │   ├── server.ts
│   │   └── tool-definitions.ts
│   ├── index.ts
│   ├── main.ts
│   ├── services
│   │   ├── file-system-service.ts
│   │   ├── index.ts
│   │   └── path-service.ts
│   ├── tool-configs
│   │   ├── best-practices-tool-config.ts
│   │   ├── cartridge-tool-config.ts
│   │   ├── code-version-tool-config.ts
│   │   ├── docs-tool-config.ts
│   │   ├── job-log-tool-config.ts
│   │   ├── log-tool-config.ts
│   │   ├── sfra-tool-config.ts
│   │   └── system-object-tool-config.ts
│   ├── types
│   │   └── types.ts
│   └── utils
│       ├── cache.ts
│       ├── job-log-tool-config.ts
│       ├── job-log-utils.ts
│       ├── log-cache.ts
│       ├── log-tool-config.ts
│       ├── log-tool-constants.ts
│       ├── log-tool-utils.ts
│       ├── logger.ts
│       ├── ocapi-url-builder.ts
│       ├── path-resolver.ts
│       ├── query-builder.ts
│       ├── utils.ts
│       └── validator.ts
├── tests
│   ├── __mocks__
│   │   ├── docs-client.ts
│   │   ├── src
│   │   │   └── clients
│   │   │       └── base
│   │   │           └── http-client.js
│   │   └── webdav.js
│   ├── base-handler.test.ts
│   ├── base-http-client.test.ts
│   ├── best-practices-handler.test.ts
│   ├── cache.test.ts
│   ├── cartridge-handler.test.ts
│   ├── class-content-parser.test.ts
│   ├── class-name-resolver.test.ts
│   ├── client-factory.test.ts
│   ├── code-version-handler.test.ts
│   ├── code-versions-client.test.ts
│   ├── config.test.ts
│   ├── configuration-factory.test.ts
│   ├── docs-handler.test.ts
│   ├── documentation-scanner.test.ts
│   ├── file-system-service.test.ts
│   ├── job-log-handler.test.ts
│   ├── job-log-utils.test.ts
│   ├── log-client.test.ts
│   ├── log-handler.test.ts
│   ├── log-processor.test.ts
│   ├── logger.test.ts
│   ├── mcp
│   │   ├── AGENTS.md
│   │   ├── node
│   │   │   ├── activate-code-version-advanced.full-mode.programmatic.test.js
│   │   │   ├── code-versions.full-mode.programmatic.test.js
│   │   │   ├── generate-cartridge-structure.docs-only.programmatic.test.js
│   │   │   ├── get-available-best-practice-guides.docs-only.programmatic.test.js
│   │   │   ├── get-available-sfra-documents.programmatic.test.js
│   │   │   ├── get-best-practice-guide.docs-only.programmatic.test.js
│   │   │   ├── get-hook-reference.docs-only.programmatic.test.js
│   │   │   ├── get-job-execution-summary.full-mode.programmatic.test.js
│   │   │   ├── get-job-log-entries.full-mode.programmatic.test.js
│   │   │   ├── get-latest-debug.full-mode.programmatic.test.js
│   │   │   ├── get-latest-error.full-mode.programmatic.test.js
│   │   │   ├── get-latest-info.full-mode.programmatic.test.js
│   │   │   ├── get-latest-job-log-files.full-mode.programmatic.test.js
│   │   │   ├── get-latest-warn.full-mode.programmatic.test.js
│   │   │   ├── get-log-file-contents.full-mode.programmatic.test.js
│   │   │   ├── get-sfcc-class-documentation.docs-only.programmatic.test.js
│   │   │   ├── get-sfcc-class-info.docs-only.programmatic.test.js
│   │   │   ├── get-sfra-categories.docs-only.programmatic.test.js
│   │   │   ├── get-sfra-document.programmatic.test.js
│   │   │   ├── get-sfra-documents-by-category.docs-only.programmatic.test.js
│   │   │   ├── get-system-object-definition.full-mode.programmatic.test.js
│   │   │   ├── get-system-object-definitions.docs-only.programmatic.test.js
│   │   │   ├── get-system-object-definitions.full-mode.programmatic.test.js
│   │   │   ├── list-log-files.full-mode.programmatic.test.js
│   │   │   ├── list-sfcc-classes.docs-only.programmatic.test.js
│   │   │   ├── search-best-practices.docs-only.programmatic.test.js
│   │   │   ├── search-custom-object-attribute-definitions.full-mode.programmatic.test.js
│   │   │   ├── search-job-logs-by-name.full-mode.programmatic.test.js
│   │   │   ├── search-job-logs.full-mode.programmatic.test.js
│   │   │   ├── search-logs.full-mode.programmatic.test.js
│   │   │   ├── search-sfcc-classes.docs-only.programmatic.test.js
│   │   │   ├── search-sfcc-methods.docs-only.programmatic.test.js
│   │   │   ├── search-sfra-documentation.docs-only.programmatic.test.js
│   │   │   ├── search-site-preferences.full-mode.programmatic.test.js
│   │   │   ├── search-system-object-attribute-definitions.full-mode.programmatic.test.js
│   │   │   ├── search-system-object-attribute-groups.full-mode.programmatic.test.js
│   │   │   ├── summarize-logs.full-mode.programmatic.test.js
│   │   │   ├── tools.docs-only.programmatic.test.js
│   │   │   └── tools.full-mode.programmatic.test.js
│   │   ├── README.md
│   │   ├── test-fixtures
│   │   │   └── dw.json
│   │   └── yaml
│   │       ├── activate-code-version.docs-only.test.mcp.yml
│   │       ├── activate-code-version.full-mode.test.mcp.yml
│   │       ├── get_latest_error.test.mcp.yml
│   │       ├── get-available-best-practice-guides.docs-only.test.mcp.yml
│   │       ├── get-available-best-practice-guides.full-mode.test.mcp.yml
│   │       ├── get-available-sfra-documents.docs-only.test.mcp.yml
│   │       ├── get-available-sfra-documents.full-mode.test.mcp.yml
│   │       ├── get-best-practice-guide.docs-only.test.mcp.yml
│   │       ├── get-best-practice-guide.full-mode.test.mcp.yml
│   │       ├── get-code-versions.docs-only.test.mcp.yml
│   │       ├── get-code-versions.full-mode.test.mcp.yml
│   │       ├── get-hook-reference.docs-only.test.mcp.yml
│   │       ├── get-hook-reference.full-mode.test.mcp.yml
│   │       ├── get-job-execution-summary.full-mode.test.mcp.yml
│   │       ├── get-job-log-entries.full-mode.test.mcp.yml
│   │       ├── get-latest-debug.full-mode.test.mcp.yml
│   │       ├── get-latest-error.full-mode.test.mcp.yml
│   │       ├── get-latest-info.full-mode.test.mcp.yml
│   │       ├── get-latest-job-log-files.full-mode.test.mcp.yml
│   │       ├── get-latest-warn.full-mode.test.mcp.yml
│   │       ├── get-log-file-contents.full-mode.test.mcp.yml
│   │       ├── get-sfcc-class-documentation.docs-only.test.mcp.yml
│   │       ├── get-sfcc-class-documentation.full-mode.test.mcp.yml
│   │       ├── get-sfcc-class-info.docs-only.test.mcp.yml
│   │       ├── get-sfcc-class-info.full-mode.test.mcp.yml
│   │       ├── get-sfra-categories.docs-only.test.mcp.yml
│   │       ├── get-sfra-categories.full-mode.test.mcp.yml
│   │       ├── get-sfra-document.docs-only.test.mcp.yml
│   │       ├── get-sfra-document.full-mode.test.mcp.yml
│   │       ├── get-sfra-documents-by-category.docs-only.test.mcp.yml
│   │       ├── get-sfra-documents-by-category.full-mode.test.mcp.yml
│   │       ├── get-system-object-definition.docs-only.test.mcp.yml
│   │       ├── get-system-object-definition.full-mode.test.mcp.yml
│   │       ├── get-system-object-definitions.docs-only.test.mcp.yml
│   │       ├── get-system-object-definitions.full-mode.test.mcp.yml
│   │       ├── list-log-files.full-mode.test.mcp.yml
│   │       ├── list-sfcc-classes.docs-only.test.mcp.yml
│   │       ├── list-sfcc-classes.full-mode.test.mcp.yml
│   │       ├── search-best-practices.docs-only.test.mcp.yml
│   │       ├── search-best-practices.full-mode.test.mcp.yml
│   │       ├── search-custom-object-attribute-definitions.docs-only.test.mcp.yml
│   │       ├── search-custom-object-attribute-definitions.test.mcp.yml
│   │       ├── search-job-logs-by-name.full-mode.test.mcp.yml
│   │       ├── search-job-logs.full-mode.test.mcp.yml
│   │       ├── search-logs.full-mode.test.mcp.yml
│   │       ├── search-sfcc-classes.docs-only.test.mcp.yml
│   │       ├── search-sfcc-classes.full-mode.test.mcp.yml
│   │       ├── search-sfcc-methods.docs-only.test.mcp.yml
│   │       ├── search-sfcc-methods.full-mode.test.mcp.yml
│   │       ├── search-sfra-documentation.docs-only.test.mcp.yml
│   │       ├── search-sfra-documentation.full-mode.test.mcp.yml
│   │       ├── search-site-preferences.docs-only.test.mcp.yml
│   │       ├── search-site-preferences.full-mode.test.mcp.yml
│   │       ├── search-system-object-attribute-definitions.docs-only.test.mcp.yml
│   │       ├── search-system-object-attribute-definitions.full-mode.test.mcp.yml
│   │       ├── search-system-object-attribute-groups.docs-only.test.mcp.yml
│   │       ├── search-system-object-attribute-groups.full-mode.test.mcp.yml
│   │       ├── summarize-logs.full-mode.test.mcp.yml
│   │       ├── tools.docs-only.test.mcp.yml
│   │       └── tools.full-mode.test.mcp.yml
│   ├── oauth-token.test.ts
│   ├── ocapi-auth-client.test.ts
│   ├── ocapi-client.test.ts
│   ├── path-service.test.ts
│   ├── query-builder.test.ts
│   ├── referenced-types-extractor.test.ts
│   ├── servers
│   │   ├── sfcc-mock-server
│   │   │   ├── mock-data
│   │   │   │   └── ocapi
│   │   │   │       ├── code-versions.json
│   │   │   │       ├── custom-object-attributes-customapi.json
│   │   │   │       ├── custom-object-attributes-globalsettings.json
│   │   │   │       ├── custom-object-attributes-versionhistory.json
│   │   │   │       ├── site-preferences-ccv.json
│   │   │   │       ├── site-preferences-fastforward.json
│   │   │   │       ├── site-preferences-sfra.json
│   │   │   │       ├── site-preferences-storefront.json
│   │   │   │       ├── site-preferences-system.json
│   │   │   │       ├── system-object-attribute-groups-campaign.json
│   │   │   │       ├── system-object-attribute-groups-category.json
│   │   │   │       ├── system-object-attribute-groups-order.json
│   │   │   │       ├── system-object-attribute-groups-product.json
│   │   │   │       ├── system-object-attribute-groups-sitepreferences.json
│   │   │   │       ├── system-object-attributes-customeraddress.json
│   │   │   │       ├── system-object-attributes-product-expanded.json
│   │   │   │       ├── system-object-attributes-product.json
│   │   │   │       ├── system-object-definition-category.json
│   │   │   │       ├── system-object-definition-customer.json
│   │   │   │       ├── system-object-definition-customeraddress.json
│   │   │   │       ├── system-object-definition-order.json
│   │   │   │       ├── system-object-definition-product.json
│   │   │   │       ├── system-object-definitions-old.json
│   │   │   │       └── system-object-definitions.json
│   │   │   ├── package-lock.json
│   │   │   ├── package.json
│   │   │   ├── README.md
│   │   │   ├── scripts
│   │   │   │   └── setup-logs.js
│   │   │   ├── server.js
│   │   │   └── src
│   │   │       ├── app.js
│   │   │       ├── config
│   │   │       │   └── server-config.js
│   │   │       ├── middleware
│   │   │       │   ├── auth.js
│   │   │       │   ├── cors.js
│   │   │       │   └── logging.js
│   │   │       ├── routes
│   │   │       │   ├── ocapi
│   │   │       │   │   ├── code-versions-handler.js
│   │   │       │   │   ├── oauth-handler.js
│   │   │       │   │   ├── ocapi-error-utils.js
│   │   │       │   │   ├── ocapi-utils.js
│   │   │       │   │   ├── site-preferences-handler.js
│   │   │       │   │   └── system-objects-handler.js
│   │   │       │   ├── ocapi.js
│   │   │       │   └── webdav.js
│   │   │       └── utils
│   │   │           ├── mock-data-loader.js
│   │   │           └── webdav-xml.js
│   │   └── sfcc-mock-server-manager.ts
│   ├── sfcc-mock-server.test.ts
│   ├── site-preferences-client.test.ts
│   ├── system-objects-client.test.ts
│   ├── utils.test.ts
│   ├── validation-helpers.test.ts
│   └── validator.test.ts
├── tsconfig.json
└── tsconfig.test.json
```

# Files

--------------------------------------------------------------------------------
/docs/dw_catalog/StoreInventoryFilter.md:
--------------------------------------------------------------------------------

```markdown
 1 | ## Package: dw.catalog
 2 | 
 3 | # Class StoreInventoryFilter
 4 | 
 5 | ## Inheritance Hierarchy
 6 | 
 7 | - Object
 8 |   - dw.catalog.StoreInventoryFilter
 9 | 
10 | ## Description
11 | 
12 | This class represents a store inventory filter, which can be used at ProductSearchModel.setStoreInventoryFilter(StoreInventoryFilter) to filter the search result by one or more store inventories. Compared to the default parameter 'ilids' (Inventory List IDs) see (ProductSearchModel.INVENTORY_LIST_IDS_PARAMETER the store inventory filter allows a customization of the parameter name and the inventory list ID parameter values for the URL generations via all URLRefine and URLRelax methods e.g. for ProductSearchModel.urlRefineCategory(String, String), ProductSearchModel.urlRelaxPrice(URL), SearchModel.urlRefineAttribute(String, String, String). Example custom URL: city=Burlington|Boston new dw.catalog.StoreInventoryFilter( "city", new dw.util.ArrayList( new dw.catalog.StoreInventoryFilterValue( "Burlington", "inventory_store_store9" ), new dw.catalog.StoreInventoryFilterValue( "Boston", "inventory_store_store8" ) ) );
13 | 
14 | ## Properties
15 | 
16 | ### semanticURLParameter
17 | 
18 | **Type:** String (Read Only)
19 | 
20 | The semantic URL parameter of this StoreInventoryFilter.
21 | 
22 | ### storeInventoryFilterValues
23 | 
24 | **Type:** List (Read Only)
25 | 
26 | A list of StoreInventoryFilterValue instances used by this StoreInventoryFilter.
27 | 
28 | ## Constructor Summary
29 | 
30 | StoreInventoryFilter(semanticURLParameter : String, storeFilterValues : List) Creates a new StoreInventoryFilter instance for the given semantic URL parameter and a list of StoreInventoryFilterValue instances.
31 | 
32 | ## Method Summary
33 | 
34 | ### getSemanticURLParameter
35 | 
36 | **Signature:** `getSemanticURLParameter() : String`
37 | 
38 | Returns the semantic URL parameter of this StoreInventoryFilter.
39 | 
40 | ### getStoreInventoryFilterValues
41 | 
42 | **Signature:** `getStoreInventoryFilterValues() : List`
43 | 
44 | Returns a list of StoreInventoryFilterValue instances used by this StoreInventoryFilter.
45 | 
46 | ## Constructor Detail
47 | 
48 | ## Method Detail
49 | 
50 | ## Method Details
51 | 
52 | ### getSemanticURLParameter
53 | 
54 | **Signature:** `getSemanticURLParameter() : String`
55 | 
56 | **Description:** Returns the semantic URL parameter of this StoreInventoryFilter.
57 | 
58 | **Returns:**
59 | 
60 | the semantic URL parameter of this StoreInventoryFilter.
61 | 
62 | ---
63 | 
64 | ### getStoreInventoryFilterValues
65 | 
66 | **Signature:** `getStoreInventoryFilterValues() : List`
67 | 
68 | **Description:** Returns a list of StoreInventoryFilterValue instances used by this StoreInventoryFilter.
69 | 
70 | **Returns:**
71 | 
72 | a list of StoreInventoryFilterValue instances used by this StoreInventoryFilter.
73 | 
74 | ---
```

--------------------------------------------------------------------------------
/docs/sfra/price-range.md:
--------------------------------------------------------------------------------

```markdown
 1 | # SFRA Range Price Model
 2 | 
 3 | ## Overview
 4 | 
 5 | The Range Price model represents price ranges in SFRA applications, typically used for product sets, bundles, or variable products where prices can vary between a minimum and maximum value.
 6 | 
 7 | ## Constructor
 8 | 
 9 | ```javascript
10 | function RangePrice(min, max)
11 | ```
12 | 
13 | Creates a Range Price model instance with minimum and maximum pricing.
14 | 
15 | ### Parameters
16 | 
17 | - `min` (dw.value.Money) - Range minimum price
18 | - `max` (dw.value.Money) - Range maximum price
19 | 
20 | ## Properties
21 | 
22 | ### type
23 | **Type:** string
24 | 
25 | Always set to 'range' to identify this as a range price model.
26 | 
27 | ### min
28 | **Type:** DefaultPrice
29 | 
30 | Minimum price in the range, formatted as a DefaultPrice model with value, currency, and formatted properties. Created as `new DefaultPrice(min)` where only the sales price is provided.
31 | 
32 | ### max
33 | **Type:** DefaultPrice
34 | 
35 | Maximum price in the range, formatted as a DefaultPrice model with value, currency, and formatted properties. Created as `new DefaultPrice(max)` where only the sales price is provided.
36 | 
37 | ## Usage Example
38 | 
39 | ```javascript
40 | var RangePrice = require('*/cartridge/models/price/range');
41 | 
42 | // For a product bundle with varying prices
43 | var minPrice = new Money(19.99, 'USD');
44 | var maxPrice = new Money(49.99, 'USD');
45 | 
46 | var rangePrice = new RangePrice(minPrice, maxPrice);
47 | 
48 | console.log(rangePrice.type);              // "range"
49 | console.log(rangePrice.min.sales.formatted);     // "$19.99"
50 | console.log(rangePrice.max.sales.formatted);     // "$49.99"
51 | 
52 | // Display price range
53 | console.log(rangePrice.min.sales.formatted + ' - ' + rangePrice.max.sales.formatted);
54 | // Output: "$19.99 - $49.99"
55 | ```
56 | 
57 | ## Use Cases
58 | 
59 | Range prices are commonly used for:
60 | - **Product Bundles** - When bundle contents affect total price
61 | - **Product Sets** - Collections with varying individual prices
62 | - **Variable Products** - Products with options that affect pricing
63 | - **Category Displays** - Showing price ranges for product collections
64 | 
65 | ## Notes
66 | 
67 | - Both min and max are DefaultPrice models created with only the sales price (no list price)
68 | - Min and max prices are accessed via `.sales` property (e.g., `rangePrice.min.sales.formatted`)
69 | - Type property helps identify this as a range price in templates
70 | - Useful for displaying "from X to Y" pricing
71 | - Maintains currency and formatting consistency through DefaultPrice
72 | 
73 | ## Related Models
74 | 
75 | - **DefaultPrice Model** - Used for min and max price formatting
76 | - **TieredPrice Model** - Alternative pricing model for quantity discounts
77 | - **Product Models** - May use range prices for variable products
78 | 
```

--------------------------------------------------------------------------------
/docs/TopLevel/QName.md:
--------------------------------------------------------------------------------

```markdown
 1 | ## Package: TopLevel
 2 | 
 3 | # Class QName
 4 | 
 5 | ## Inheritance Hierarchy
 6 | 
 7 | - Object
 8 |   - QName
 9 | 
10 | ## Description
11 | 
12 | QName objects are used to represent qualified names of XML elements and attributes. Each QName object has a local name of type string and a namespace URI of type string or null. When the namespace URI is null, this qualified name matches any namespace. If the QName of an XML element is specified without identifying a namespace (i.e., as an unqualified identifier), the uri property of the associated QName will be set to the in-scope default namespace. If the QName of an XML attribute is specified without identifying a namespace, the uri property of the associated QName will be the empty string representing no namespace.
13 | 
14 | ## Properties
15 | 
16 | ### localName
17 | 
18 | **Type:** String (Read Only)
19 | 
20 | The local name of the QName object.
21 | 
22 | ### uri
23 | 
24 | **Type:** String (Read Only)
25 | 
26 | The Uniform Resource Identifier (URI) of the QName object.
27 | 
28 | ## Constructor Summary
29 | 
30 | QName() Constructs a QName object where localName is set to an empty String.
31 | 
32 | QName(qname : QName) Constructs a QName object that is a copy of the specified qname.
33 | 
34 | QName(uri : Namespace, localName : QName) Creates a QName object with a uri from a Namespace object and a localName from a QName object.
35 | 
36 | ## Method Summary
37 | 
38 | ### getLocalName
39 | 
40 | **Signature:** `getLocalName() : String`
41 | 
42 | Returns the local name of the QName object.
43 | 
44 | ### getUri
45 | 
46 | **Signature:** `getUri() : String`
47 | 
48 | Returns the Uniform Resource Identifier (URI) of the QName object.
49 | 
50 | ### toString
51 | 
52 | **Signature:** `toString() : String`
53 | 
54 | Returns a string composed of the URI, and the local name for the QName object, separated by "::".
55 | 
56 | ## Constructor Detail
57 | 
58 | ## Method Detail
59 | 
60 | ## Method Details
61 | 
62 | ### getLocalName
63 | 
64 | **Signature:** `getLocalName() : String`
65 | 
66 | **Description:** Returns the local name of the QName object.
67 | 
68 | **Returns:**
69 | 
70 | the local name of the QName object.
71 | 
72 | ---
73 | 
74 | ### getUri
75 | 
76 | **Signature:** `getUri() : String`
77 | 
78 | **Description:** Returns the Uniform Resource Identifier (URI) of the QName object.
79 | 
80 | **Returns:**
81 | 
82 | the Uniform Resource Identifier (URI) of the QName object.
83 | 
84 | ---
85 | 
86 | ### toString
87 | 
88 | **Signature:** `toString() : String`
89 | 
90 | **Description:** Returns a string composed of the URI, and the local name for the QName object, separated by "::". The format depends on the uri property of the QName object: If uri == "" toString returns localName else if uri == null toString returns *::localName else toString returns uri::localNam
91 | 
92 | **Returns:**
93 | 
94 | a string composed of the URI, and the local name for the QName object, separated by "::".
95 | 
96 | ---
```

--------------------------------------------------------------------------------
/docs/dw_customer/ProductListItemPurchase.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: dw.customer
  2 | 
  3 | # Class ProductListItemPurchase
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - dw.object.PersistentObject
  9 |   - dw.object.ExtensibleObject
 10 |     - dw.customer.ProductListItemPurchase
 11 | 
 12 | ## Description
 13 | 
 14 | A record of the purchase of an item contained in a product list.
 15 | 
 16 | ## Properties
 17 | 
 18 | ### item
 19 | 
 20 | **Type:** ProductListItem (Read Only)
 21 | 
 22 | The item that was purchased.
 23 | 
 24 | ### orderNo
 25 | 
 26 | **Type:** String (Read Only)
 27 | 
 28 | The number of the order in which the
 29 |  product list item was purchased.
 30 | 
 31 | ### purchaseDate
 32 | 
 33 | **Type:** Date (Read Only)
 34 | 
 35 | The date on which the product list item was purchased.
 36 | 
 37 | ### purchaserName
 38 | 
 39 | **Type:** String (Read Only)
 40 | 
 41 | The name of the purchaser of the product list item.
 42 | 
 43 | ### quantity
 44 | 
 45 | **Type:** Quantity (Read Only)
 46 | 
 47 | The quantity of the product list item that was purchased.
 48 | 
 49 | ## Constructor Summary
 50 | 
 51 | ## Method Summary
 52 | 
 53 | ### getItem
 54 | 
 55 | **Signature:** `getItem() : ProductListItem`
 56 | 
 57 | Returns the item that was purchased.
 58 | 
 59 | ### getOrderNo
 60 | 
 61 | **Signature:** `getOrderNo() : String`
 62 | 
 63 | Returns the number of the order in which the product list item was purchased.
 64 | 
 65 | ### getPurchaseDate
 66 | 
 67 | **Signature:** `getPurchaseDate() : Date`
 68 | 
 69 | Returns the date on which the product list item was purchased.
 70 | 
 71 | ### getPurchaserName
 72 | 
 73 | **Signature:** `getPurchaserName() : String`
 74 | 
 75 | Returns the name of the purchaser of the product list item.
 76 | 
 77 | ### getQuantity
 78 | 
 79 | **Signature:** `getQuantity() : Quantity`
 80 | 
 81 | Returns the quantity of the product list item that was purchased.
 82 | 
 83 | ## Method Detail
 84 | 
 85 | ## Method Details
 86 | 
 87 | ### getItem
 88 | 
 89 | **Signature:** `getItem() : ProductListItem`
 90 | 
 91 | **Description:** Returns the item that was purchased.
 92 | 
 93 | **Returns:**
 94 | 
 95 | the item that was purchased.
 96 | 
 97 | ---
 98 | 
 99 | ### getOrderNo
100 | 
101 | **Signature:** `getOrderNo() : String`
102 | 
103 | **Description:** Returns the number of the order in which the product list item was purchased.
104 | 
105 | **Returns:**
106 | 
107 | the number of the order in which the product list item was purchased.
108 | 
109 | ---
110 | 
111 | ### getPurchaseDate
112 | 
113 | **Signature:** `getPurchaseDate() : Date`
114 | 
115 | **Description:** Returns the date on which the product list item was purchased.
116 | 
117 | **Returns:**
118 | 
119 | the date on which the product list item was purchased.
120 | 
121 | ---
122 | 
123 | ### getPurchaserName
124 | 
125 | **Signature:** `getPurchaserName() : String`
126 | 
127 | **Description:** Returns the name of the purchaser of the product list item.
128 | 
129 | **Returns:**
130 | 
131 | the name of the purchaser of the product list item.
132 | 
133 | ---
134 | 
135 | ### getQuantity
136 | 
137 | **Signature:** `getQuantity() : Quantity`
138 | 
139 | **Description:** Returns the quantity of the product list item that was purchased.
140 | 
141 | **Returns:**
142 | 
143 | the quantity of the product list item that was purchased.
144 | 
145 | ---
```

--------------------------------------------------------------------------------
/docs-site/components/StructuredData.tsx:
--------------------------------------------------------------------------------

```typescript
 1 | import React from 'react';
 2 | import { SITE_DATES } from '../constants';
 3 | 
 4 | interface StructuredDataProps {
 5 |   structuredData?: object;
 6 | }
 7 | 
 8 | const StructuredData: React.FC<StructuredDataProps> = ({ structuredData }) => {
 9 |   const combinedData = [
10 |     // Global Software Application Schema
11 |     {
12 |       "@context": "https://schema.org",
13 |       "@type": "SoftwareApplication",
14 |       "name": "SFCC Development MCP Server",
15 |       "applicationCategory": "DeveloperApplication",
16 |       "applicationSubCategory": "Development Tools",
17 |       "operatingSystem": "Node.js",
18 |       "description": "A Model Context Protocol server for Salesforce B2C Commerce Cloud development with AI-powered documentation access, log analysis, and development best practices.",
19 |       "url": "https://sfcc-mcp-dev.rhino-inquisitor.com/",
20 |       "downloadUrl": "https://www.npmjs.com/package/sfcc-dev-mcp",
21 |       "installUrl": "https://sfcc-mcp-dev.rhino-inquisitor.com/configuration/",
22 |       "softwareVersion": "1.0.0",
23 |       "datePublished": SITE_DATES.PUBLISHED,
24 |       "dateModified": SITE_DATES.MODIFIED,
25 |       "author": {
26 |         "@type": "Person",
27 |         "name": "Thomas Theunen",
28 |         "url": "https://github.com/taurgis"
29 |       },
30 |       "publisher": {
31 |         "@type": "Person",
32 |         "name": "Thomas Theunen"
33 |       },
34 |       "programmingLanguage": ["JavaScript", "TypeScript"],
35 |       "runtimePlatform": "Node.js",
36 |       "keywords": "SFCC, Salesforce Commerce Cloud, Model Context Protocol, MCP server, AI development tools, SFCC documentation, Commerce Cloud development",
37 |       "requirements": "Node.js 18+, npm",
38 |       "featureList": [
39 |         "SFCC API Documentation Access",
40 |         "Real-time Log Analysis", 
41 |         "System Object Exploration",
42 |         "Cartridge Generation",
43 |         "Best Practices Guides",
44 |         "AI Assistant Integration"
45 |       ],
46 |       "screenshot": "https://sfcc-mcp-dev.rhino-inquisitor.com/explain-product-pricing-methods.png",
47 |       "offers": {
48 |         "@type": "Offer",
49 |         "price": "0",
50 |         "priceCurrency": "USD",
51 |         "availability": "https://schema.org/InStock"
52 |       },
53 |       "license": "https://opensource.org/licenses/MIT",
54 |       "codeRepository": "https://github.com/taurgis/sfcc-dev-mcp",
55 |       "maintainer": {
56 |         "@type": "Person", 
57 |         "name": "Thomas Theunen"
58 |       }
59 |     },
60 |     // Page-specific structured data (if provided)
61 |     ...(structuredData ? [structuredData] : [])
62 |   ];
63 | 
64 |   return (
65 |     <script 
66 |       type="application/ld+json" 
67 |       dangerouslySetInnerHTML={{ __html: JSON.stringify(combinedData) }} 
68 |     />
69 |   );
70 | };
71 | 
72 | export default StructuredData;
```

--------------------------------------------------------------------------------
/docs/dw_crypto/JWSHeader.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: dw.crypto
  2 | 
  3 | # Class JWSHeader
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - dw.crypto.JWSHeader
  9 | 
 10 | ## Description
 11 | 
 12 | This class represents an immutable header of a JWS (JSON Web Signature) object.
 13 | 
 14 | ## Properties
 15 | 
 16 | ### algorithm
 17 | 
 18 | **Type:** String (Read Only)
 19 | 
 20 | Get the value of the algorithm parameter (alg).
 21 | 
 22 | ## Constructor Summary
 23 | 
 24 | ## Method Summary
 25 | 
 26 | ### getAlgorithm
 27 | 
 28 | **Signature:** `getAlgorithm() : String`
 29 | 
 30 | Get the value of the algorithm parameter (alg).
 31 | 
 32 | ### parse
 33 | 
 34 | **Signature:** `static parse(map : Object) : JWSHeader`
 35 | 
 36 | Convert the given Map or JavaScript object into a JWS header.
 37 | 
 38 | ### parseEncoded
 39 | 
 40 | **Signature:** `static parseEncoded(base64encoded : String) : JWSHeader`
 41 | 
 42 | Parse the given string as a Base64URL-encoded JWS header.
 43 | 
 44 | ### parseJSON
 45 | 
 46 | **Signature:** `static parseJSON(json : String) : JWSHeader`
 47 | 
 48 | Parse the given string as a JWS header.
 49 | 
 50 | ### toMap
 51 | 
 52 | **Signature:** `toMap() : Map`
 53 | 
 54 | Get a copy of these headers as a Map.
 55 | 
 56 | ### toString
 57 | 
 58 | **Signature:** `toString() : String`
 59 | 
 60 | Get the content of the headers as a JSON String.
 61 | 
 62 | ## Method Detail
 63 | 
 64 | ## Method Details
 65 | 
 66 | ### getAlgorithm
 67 | 
 68 | **Signature:** `getAlgorithm() : String`
 69 | 
 70 | **Description:** Get the value of the algorithm parameter (alg).
 71 | 
 72 | **Returns:**
 73 | 
 74 | Algorithm parameter from this header.
 75 | 
 76 | ---
 77 | 
 78 | ### parse
 79 | 
 80 | **Signature:** `static parse(map : Object) : JWSHeader`
 81 | 
 82 | **Description:** Convert the given Map or JavaScript object into a JWS header. All keys correspond to JWS parameters. The algorithm parameter (alg) is required. See JWS.verify(CertificateRef) for supported values.
 83 | 
 84 | **Parameters:**
 85 | 
 86 | - `map`: Map or object data to convert.
 87 | 
 88 | **Returns:**
 89 | 
 90 | JWS Header.
 91 | 
 92 | ---
 93 | 
 94 | ### parseEncoded
 95 | 
 96 | **Signature:** `static parseEncoded(base64encoded : String) : JWSHeader`
 97 | 
 98 | **Description:** Parse the given string as a Base64URL-encoded JWS header. The algorithm parameter (alg) is required. See JWS.verify(CertificateRef) for supported values.
 99 | 
100 | **Parameters:**
101 | 
102 | - `base64encoded`: Base64URL string to parse.
103 | 
104 | **Returns:**
105 | 
106 | JWS Header.
107 | 
108 | ---
109 | 
110 | ### parseJSON
111 | 
112 | **Signature:** `static parseJSON(json : String) : JWSHeader`
113 | 
114 | **Description:** Parse the given string as a JWS header. The algorithm parameter (alg) is required. See JWS.verify(CertificateRef) for supported values.
115 | 
116 | **Parameters:**
117 | 
118 | - `json`: JSON string to parse.
119 | 
120 | **Returns:**
121 | 
122 | JWS Header.
123 | 
124 | ---
125 | 
126 | ### toMap
127 | 
128 | **Signature:** `toMap() : Map`
129 | 
130 | **Description:** Get a copy of these headers as a Map.
131 | 
132 | **Returns:**
133 | 
134 | Copy of the JWS headers.
135 | 
136 | ---
137 | 
138 | ### toString
139 | 
140 | **Signature:** `toString() : String`
141 | 
142 | **Description:** Get the content of the headers as a JSON String.
143 | 
144 | **Returns:**
145 | 
146 | JSON String.
147 | 
148 | ---
```

--------------------------------------------------------------------------------
/docs/dw_svc/ServiceCredential.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: dw.svc
  2 | 
  3 | # Class ServiceCredential
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - dw.object.PersistentObject
  9 |   - dw.object.ExtensibleObject
 10 |     - dw.customer.EncryptedObject
 11 |       - dw.svc.ServiceCredential
 12 | 
 13 | ## Description
 14 | 
 15 | Configuration object for Service Credentials.
 16 | 
 17 | ## Constants
 18 | 
 19 | ### ENCRYPTION_ALGORITHM_RSA
 20 | 
 21 | **Type:** String = "RSA"
 22 | 
 23 | Constant for specification of the public key encryption algorithm RSA.
 24 | 
 25 | ## Properties
 26 | 
 27 | ### ID
 28 | 
 29 | **Type:** String (Read Only)
 30 | 
 31 | The unique Credential ID.
 32 | 
 33 | ### password
 34 | 
 35 | **Type:** String (Read Only)
 36 | 
 37 | The Password in plain text.
 38 | 
 39 | ### URL
 40 | 
 41 | **Type:** String (Read Only)
 42 | 
 43 | Return the URL.
 44 | 
 45 | ### user
 46 | 
 47 | **Type:** String (Read Only)
 48 | 
 49 | The User ID.
 50 | 
 51 | ## Constructor Summary
 52 | 
 53 | ## Method Summary
 54 | 
 55 | ### getEncryptedPassword
 56 | 
 57 | **Signature:** `getEncryptedPassword(algorithm : String, publicKey : CertificateRef) : String`
 58 | 
 59 | Encrypts the password from this object with the given algorithm and the public key taken from a certificate in the keystore.
 60 | 
 61 | ### getID
 62 | 
 63 | **Signature:** `getID() : String`
 64 | 
 65 | Returns the unique Credential ID.
 66 | 
 67 | ### getPassword
 68 | 
 69 | **Signature:** `getPassword() : String`
 70 | 
 71 | Returns the Password in plain text.
 72 | 
 73 | ### getURL
 74 | 
 75 | **Signature:** `getURL() : String`
 76 | 
 77 | Return the URL.
 78 | 
 79 | ### getUser
 80 | 
 81 | **Signature:** `getUser() : String`
 82 | 
 83 | Returns the User ID.
 84 | 
 85 | ## Method Detail
 86 | 
 87 | ## Method Details
 88 | 
 89 | ### getEncryptedPassword
 90 | 
 91 | **Signature:** `getEncryptedPassword(algorithm : String, publicKey : CertificateRef) : String`
 92 | 
 93 | **Description:** Encrypts the password from this object with the given algorithm and the public key taken from a certificate in the keystore. Returned is the base64-encoded representation of the result. See also Cipher.encrypt(String, CertificateRef, String, String, Number) on how to generate RSA key pairs.
 94 | 
 95 | **Deprecated:**
 96 | 
 97 | Use Cipher to encrypt data as needed.
 98 | 
 99 | **Parameters:**
100 | 
101 | - `algorithm`: The algorithm to be used for the encryption of this password. Currently only "RSA" is supported.
102 | - `publicKey`: A reference to a trusted certificate entry containing the public key in the keystore.
103 | 
104 | **Returns:**
105 | 
106 | the base64-encoded representation of the password.
107 | 
108 | ---
109 | 
110 | ### getID
111 | 
112 | **Signature:** `getID() : String`
113 | 
114 | **Description:** Returns the unique Credential ID.
115 | 
116 | **Returns:**
117 | 
118 | unique Credential ID.
119 | 
120 | ---
121 | 
122 | ### getPassword
123 | 
124 | **Signature:** `getPassword() : String`
125 | 
126 | **Description:** Returns the Password in plain text.
127 | 
128 | **Returns:**
129 | 
130 | Password.
131 | 
132 | ---
133 | 
134 | ### getURL
135 | 
136 | **Signature:** `getURL() : String`
137 | 
138 | **Description:** Return the URL.
139 | 
140 | **Returns:**
141 | 
142 | URL.
143 | 
144 | ---
145 | 
146 | ### getUser
147 | 
148 | **Signature:** `getUser() : String`
149 | 
150 | **Description:** Returns the User ID.
151 | 
152 | **Returns:**
153 | 
154 | User ID.
155 | 
156 | ---
```

--------------------------------------------------------------------------------
/tests/mcp/yaml/list-log-files.full-mode.test.mcp.yml:
--------------------------------------------------------------------------------

```yaml
 1 | ---
 2 | description: "Test list_log_files tool in full mode - Optimized for aegis framework testing"
 3 | tests:
 4 |   # Core MCP protocol validation
 5 |   - it: "should return valid MCP response with log file metadata"
 6 |     request:
 7 |       jsonrpc: "2.0"
 8 |       id: "list-files-basic"
 9 |       method: "tools/call"
10 |       params:
11 |         name: "list_log_files"
12 |         arguments: {}
13 |     expect:
14 |       response:
15 |         jsonrpc: "2.0"
16 |         id: "list-files-basic"
17 |         result:
18 |           content:
19 |             match:arrayElements:
20 |               match:partial:
21 |                 type: "text"
22 |                 text: "match:contains:Available log files"
23 |           isError: false
24 |       stderr: "toBeEmpty"
25 |     performance:
26 |       maxResponseTime: "2000ms"
27 | 
28 |   # SFCC log pattern validation (combined test for all log levels)
29 |   - it: "should include all SFCC log levels with correct naming patterns"
30 |     request:
31 |       jsonrpc: "2.0"
32 |       id: "list-files-patterns"
33 |       method: "tools/call"
34 |       params:
35 |         name: "list_log_files"
36 |         arguments: {}
37 |     expect:
38 |       response:
39 |         jsonrpc: "2.0"
40 |         id: "list-files-patterns"
41 |         result:
42 |           content:
43 |             match:arrayElements:
44 |               match:partial:
45 |                 text: "match:regex:(debug|error|info|warn)-blade-[\\d]{8}-[\\d]{6}\\.log"
46 |           isError: false
47 |       stderr: "toBeEmpty"
48 | 
49 |   # Comprehensive metadata validation (combined size and timestamp test)
50 |   - it: "should include complete file metadata with proper formatting"
51 |     request:
52 |       jsonrpc: "2.0"
53 |       id: "list-files-metadata"
54 |       method: "tools/call"
55 |       params:
56 |         name: "list_log_files"
57 |         arguments: {}
58 |     expect:
59 |       response:
60 |         jsonrpc: "2.0"
61 |         id: "list-files-metadata"
62 |         result:
63 |           content:
64 |             match:arrayElements:
65 |               match:partial:
66 |                 text: "match:regex:📄 \\/[\\w-]+\\.log[\\s\\S]*Size: [\\d.,]+ (Bytes|KB|MB)[\\s\\S]*Modified: [A-Za-z]{3}, [\\d]{1,2} [A-Za-z]{3} [\\d]{4} [\\d]{2}:[\\d]{2}:[\\d]{2} GMT"
67 |           isError: false
68 |       stderr: "toBeEmpty"
69 | 
70 |   # Parameter handling (simple edge case for aegis testing)
71 |   - it: "should handle empty arguments gracefully"
72 |     request:
73 |       jsonrpc: "2.0"
74 |       id: "list-files-empty-args"
75 |       method: "tools/call"
76 |       params:
77 |         name: "list_log_files"
78 |         arguments: {}
79 |     expect:
80 |       response:
81 |         jsonrpc: "2.0"
82 |         id: "list-files-empty-args"
83 |         result:
84 |           content:
85 |             match:arrayElements:
86 |               type: "text"
87 |               text: "match:type:string"
88 |           isError: false
89 |       stderr: "toBeEmpty"
90 | 
```

--------------------------------------------------------------------------------
/docs/dw_catalog/SearchRefinementDefinition.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: dw.catalog
  2 | 
  3 | # Class SearchRefinementDefinition
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - dw.object.PersistentObject
  9 |   - dw.object.ExtensibleObject
 10 |     - dw.catalog.SearchRefinementDefinition
 11 | 
 12 | ## Description
 13 | 
 14 | Common search refinement definition base class.
 15 | 
 16 | ## Properties
 17 | 
 18 | ### attributeID
 19 | 
 20 | **Type:** String (Read Only)
 21 | 
 22 | The attribute ID. If the refinement definition is not an
 23 |  attribute refinement, the method returns an empty string.
 24 | 
 25 | ### attributeRefinement
 26 | 
 27 | **Type:** boolean (Read Only)
 28 | 
 29 | Identifies if this is an attribute refinement.
 30 | 
 31 | ### cutoffThreshold
 32 | 
 33 | **Type:** Number (Read Only)
 34 | 
 35 | The cut-off threshold.
 36 | 
 37 | ### displayName
 38 | 
 39 | **Type:** String (Read Only)
 40 | 
 41 | The display name.
 42 | 
 43 | ### valueTypeCode
 44 | 
 45 | **Type:** Number (Read Only)
 46 | 
 47 | A code for the data type used for this search refinement definition. See constants
 48 |  defined in ObjectAttributeDefinition.
 49 | 
 50 | ## Constructor Summary
 51 | 
 52 | ## Method Summary
 53 | 
 54 | ### getAttributeID
 55 | 
 56 | **Signature:** `getAttributeID() : String`
 57 | 
 58 | Returns the attribute ID.
 59 | 
 60 | ### getCutoffThreshold
 61 | 
 62 | **Signature:** `getCutoffThreshold() : Number`
 63 | 
 64 | Returns the cut-off threshold.
 65 | 
 66 | ### getDisplayName
 67 | 
 68 | **Signature:** `getDisplayName() : String`
 69 | 
 70 | Returns the display name.
 71 | 
 72 | ### getValueTypeCode
 73 | 
 74 | **Signature:** `getValueTypeCode() : Number`
 75 | 
 76 | Returns a code for the data type used for this search refinement definition.
 77 | 
 78 | ### isAttributeRefinement
 79 | 
 80 | **Signature:** `isAttributeRefinement() : boolean`
 81 | 
 82 | Identifies if this is an attribute refinement.
 83 | 
 84 | ## Method Detail
 85 | 
 86 | ## Method Details
 87 | 
 88 | ### getAttributeID
 89 | 
 90 | **Signature:** `getAttributeID() : String`
 91 | 
 92 | **Description:** Returns the attribute ID. If the refinement definition is not an attribute refinement, the method returns an empty string.
 93 | 
 94 | **Returns:**
 95 | 
 96 | the attribute ID.
 97 | 
 98 | ---
 99 | 
100 | ### getCutoffThreshold
101 | 
102 | **Signature:** `getCutoffThreshold() : Number`
103 | 
104 | **Description:** Returns the cut-off threshold.
105 | 
106 | **Returns:**
107 | 
108 | the cut-off threshold.
109 | 
110 | ---
111 | 
112 | ### getDisplayName
113 | 
114 | **Signature:** `getDisplayName() : String`
115 | 
116 | **Description:** Returns the display name.
117 | 
118 | **Returns:**
119 | 
120 | the display name.
121 | 
122 | ---
123 | 
124 | ### getValueTypeCode
125 | 
126 | **Signature:** `getValueTypeCode() : Number`
127 | 
128 | **Description:** Returns a code for the data type used for this search refinement definition. See constants defined in ObjectAttributeDefinition.
129 | 
130 | **Returns:**
131 | 
132 | a code for the data type used for this search refinement definition. See constants defined in ObjectAttributeDefinition.
133 | 
134 | ---
135 | 
136 | ### isAttributeRefinement
137 | 
138 | **Signature:** `isAttributeRefinement() : boolean`
139 | 
140 | **Description:** Identifies if this is an attribute refinement.
141 | 
142 | **Returns:**
143 | 
144 | true if this is an attribute refinement, false otherwise.
145 | 
146 | ---
```

--------------------------------------------------------------------------------
/docs/dw_suggest/SearchPhraseSuggestions.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: dw.suggest
  2 | 
  3 | # Class SearchPhraseSuggestions
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - dw.suggest.SearchPhraseSuggestions
  9 | 
 10 | ## Description
 11 | 
 12 | The search phrase suggestions contain a list of suggested search phrases (see SuggestedPhrase) as well as, for each of the search phrase terms, a list with corrected and completed alternative terms.
 13 | 
 14 | ## Properties
 15 | 
 16 | ### suggestedPhrases
 17 | 
 18 | **Type:** Iterator (Read Only)
 19 | 
 20 | A list of SuggestedPhrase objects that relates to the
 21 |  user input search phrase.
 22 | 
 23 | ### suggestedTerms
 24 | 
 25 | **Type:** Iterator (Read Only)
 26 | 
 27 | A list of SuggestedTerms objects. Each of the returned
 28 |  instances represents a set of terms suggested for a particular single term
 29 |  of the user input search phrase.
 30 | 
 31 | ## Constructor Summary
 32 | 
 33 | ## Method Summary
 34 | 
 35 | ### getSuggestedPhrases
 36 | 
 37 | **Signature:** `getSuggestedPhrases() : Iterator`
 38 | 
 39 | Returns a list of SuggestedPhrase objects that relates to the user input search phrase.
 40 | 
 41 | ### getSuggestedTerms
 42 | 
 43 | **Signature:** `getSuggestedTerms() : Iterator`
 44 | 
 45 | Returns a list of SuggestedTerms objects.
 46 | 
 47 | ### hasSuggestedPhrases
 48 | 
 49 | **Signature:** `hasSuggestedPhrases() : boolean`
 50 | 
 51 | Returns whether this suggestions container has any suggested phrases.
 52 | 
 53 | ### hasSuggestedTerms
 54 | 
 55 | **Signature:** `hasSuggestedTerms() : boolean`
 56 | 
 57 | Returns whether this suggestions container has any suggested terms.
 58 | 
 59 | ## Method Detail
 60 | 
 61 | ## Method Details
 62 | 
 63 | ### getSuggestedPhrases
 64 | 
 65 | **Signature:** `getSuggestedPhrases() : Iterator`
 66 | 
 67 | **Description:** Returns a list of SuggestedPhrase objects that relates to the user input search phrase.
 68 | 
 69 | **Returns:**
 70 | 
 71 | a list of SuggestedPhrases
 72 | 
 73 | **See Also:**
 74 | 
 75 | hasSuggestedPhrases()
 76 | 
 77 | ---
 78 | 
 79 | ### getSuggestedTerms
 80 | 
 81 | **Signature:** `getSuggestedTerms() : Iterator`
 82 | 
 83 | **Description:** Returns a list of SuggestedTerms objects. Each of the returned instances represents a set of terms suggested for a particular single term of the user input search phrase.
 84 | 
 85 | **Returns:**
 86 | 
 87 | a list of SuggestedTerms for each term of the user input search phrase
 88 | 
 89 | **See Also:**
 90 | 
 91 | hasSuggestedTerms()
 92 | 
 93 | ---
 94 | 
 95 | ### hasSuggestedPhrases
 96 | 
 97 | **Signature:** `hasSuggestedPhrases() : boolean`
 98 | 
 99 | **Description:** Returns whether this suggestions container has any suggested phrases. Note that this method only looks for suggested phrases. It does not account for suggested terms.
100 | 
101 | **Returns:**
102 | 
103 | true only if there are phrases available
104 | 
105 | ---
106 | 
107 | ### hasSuggestedTerms
108 | 
109 | **Signature:** `hasSuggestedTerms() : boolean`
110 | 
111 | **Description:** Returns whether this suggestions container has any suggested terms. Note that this method checks suggested terms only, but not suggested phrases.
112 | 
113 | **Returns:**
114 | 
115 | true only if there are terms available
116 | 
117 | ---
```

--------------------------------------------------------------------------------
/docs-site/index.html:
--------------------------------------------------------------------------------

```html
 1 | 
 2 | <!DOCTYPE html>
 3 | <html lang="en">
 4 |   <head>
 5 |     <meta charset="UTF-8" />
 6 |     <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
 7 |     <meta http-equiv="X-UA-Compatible" content="IE=edge" />
 8 |     
 9 |     <!-- Search Engine Specific -->
10 |     <meta name="googlebot" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" />
11 |     
12 |     <!-- Favicons -->
13 |     <link rel="icon" type="image/x-icon" href="/favicon.ico" />
14 |     <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
15 |     <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
16 |     <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
17 |     <link rel="icon" type="image/png" sizes="192x192" href="/android-chrome-192x192.png" />
18 |     <link rel="icon" type="image/png" sizes="512x512" href="/android-chrome-512x512.png" />
19 |     
20 |     <!-- Web App Manifest -->
21 |     <link rel="manifest" href="/site.webmanifest" />
22 |     
23 |     <!-- Import Map - Must come before module scripts -->
24 |     <script type="importmap">
25 | {
26 |   "imports": {
27 |     "react/": "https://aistudiocdn.com/react@^19.1.1/",
28 |     "react": "https://aistudiocdn.com/react@^19.1.1",
29 |     "react-dom/": "https://aistudiocdn.com/react-dom@^19.1.1/",
30 |     "react-router-dom": "https://aistudiocdn.com/react-router-dom@^7.8.2"
31 |   }
32 | }
33 | </script>
34 |     
35 |     <link rel="preload" href="/main.tsx" as="script" crossorigin />
36 |     <link rel="modulepreload" href="/main.tsx" />
37 |     
38 |     <!-- Critical CSS -->
39 |     <style>
40 |       body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; }
41 |       .loading { display: flex; justify-content: center; align-items: center; height: 100vh; }
42 |     </style>
43 |     
44 |     <!-- Additional SEO -->
45 |     <meta name="theme-color" content="#2563eb" />
46 |     <meta name="msapplication-TileColor" content="#2563eb" />
47 |     <meta name="format-detection" content="telephone=no" />
48 |     <meta name="color-scheme" content="light" />
49 |     <meta name="mobile-web-app-capable" content="yes" />
50 | 
51 | </head>
52 |   <body class="bg-white">
53 |     <div id="root" role="application" aria-label="SFCC Development MCP Server Documentation"></div>
54 |     <noscript>
55 |       <div style="text-align: center; padding: 50px; font-family: system-ui;">
56 |         <h1>JavaScript Required</h1>
57 |         <p>This documentation site requires JavaScript to function properly. Please enable JavaScript in your browser and refresh the page.</p>
58 |       </div>
59 |     </noscript>
60 |     <script type="module" src="/main.tsx"></script>
61 |   </body>
62 | </html>
63 | 
```

--------------------------------------------------------------------------------
/docs/dw_extensions.pinterest/PinterestFeedHooks.md:
--------------------------------------------------------------------------------

```markdown
 1 | ## Package: dw.extensions.pinterest
 2 | 
 3 | # Class PinterestFeedHooks
 4 | 
 5 | ## Inheritance Hierarchy
 6 | 
 7 | - dw.extensions.pinterest.PinterestFeedHooks
 8 | 
 9 | ## Description
10 | 
11 | PinterestFeedHooks interface containing extension points for customizing Pinterest export feeds. These hooks are not executed in a transaction. The extension points (hook names), and the functions that are called by each extension point. A function must be defined inside a JavaScript source and must be exported. The script with the exported hook function must be located inside a site cartridge. Inside the site cartridge a 'package.json' file with a 'hooks' entry must exist. "hooks": "./hooks.json" The hooks entry links to a json file, relative to the 'package.json' file. This file lists all registered hooks inside the hooks property: "hooks": [ {"name": "dw.extensions.pinterest.feed.transformProduct", "script": "./hooks.ds"} ] A hook entry has a 'name' and a 'script' property. The 'name' contains the extension point, the hook name. The 'script' contains the script relative to the hooks file, with the exported hook function.
12 | 
13 | ## Constants
14 | 
15 | ## Properties
16 | 
17 | ## Constructor Summary
18 | 
19 | ## Method Summary
20 | 
21 | ### transformAvailability
22 | 
23 | **Signature:** `transformAvailability(product : Product, pinterestAvailability : PinterestAvailability) : Status`
24 | 
25 | Called after default transformation of given Demandware product to Pinterest availability as part of the availability feed export.
26 | 
27 | ### transformProduct
28 | 
29 | **Signature:** `transformProduct(product : Product, pinterestProduct : PinterestProduct) : Status`
30 | 
31 | Called after default transformation of given Demandware product to Pinterest product as part of the catalog feed export.
32 | 
33 | ## Method Detail
34 | 
35 | ## Method Details
36 | 
37 | ### transformAvailability
38 | 
39 | **Signature:** `transformAvailability(product : Product, pinterestAvailability : PinterestAvailability) : Status`
40 | 
41 | **Description:** Called after default transformation of given Demandware product to Pinterest availability as part of the availability feed export.
42 | 
43 | **Parameters:**
44 | 
45 | - `product`: the Demandware product
46 | - `pinterestAvailability`: the Pinterest representation of the product availability
47 | 
48 | **Returns:**
49 | 
50 | a non-null Status ends the hook execution
51 | 
52 | ---
53 | 
54 | ### transformProduct
55 | 
56 | **Signature:** `transformProduct(product : Product, pinterestProduct : PinterestProduct) : Status`
57 | 
58 | **Description:** Called after default transformation of given Demandware product to Pinterest product as part of the catalog feed export.
59 | 
60 | **Parameters:**
61 | 
62 | - `product`: the Demandware product
63 | - `pinterestProduct`: the Pinterest representation of the product
64 | 
65 | **Returns:**
66 | 
67 | a non-null Status ends the hook execution
68 | 
69 | ---
```

--------------------------------------------------------------------------------
/docs/TopLevel/Uint8ClampedArray.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: TopLevel
  2 | 
  3 | # Class Uint8ClampedArray
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - Uint8ClampedArray
  9 | 
 10 | ## Description
 11 | 
 12 | An optimized array to store 8-bit unsigned integer numbers. If a value outside of the range 0-255 is attempted to be set, either 0 or 255 is set instead. Elements of this array are stored in an ArrayBuffer object.
 13 | 
 14 | ## Constants
 15 | 
 16 | ### BYTES_PER_ELEMENT
 17 | 
 18 | **Type:** Number = 1
 19 | 
 20 | Number value of the element size.
 21 | 
 22 | ## Properties
 23 | 
 24 | ### buffer
 25 | 
 26 | **Type:** ArrayBuffer
 27 | 
 28 | The array buffer referenced by this typed array.
 29 | 
 30 | ### byteLength
 31 | 
 32 | **Type:** Number
 33 | 
 34 | The number of bytes in the array buffer used by this typed array.
 35 | 
 36 | ### byteOffset
 37 | 
 38 | **Type:** Number
 39 | 
 40 | The start offset for this typed array within the array buffer.
 41 | 
 42 | ### length
 43 | 
 44 | **Type:** Number
 45 | 
 46 | The number of elements.
 47 | 
 48 | ## Constructor Summary
 49 | 
 50 | Uint8ClampedArray() Creates an empty array.
 51 | 
 52 | Uint8ClampedArray(length : Number) Creates an array with the given element count.
 53 | 
 54 | Uint8ClampedArray(typedArray : Object) Creates an array as a copy of the passed typed array.
 55 | 
 56 | Uint8ClampedArray(array : Array) Creates an array as a copy of the passed array.
 57 | 
 58 | Uint8ClampedArray(buffer : ArrayBuffer, byteOffset : Number, length : Number) Creates a typed array as a view on the given ArrayBuffer.
 59 | 
 60 | ## Method Summary
 61 | 
 62 | ### get
 63 | 
 64 | **Signature:** `get(index : Number) : Number`
 65 | 
 66 | Returns the value at the specified index.
 67 | 
 68 | ### set
 69 | 
 70 | **Signature:** `set(values : Object, offset : Number) : void`
 71 | 
 72 | Copies all values from the source array into this typed array.
 73 | 
 74 | ### subarray
 75 | 
 76 | **Signature:** `subarray(begin : Number, end : Number) : Uint8ClampedArray`
 77 | 
 78 | Returns a new array object based on the same ArrayBuffer store.
 79 | 
 80 | ## Constructor Detail
 81 | 
 82 | ## Method Detail
 83 | 
 84 | ## Method Details
 85 | 
 86 | ### get
 87 | 
 88 | **Signature:** `get(index : Number) : Number`
 89 | 
 90 | **Description:** Returns the value at the specified index. Note: This is not ECMAScript standard. Use array element access syntax for single value access.
 91 | 
 92 | **Parameters:**
 93 | 
 94 | - `index`: The index to use.
 95 | 
 96 | **Returns:**
 97 | 
 98 | The value at the specified index.
 99 | 
100 | ---
101 | 
102 | ### set
103 | 
104 | **Signature:** `set(values : Object, offset : Number) : void`
105 | 
106 | **Description:** Copies all values from the source array into this typed array.
107 | 
108 | **Parameters:**
109 | 
110 | - `values`: The source values. Can be an array or a typed array.
111 | - `offset`: Optional. Target offset.
112 | 
113 | ---
114 | 
115 | ### subarray
116 | 
117 | **Signature:** `subarray(begin : Number, end : Number) : Uint8ClampedArray`
118 | 
119 | **Description:** Returns a new array object based on the same ArrayBuffer store.
120 | 
121 | **Parameters:**
122 | 
123 | - `begin`: Optional. The first included element.
124 | - `end`: Optional. The index of the end. This element is not included.
125 | 
126 | **Returns:**
127 | 
128 | The new array object.
129 | 
130 | ---
```

--------------------------------------------------------------------------------
/src/clients/logs/webdav-client-manager.ts:
--------------------------------------------------------------------------------

```typescript
 1 | /**
 2 |  * WebDAV client setup and authentication management
 3 |  */
 4 | 
 5 | import { createClient } from 'webdav';
 6 | import type { WebDAVClient } from 'webdav';
 7 | import { Logger } from '../../utils/logger.js';
 8 | import type { WebDAVClientConfig } from './log-types.js';
 9 | 
10 | export class WebDAVClientManager {
11 |   private logger: Logger;
12 |   private client: WebDAVClient | null = null;
13 | 
14 |   constructor(logger: Logger) {
15 |     this.logger = logger;
16 |   }
17 | 
18 |   /**
19 |    * Setup and configure WebDAV client with authentication
20 |    */
21 |   setupClient(config: WebDAVClientConfig): WebDAVClient {
22 |     let protocol = 'https';
23 | 
24 |     if (config.hostname.startsWith('localhost') || config.hostname.startsWith('127.0.0.1')) {
25 |       protocol = 'http';
26 |     }
27 | 
28 |     const webdavUrl = `${protocol}://${config.hostname}/on/demandware.servlet/webdav/Sites/Logs/`;
29 |     this.logger.debug('Setting up WebDAV client:', { hostname: config.hostname, url: webdavUrl });
30 | 
31 |     const authConfig = this.buildAuthConfig(config);
32 | 
33 |     // Add timeout configuration for better CI compatibility
34 |     const clientConfig = {
35 |       ...authConfig,
36 |       timeout: 30000, // 30 second timeout (generous for CI environments)
37 |       maxBodyLength: 10 * 1024 * 1024, // 10MB max body length
38 |       maxContentLength: 10 * 1024 * 1024, // 10MB max content length
39 |     };
40 | 
41 |     this.client = createClient(webdavUrl, clientConfig);
42 | 
43 |     return this.client;
44 |   }
45 | 
46 |   /**
47 |    * Get the current WebDAV client instance
48 |    */
49 |   getClient(): WebDAVClient {
50 |     if (!this.client) {
51 |       throw new Error('WebDAV client not initialized. Call setupClient() first.');
52 |     }
53 |     return this.client;
54 |   }
55 | 
56 |   /**
57 |    * Build authentication configuration for WebDAV client
58 |    */
59 |   private buildAuthConfig(config: WebDAVClientConfig): any {
60 |     if (config.username && config.password) {
61 |       this.logger.debug('Using basic authentication');
62 |       return {
63 |         username: config.username,
64 |         password: config.password,
65 |       };
66 |     }
67 | 
68 |     if (config.clientId && config.clientSecret) {
69 |       this.logger.debug('Using OAuth authentication (client credentials as basic auth for WebDAV)');
70 |       return {
71 |         username: config.clientId,
72 |         password: config.clientSecret,
73 |       };
74 |     }
75 | 
76 |     throw new Error('Either username/password or clientId/clientSecret must be provided');
77 |   }
78 | 
79 |   /**
80 |    * Test WebDAV connection
81 |    */
82 |   async testConnection(): Promise<boolean> {
83 |     try {
84 |       const client = this.getClient();
85 |       await client.getDirectoryContents('/');
86 |       this.logger.debug('WebDAV connection test successful');
87 |       return true;
88 |     } catch (error) {
89 |       this.logger.error('WebDAV connection test failed:', error);
90 |       return false;
91 |     }
92 |   }
93 | }
94 | 
```

--------------------------------------------------------------------------------
/docs/sfra/address.md:
--------------------------------------------------------------------------------

```markdown
 1 | # SFRA Address Model
 2 | 
 3 | ## Overview
 4 | 
 5 | The Address model represents an order address or customer address in SFRA applications. It provides a standardized way to handle address information across the application.
 6 | 
 7 | ## Constructor
 8 | 
 9 | ```javascript
10 | function address(addressObject)
11 | ```
12 | 
13 | Creates an Address model instance from an address object.
14 | 
15 | ### Parameters
16 | 
17 | - `addressObject` (dw.order.OrderAddress) - User's address object from the API
18 | 
19 | ## Properties
20 | 
21 | ### address
22 | **Type:** Object | null
23 | 
24 | Contains the formatted address information with the following properties:
25 | 
26 | - `address1` (string) - Primary address line
27 | - `address2` (string) - Secondary address line
28 | - `city` (string) - City name
29 | - `firstName` (string) - First name
30 | - `lastName` (string) - Last name
31 | - `ID` (string | null) - Address ID
32 | - `addressId` (string | null) - Address identifier (same as ID)
33 | - `phone` (string) - Phone number
34 | - `postalCode` (string) - Postal/ZIP code
35 | - `stateCode` (string) - State or province code
36 | - `jobTitle` (string) - Job title
37 | - `postBox` (string) - Post office box
38 | - `salutation` (string) - Salutation (Mr., Mrs., etc.)
39 | - `secondName` (string) - Second/middle name
40 | - `companyName` (string) - Company name
41 | - `suffix` (string) - Name suffix
42 | - `suite` (string) - Suite number
43 | - `title` (string) - Title
44 | - `countryCode` (Object) - Country code object with:
45 |   - `displayValue` (string) - Display name of country
46 |   - `value` (string) - Country code in uppercase
47 | 
48 | ## Helper Functions
49 | 
50 | ### createAddressObject(addressObject)
51 | Creates a plain object containing standardized address information.
52 | 
53 | **Parameters:**
54 | - `addressObject` (dw.order.OrderAddress) - Address object from the API
55 | 
56 | **Returns:** Object | null - Formatted address object or null if no address provided
57 | 
58 | ## Usage Example
59 | 
60 | ```javascript
61 | var AddressModel = require('*/cartridge/models/address');
62 | 
63 | // Create address model from API address object
64 | var customerAddress = customer.addressBook.preferredAddress;
65 | var addressModel = new AddressModel(customerAddress);
66 | 
67 | // Access address properties
68 | console.log(addressModel.address.firstName);
69 | console.log(addressModel.address.city);
70 | console.log(addressModel.address.countryCode.value);
71 | ```
72 | 
73 | ## Notes
74 | 
75 | - If `stateCode` is 'undefined', it will be converted to an empty string
76 | - Country codes are automatically converted to uppercase
77 | - The model handles both customer addresses and order addresses
78 | - All address fields are optional and may be null or empty strings
79 | 
80 | ## Related Models
81 | 
82 | - **Account Model** - Uses Address model for customer addresses
83 | - **Checkout Models** - Use Address model for billing and shipping addresses
84 | - **Order Models** - Use Address model for order address information
85 | 
```

--------------------------------------------------------------------------------
/tests/servers/sfcc-mock-server/mock-data/ocapi/system-object-attribute-groups-sitepreferences.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "_v": "23.2",
 3 |   "_type": "object_attribute_group_search_result",
 4 |   "count": 8,
 5 |   "hits": [
 6 |     {
 7 |       "_type": "object_attribute_group",
 8 |       "_resource_state": "250db50d76a5e4bf869062a6ed5aab18d77aed015a880e4f0f5b8e86cc8e071d",
 9 |       "id": "CCV",
10 |       "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/CCV"
11 |     },
12 |     {
13 |       "_type": "object_attribute_group",
14 |       "_resource_state": "34dce900d8eb50d95d97fcc0fd74449e78720a0da5a6804e561f347d8fdb5227",
15 |       "id": "SFRA Unified Feature Cartridge",
16 |       "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/SFRA%20Unified%20Feature%20Cartridge"
17 |     },
18 |     {
19 |       "_type": "object_attribute_group",
20 |       "_resource_state": "0d4f2e59140361592a0e6998fdd68bacc4f06e4fb77cb25fef07142f8289fb0e",
21 |       "id": "Storefront Configs",
22 |       "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/Storefront%20Configs"
23 |     },
24 |     {
25 |       "_type": "object_attribute_group",
26 |       "_resource_state": "07d4d8544eb98d9036cfd6343d55206374c44f0438c1beb22a88f0ad6cc1089c",
27 |       "id": "fastforward",
28 |       "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/fastforward"
29 |     },
30 |     {
31 |       "_type": "object_attribute_group",
32 |       "_resource_state": "bbcd6304068fcf391c849bb37952598bebed1bd55bafbe211e2a6539b4b522a9",
33 |       "id": "fastforward_cquotient",
34 |       "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/fastforward_cquotient"
35 |     },
36 |     {
37 |       "_type": "object_attribute_group",
38 |       "_resource_state": "efb6bd1843b9484576c8ffaf9447bc7d0bdee5bb6b0e9231d54804dbff5a11fa",
39 |       "id": "ffGPT",
40 |       "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/ffGPT"
41 |     },
42 |     {
43 |       "_type": "object_attribute_group",
44 |       "_resource_state": "ed156d5f2de1fbbea7fa8350da7b2424feb7e54ac4e338d50fd6fec992df2c6f",
45 |       "id": "google",
46 |       "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/google"
47 |     },
48 |     {
49 |       "_type": "object_attribute_group",
50 |       "_resource_state": "ec6e9f8a42c38f4a6b003b1e93b879c62bc6cd2ee639ef482509c55a3d579959",
51 |       "id": "managedruntime",
52 |       "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/managedruntime"
53 |     }
54 |   ],
55 |   "query": {
56 |     "match_all_query": {
57 |       "_type": "match_all_query"
58 |     }
59 |   },
60 |   "start": 0,
61 |   "total": 8
62 | }
63 | 
```

--------------------------------------------------------------------------------
/src/services/path-service.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Path Service Interface and Implementation
  3 |  *
  4 |  * Provides an abstraction layer over Node.js path operations
  5 |  * to enable easier testing and better dependency injection.
  6 |  */
  7 | 
  8 | import * as path from 'path';
  9 | 
 10 | /**
 11 |  * Interface for path operations
 12 |  */
 13 | export interface IPathService {
 14 |   /**
 15 |    * Join path segments
 16 |    */
 17 |   join(...paths: string[]): string;
 18 | 
 19 |   /**
 20 |    * Resolve path segments to an absolute path
 21 |    */
 22 |   resolve(...paths: string[]): string;
 23 | 
 24 |   /**
 25 |    * Get the directory name of a path
 26 |    */
 27 |   dirname(path: string): string;
 28 | 
 29 |   /**
 30 |    * Get the base name of a path
 31 |    */
 32 |   basename(path: string, ext?: string): string;
 33 | 
 34 |   /**
 35 |    * Get the extension of a path
 36 |    */
 37 |   extname(path: string): string;
 38 | 
 39 |   /**
 40 |    * Normalize a path
 41 |    */
 42 |   normalize(path: string): string;
 43 | 
 44 |   /**
 45 |    * Check if path is absolute
 46 |    */
 47 |   isAbsolute(path: string): boolean;
 48 | }
 49 | 
 50 | /**
 51 |  * Production implementation of path service
 52 |  */
 53 | export class PathService implements IPathService {
 54 |   join(...paths: string[]): string {
 55 |     return path.join(...paths);
 56 |   }
 57 | 
 58 |   resolve(...paths: string[]): string {
 59 |     return path.resolve(...paths);
 60 |   }
 61 | 
 62 |   dirname(filePath: string): string {
 63 |     return path.dirname(filePath);
 64 |   }
 65 | 
 66 |   basename(filePath: string, ext?: string): string {
 67 |     return path.basename(filePath, ext);
 68 |   }
 69 | 
 70 |   extname(filePath: string): string {
 71 |     return path.extname(filePath);
 72 |   }
 73 | 
 74 |   normalize(filePath: string): string {
 75 |     return path.normalize(filePath);
 76 |   }
 77 | 
 78 |   isAbsolute(filePath: string): boolean {
 79 |     return path.isAbsolute(filePath);
 80 |   }
 81 | }
 82 | 
 83 | /**
 84 |  * Mock implementation for testing
 85 |  */
 86 | export class MockPathService implements IPathService {
 87 |   // For testing, we can use the real path operations or provide custom behavior
 88 |   join(...paths: string[]): string {
 89 |     return paths.join('/');
 90 |   }
 91 | 
 92 |   resolve(...paths: string[]): string {
 93 |     const joined = this.join(...paths);
 94 |     return joined.startsWith('/') ? joined : `/mock/root/${joined}`;
 95 |   }
 96 | 
 97 |   dirname(filePath: string): string {
 98 |     const parts = filePath.split('/');
 99 |     return parts.slice(0, -1).join('/') || '/';
100 |   }
101 | 
102 |   basename(filePath: string, ext?: string): string {
103 |     const parts = filePath.split('/');
104 |     const base = parts[parts.length - 1];
105 |     if (ext && base.endsWith(ext)) {
106 |       return base.slice(0, -ext.length);
107 |     }
108 |     return base;
109 |   }
110 | 
111 |   extname(filePath: string): string {
112 |     const base = this.basename(filePath);
113 |     const dotIndex = base.lastIndexOf('.');
114 |     return dotIndex >= 0 ? base.slice(dotIndex) : '';
115 |   }
116 | 
117 |   normalize(filePath: string): string {
118 |     return filePath.replace(/\/+/g, '/');
119 |   }
120 | 
121 |   isAbsolute(filePath: string): boolean {
122 |     return filePath.startsWith('/');
123 |   }
124 | }
125 | 
```

--------------------------------------------------------------------------------
/docs/TopLevel/RegExp.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: TopLevel
  2 | 
  3 | # Class RegExp
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - RegExp
  9 | 
 10 | ## Description
 11 | 
 12 | The RegExp object is a static object that generates instances of a regular expression for pattern matching and monitors all regular expressions in the current window or frame. Consult ECMA standards for the format of the pattern strings supported by these regular expressions.
 13 | 
 14 | ## Properties
 15 | 
 16 | ### global
 17 | 
 18 | **Type:** boolean
 19 | 
 20 | If the regular expression instance has the g modifier, then
 21 |  this property is set to true.
 22 | 
 23 | ### ignoreCase
 24 | 
 25 | **Type:** boolean
 26 | 
 27 | If the regular expression instance has the i modifier, then
 28 |  this property is set to true.
 29 | 
 30 | ### lastIndex
 31 | 
 32 | **Type:** Number
 33 | 
 34 | This is the zero-based index value of the character within the
 35 |  String where the next search for the pattern begins. In a new
 36 |  search, the value is zero.
 37 | 
 38 | ### multiline
 39 | 
 40 | **Type:** boolean
 41 | 
 42 | If a search extends across multiple lines of test, the multiline
 43 |  property is set to true.
 44 | 
 45 | ### source
 46 | 
 47 | **Type:** String
 48 | 
 49 | A String version of the characters used to create the regular
 50 |  expression. The value does not include the forward slash delimiters that
 51 |  surround the expression.
 52 | 
 53 | ## Constructor Summary
 54 | 
 55 | RegExp(pattern : String) Constructs the regular expression using the specified pattern.
 56 | 
 57 | RegExp(pattern : String, attributes : String) Constructs the regular expression using the specified pattern and attributes.
 58 | 
 59 | ## Method Summary
 60 | 
 61 | ### exec
 62 | 
 63 | **Signature:** `exec(string : String) : Array`
 64 | 
 65 | Performs a search through the specified parameter for the current regular expression and returns an array of match information if successful.
 66 | 
 67 | ### test
 68 | 
 69 | **Signature:** `test(string : String) : boolean`
 70 | 
 71 | Returns true if there is a match of the regular expression anywhere in the specified parameter.
 72 | 
 73 | ## Constructor Detail
 74 | 
 75 | ## Method Detail
 76 | 
 77 | ## Method Details
 78 | 
 79 | ### exec
 80 | 
 81 | **Signature:** `exec(string : String) : Array`
 82 | 
 83 | **Description:** Performs a search through the specified parameter for the current regular expression and returns an array of match information if successful. Returns null if the search produces no results.
 84 | 
 85 | **Parameters:**
 86 | 
 87 | - `string`: the String to apply the regular expression.
 88 | 
 89 | **Returns:**
 90 | 
 91 | an array of match information if successful, null otherwise.
 92 | 
 93 | ---
 94 | 
 95 | ### test
 96 | 
 97 | **Signature:** `test(string : String) : boolean`
 98 | 
 99 | **Description:** Returns true if there is a match of the regular expression anywhere in the specified parameter. No additional information is available about the results of the search.
100 | 
101 | **Parameters:**
102 | 
103 | - `string`: the String to apply the regular expression.
104 | 
105 | **Returns:**
106 | 
107 | true if there is a match of the regular expression anywhere in the specified parameter, false otherwise.
108 | 
109 | ---
```

--------------------------------------------------------------------------------
/docs-site/App.tsx:
--------------------------------------------------------------------------------

```typescript
  1 | import React from 'react';
  2 | import type { RouteRecord } from 'vite-react-ssg';
  3 | import { Navigate } from 'react-router-dom';
  4 | import Layout from './components/Layout';
  5 | import HomePage from './pages/HomePage';
  6 | import ConfigurationPage from './pages/ConfigurationPage';
  7 | import AIInterfacesPage from './pages/AIInterfacesPage';
  8 | import FeaturesPage from './pages/FeaturesPage';
  9 | import ToolsPage from './pages/ToolsPage';
 10 | import ExamplesPage from './pages/ExamplesPage';
 11 | import SecurityPage from './pages/SecurityPage';
 12 | import DevelopmentPage from './pages/DevelopmentPage';
 13 | import TroubleshootingPage from './pages/TroubleshootingPage';
 14 | 
 15 | export const routes: RouteRecord[] = [
 16 |   {
 17 |     path: '/',
 18 |     element: <Layout />,
 19 |     children: [
 20 |       {
 21 |         index: true,
 22 |         element: <HomePage />,
 23 |       },
 24 |       // Routes with trailing slashes
 25 |       {
 26 |         path: 'configuration/',
 27 |         element: <ConfigurationPage />,
 28 |       },
 29 |       {
 30 |         path: 'ai-interfaces/',
 31 |         element: <AIInterfacesPage />,
 32 |       },
 33 |       {
 34 |         path: 'features/',
 35 |         element: <FeaturesPage />,
 36 |       },
 37 |       {
 38 |         path: 'tools/',
 39 |         element: <ToolsPage />,
 40 |       },
 41 |       {
 42 |         path: 'examples/',
 43 |         element: <ExamplesPage />,
 44 |       },
 45 |       {
 46 |         path: 'security/',
 47 |         element: <SecurityPage />,
 48 |       },
 49 |       {
 50 |         path: 'development/',
 51 |         element: <DevelopmentPage />,
 52 |       },
 53 |       {
 54 |         path: 'troubleshooting/',
 55 |         element: <TroubleshootingPage />,
 56 |       },
 57 |       // Redirects from non-trailing slash URLs to trailing slash URLs
 58 |       {
 59 |         path: 'configuration',
 60 |         element: <Navigate to="/configuration/" replace />,
 61 |       },
 62 |       {
 63 |         path: 'ai-interfaces',
 64 |         element: <Navigate to="/ai-interfaces/" replace />,
 65 |       },
 66 |       {
 67 |         path: 'features',
 68 |         element: <Navigate to="/features/" replace />,
 69 |       },
 70 |       {
 71 |         path: 'tools',
 72 |         element: <Navigate to="/tools/" replace />,
 73 |       },
 74 |       {
 75 |         path: 'examples',
 76 |         element: <Navigate to="/examples/" replace />,
 77 |       },
 78 |       {
 79 |         path: 'security',
 80 |         element: <Navigate to="/security/" replace />,
 81 |       },
 82 |       {
 83 |         path: 'development',
 84 |         element: <Navigate to="/development/" replace />,
 85 |       },
 86 |       {
 87 |         path: 'troubleshooting',
 88 |         element: <Navigate to="/troubleshooting/" replace />,
 89 |       },
 90 |       // Redirect old installation path to AI interfaces
 91 |       {
 92 |         path: 'installation',
 93 |         element: <Navigate to="/ai-interfaces/" replace />,
 94 |       },
 95 |       {
 96 |         path: 'installation/',
 97 |         element: <Navigate to="/ai-interfaces/" replace />,
 98 |       },
 99 |     ],
100 |   },
101 | ];
102 | 
103 | export default routes;
```

--------------------------------------------------------------------------------
/docs/dw_web/PageMetaTag.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: dw.web
  2 | 
  3 | # Class PageMetaTag
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - dw.web.PageMetaTag
  9 | 
 10 | ## Description
 11 | 
 12 | Page meta tags are used in HTML documents to provide structured data about a web page. They are usually part of the head section. Common tags are for example robots, description or social tags like open graph (e.g. 'og:title'). Page meta tags can be obtained within: home page context Site detail page context Product Content listing page context ProductSearchModel ContentSearchModel and can be set at PageMetaData container object, which is always available in the pipeline dictionary and is used as transfer object to fill the head area with meaningful page meta tag elements.
 13 | 
 14 | ## Properties
 15 | 
 16 | ### content
 17 | 
 18 | **Type:** String (Read Only)
 19 | 
 20 | The page meta tag content.
 21 | 
 22 | ### ID
 23 | 
 24 | **Type:** String (Read Only)
 25 | 
 26 | The page meta tag ID.
 27 | 
 28 | ### name
 29 | 
 30 | **Type:** boolean (Read Only)
 31 | 
 32 | Returns true if the page meta tag type is name, false otherwise.
 33 | 
 34 | ### property
 35 | 
 36 | **Type:** boolean (Read Only)
 37 | 
 38 | Returns true if the page meta tag type is property, false otherwise.
 39 | 
 40 | ### title
 41 | 
 42 | **Type:** boolean (Read Only)
 43 | 
 44 | Returns true if the page meta tag type is title, false otherwise.
 45 | 
 46 | ## Constructor Summary
 47 | 
 48 | ## Method Summary
 49 | 
 50 | ### getContent
 51 | 
 52 | **Signature:** `getContent() : String`
 53 | 
 54 | Returns the page meta tag content.
 55 | 
 56 | ### getID
 57 | 
 58 | **Signature:** `getID() : String`
 59 | 
 60 | Returns the page meta tag ID.
 61 | 
 62 | ### isName
 63 | 
 64 | **Signature:** `isName() : boolean`
 65 | 
 66 | Returns true if the page meta tag type is name, false otherwise.
 67 | 
 68 | ### isProperty
 69 | 
 70 | **Signature:** `isProperty() : boolean`
 71 | 
 72 | Returns true if the page meta tag type is property, false otherwise.
 73 | 
 74 | ### isTitle
 75 | 
 76 | **Signature:** `isTitle() : boolean`
 77 | 
 78 | Returns true if the page meta tag type is title, false otherwise.
 79 | 
 80 | ## Method Detail
 81 | 
 82 | ## Method Details
 83 | 
 84 | ### getContent
 85 | 
 86 | **Signature:** `getContent() : String`
 87 | 
 88 | **Description:** Returns the page meta tag content.
 89 | 
 90 | **Returns:**
 91 | 
 92 | page meta tag content
 93 | 
 94 | ---
 95 | 
 96 | ### getID
 97 | 
 98 | **Signature:** `getID() : String`
 99 | 
100 | **Description:** Returns the page meta tag ID.
101 | 
102 | **Returns:**
103 | 
104 | page meta tag ID
105 | 
106 | ---
107 | 
108 | ### isName
109 | 
110 | **Signature:** `isName() : boolean`
111 | 
112 | **Description:** Returns true if the page meta tag type is name, false otherwise.
113 | 
114 | **Returns:**
115 | 
116 | true if the page meta tag type is name, false otherwise
117 | 
118 | ---
119 | 
120 | ### isProperty
121 | 
122 | **Signature:** `isProperty() : boolean`
123 | 
124 | **Description:** Returns true if the page meta tag type is property, false otherwise.
125 | 
126 | **Returns:**
127 | 
128 | true if the page meta tag type is property, false otherwise
129 | 
130 | ---
131 | 
132 | ### isTitle
133 | 
134 | **Signature:** `isTitle() : boolean`
135 | 
136 | **Description:** Returns true if the page meta tag type is title, false otherwise.
137 | 
138 | **Returns:**
139 | 
140 | true if the page meta tag type is title, false otherwise
141 | 
142 | ---
```

--------------------------------------------------------------------------------
/docs/dw_catalog/ProductInventoryMgr.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: dw.catalog
  2 | 
  3 | # Class ProductInventoryMgr
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - dw.catalog.ProductInventoryMgr
  9 | 
 10 | ## Description
 11 | 
 12 | This manager provides access to inventory-related objects.
 13 | 
 14 | ## Constants
 15 | 
 16 | ### INTEGRATIONMODE_B2C
 17 | 
 18 | **Type:** String = "B2C"
 19 | 
 20 | Integration mode 'B2C' - using B2C inventory, no integration with Omnichannel Inventory
 21 | 
 22 | ### INTEGRATIONMODE_OCI
 23 | 
 24 | **Type:** String = "OCI"
 25 | 
 26 | Integration mode 'OCI' - integration with Omnichannel Inventory enabled
 27 | 
 28 | ### INTEGRATIONMODE_OCI_CACHE
 29 | 
 30 | **Type:** String = "OCI_CACHE"
 31 | 
 32 | Integration mode 'OCI_CACHE' - using B2C inventory, initializing cache as preparation for integration with Omnichannel Inventory
 33 | 
 34 | ## Properties
 35 | 
 36 | ### inventoryIntegrationMode
 37 | 
 38 | **Type:** String (Read Only)
 39 | 
 40 | The current inventory integration mode as one of
 41 |  
 42 |  INTEGRATIONMODE_B2C
 43 |  INTEGRATIONMODE_OCI_CACHE
 44 |  INTEGRATIONMODE_OCI
 45 | 
 46 | ### inventoryList
 47 | 
 48 | **Type:** ProductInventoryList (Read Only)
 49 | 
 50 | The inventory list assigned to the current site or null if no inventory list is assigned to the current
 51 |  site.
 52 | 
 53 | ## Constructor Summary
 54 | 
 55 | ## Method Summary
 56 | 
 57 | ### getInventoryIntegrationMode
 58 | 
 59 | **Signature:** `static getInventoryIntegrationMode() : String`
 60 | 
 61 | Returns the current inventory integration mode as one of INTEGRATIONMODE_B2C INTEGRATIONMODE_OCI_CACHE INTEGRATIONMODE_OCI
 62 | 
 63 | ### getInventoryList
 64 | 
 65 | **Signature:** `static getInventoryList() : ProductInventoryList`
 66 | 
 67 | Returns the inventory list assigned to the current site or null if no inventory list is assigned to the current site.
 68 | 
 69 | ### getInventoryList
 70 | 
 71 | **Signature:** `static getInventoryList(listID : String) : ProductInventoryList`
 72 | 
 73 | Returns the inventory list with the passed ID or null if no inventory list exists with that ID.
 74 | 
 75 | ## Method Detail
 76 | 
 77 | ## Method Details
 78 | 
 79 | ### getInventoryIntegrationMode
 80 | 
 81 | **Signature:** `static getInventoryIntegrationMode() : String`
 82 | 
 83 | **Description:** Returns the current inventory integration mode as one of INTEGRATIONMODE_B2C INTEGRATIONMODE_OCI_CACHE INTEGRATIONMODE_OCI
 84 | 
 85 | **Returns:**
 86 | 
 87 | The current inventory integration mode as a constant String.
 88 | 
 89 | ---
 90 | 
 91 | ### getInventoryList
 92 | 
 93 | **Signature:** `static getInventoryList() : ProductInventoryList`
 94 | 
 95 | **Description:** Returns the inventory list assigned to the current site or null if no inventory list is assigned to the current site.
 96 | 
 97 | **Returns:**
 98 | 
 99 | The ProductInventoryList assigned to the current site, or null.
100 | 
101 | ---
102 | 
103 | ### getInventoryList
104 | 
105 | **Signature:** `static getInventoryList(listID : String) : ProductInventoryList`
106 | 
107 | **Description:** Returns the inventory list with the passed ID or null if no inventory list exists with that ID.
108 | 
109 | **Parameters:**
110 | 
111 | - `listID`: The ID of the inventory list to retrieve.
112 | 
113 | **Returns:**
114 | 
115 | The ProductInventoryList identified by listID, or null.
116 | 
117 | ---
```

--------------------------------------------------------------------------------
/docs/dw_job/JobExecution.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: dw.job
  2 | 
  3 | # Class JobExecution
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - dw.job.JobExecution
  9 | 
 10 | ## Description
 11 | 
 12 | Represents an execution of a job. The job execution can be accessed from a JobStepExecution via JobStepExecution.getJobExecution(). If a pipeline is used to implement a step the step execution is available in the pipeline dictionary under the key 'JobStepExecution'. If a script module is used to implement a step the step execution is available as the second parameter of the module's function that is used to execute the step, e.g.:
 13 | 
 14 | ```javascript
 15 |  ...
 16 |  exports.execute( parameters, stepExecution)
 17 |  {
 18 |       ...
 19 |       var jobExecution = stepExecution.getJobExecution();
 20 |       ...
 21 |  }
 22 |  ...
 23 | ```
 24 | 
 25 | ## Properties
 26 | 
 27 | ### context
 28 | 
 29 | **Type:** Map (Read Only)
 30 | 
 31 | The job context which can be used to share data between steps. NOTE: Steps should be self-contained, the job context should only be used when necessary and with caution. If two steps which are running in parallel in the same job store data in the job context using the same key the result is undefined. Don't add any complex data to the job context since only simple data types are supported (for example, String and Integer).
 32 | 
 33 | ### ID
 34 | 
 35 | **Type:** String (Read Only)
 36 | 
 37 | The ID of this job execution.
 38 | 
 39 | ### jobID
 40 | 
 41 | **Type:** String (Read Only)
 42 | 
 43 | The ID of the job this job execution belongs to.
 44 | 
 45 | ## Constructor Summary
 46 | 
 47 | This class does not have a constructor, so you cannot create it directly.
 48 | 
 49 | ## Method Summary
 50 | 
 51 | ### getContext
 52 | 
 53 | **Signature:** `getContext() : Map`
 54 | 
 55 | Returns the job context which can be used to share data between steps.
 56 | 
 57 | ### getID
 58 | 
 59 | **Signature:** `getID() : String`
 60 | 
 61 | Returns the ID of this job execution.
 62 | 
 63 | ### getJobID
 64 | 
 65 | **Signature:** `getJobID() : String`
 66 | 
 67 | Returns the ID of the job this job execution belongs to.
 68 | 
 69 | ## Method Detail
 70 | 
 71 | ## Method Details
 72 | 
 73 | ### getContext
 74 | 
 75 | **Signature:** `getContext() : Map`
 76 | 
 77 | **Description:** Returns the job context which can be used to share data between steps. NOTE: Steps should be self-contained, the job context should only be used when necessary and with caution. If two steps which are running in parallel in the same job store data in the job context using the same key the result is undefined. Don't add any complex data to the job context since only simple data types are supported (for example, String and Integer).
 78 | 
 79 | **Returns:**
 80 | 
 81 | the map that represents the job context.
 82 | 
 83 | ---
 84 | 
 85 | ### getID
 86 | 
 87 | **Signature:** `getID() : String`
 88 | 
 89 | **Description:** Returns the ID of this job execution.
 90 | 
 91 | **Returns:**
 92 | 
 93 | the ID of this job execution.
 94 | 
 95 | ---
 96 | 
 97 | ### getJobID
 98 | 
 99 | **Signature:** `getJobID() : String`
100 | 
101 | **Description:** Returns the ID of the job this job execution belongs to.
102 | 
103 | **Returns:**
104 | 
105 | the ID of the job this job execution belongs to.
106 | 
107 | ---
108 | 
```

--------------------------------------------------------------------------------
/src/services/file-system-service.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * File System Service Interface and Implementation
  3 |  *
  4 |  * Provides an abstraction layer over Node.js file system operations
  5 |  * to enable easier testing and better dependency injection.
  6 |  */
  7 | 
  8 | import * as fs from 'fs/promises';
  9 | 
 10 | /**
 11 |  * Interface for file system operations
 12 |  */
 13 | export interface IFileSystemService {
 14 |   /**
 15 |    * Check if a file or directory exists
 16 |    */
 17 |   exists(path: string): Promise<boolean>;
 18 | 
 19 |   /**
 20 |    * Create a directory recursively
 21 |    */
 22 |   mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;
 23 | 
 24 |   /**
 25 |    * Write content to a file
 26 |    */
 27 |   writeFile(path: string, content: string): Promise<void>;
 28 | 
 29 |   /**
 30 |    * Read content from a file
 31 |    */
 32 |   readFile(path: string): Promise<string>;
 33 | 
 34 |   /**
 35 |    * Check access to a file or directory
 36 |    */
 37 |   access(path: string): Promise<void>;
 38 | }
 39 | 
 40 | /**
 41 |  * Production implementation of file system service
 42 |  */
 43 | export class FileSystemService implements IFileSystemService {
 44 |   async exists(path: string): Promise<boolean> {
 45 |     try {
 46 |       await fs.access(path);
 47 |       return true;
 48 |     } catch {
 49 |       return false;
 50 |     }
 51 |   }
 52 | 
 53 |   async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {
 54 |     await fs.mkdir(path, options);
 55 |   }
 56 | 
 57 |   async writeFile(path: string, content: string): Promise<void> {
 58 |     await fs.writeFile(path, content);
 59 |   }
 60 | 
 61 |   async readFile(path: string): Promise<string> {
 62 |     return await fs.readFile(path, 'utf-8');
 63 |   }
 64 | 
 65 |   async access(path: string): Promise<void> {
 66 |     await fs.access(path);
 67 |   }
 68 | }
 69 | 
 70 | /**
 71 |  * Mock implementation for testing
 72 |  */
 73 | export class MockFileSystemService implements IFileSystemService {
 74 |   private mockFiles: Map<string, string> = new Map();
 75 |   private mockDirectories: Set<string> = new Set();
 76 | 
 77 |   // Mock methods for testing setup
 78 |   setMockFile(path: string, content: string): void {
 79 |     this.mockFiles.set(path, content);
 80 |   }
 81 | 
 82 |   setMockDirectory(path: string): void {
 83 |     this.mockDirectories.add(path);
 84 |   }
 85 | 
 86 |   clearMocks(): void {
 87 |     this.mockFiles.clear();
 88 |     this.mockDirectories.clear();
 89 |   }
 90 | 
 91 |   // Service implementation
 92 |   async exists(path: string): Promise<boolean> {
 93 |     return this.mockFiles.has(path) || this.mockDirectories.has(path);
 94 |   }
 95 | 
 96 |   async mkdir(path: string, _options?: { recursive?: boolean }): Promise<void> {
 97 |     this.mockDirectories.add(path);
 98 |   }
 99 | 
100 |   async writeFile(path: string, content: string): Promise<void> {
101 |     this.mockFiles.set(path, content);
102 |   }
103 | 
104 |   async readFile(path: string): Promise<string> {
105 |     const content = this.mockFiles.get(path);
106 |     if (content === undefined) {
107 |       throw new Error(`File not found: ${path}`);
108 |     }
109 |     return content;
110 |   }
111 | 
112 |   async access(path: string): Promise<void> {
113 |     if (!(await this.exists(path))) {
114 |       throw new Error(`Path not accessible: ${path}`);
115 |     }
116 |   }
117 | }
118 | 
```

--------------------------------------------------------------------------------
/docs/dw_rpc/WebReference.md:
--------------------------------------------------------------------------------

```markdown
 1 | ## Package: dw.rpc
 2 | 
 3 | # Class WebReference
 4 | 
 5 | ## Inheritance Hierarchy
 6 | 
 7 | - Object
 8 |   - dw.rpc.WebReference
 9 | 
10 | ## Description
11 | 
12 | Represents a web service defined in a WSDL file. The implementation is backed by a JAX-RPC framework. You should use the newer dw.ws package and WebReference2 class instead, which is based on JAX-WS. Use the Services module in Business Manager to set timeout values, not the methods for this class. The Services module provides better analytics and timeout management. To create an instance of a WebReference object, in a B2C Commerce Script file, reference a WSDL file in the webreferences directory and request the service Stub using one of the get service methods. For example, if your WSDL file is MyWSDL.wsdl, to create an instance of WebReference and access the Stub: var webref : WebReference = webreferences.MyWSDL; var stub : Stub = webref.getDefaultService(); Note: script classes representing your WSDL file are are generated by the platform and then placed in the WebReferences package. You do not need to include the importPackage statement in your B2C Commerce Script file to use classes in the WebReferences package.
13 | 
14 | ## Properties
15 | 
16 | ### defaultService
17 | 
18 | **Type:** Stub (Read Only)
19 | 
20 | The default service of the WebReference object. If you have more than one service
21 |  defined in your WSDL, the default service is the first service alphabetically. If the service
22 |  has multiple ports defined, the default service uses the SOAP port name that is first alphabetically.
23 | 
24 | ## Constructor Summary
25 | 
26 | WebReference()
27 | 
28 | ## Method Summary
29 | 
30 | ### getDefaultService
31 | 
32 | **Signature:** `getDefaultService() : Stub`
33 | 
34 | Returns the default service of the WebReference object.
35 | 
36 | ### getService
37 | 
38 | **Signature:** `getService(service : String, port : String) : Stub`
39 | 
40 | Returns a specific service from this WebReference.
41 | 
42 | ## Constructor Detail
43 | 
44 | ## Method Detail
45 | 
46 | ## Method Details
47 | 
48 | ### getDefaultService
49 | 
50 | **Signature:** `getDefaultService() : Stub`
51 | 
52 | **Description:** Returns the default service of the WebReference object. If you have more than one service defined in your WSDL, the default service is the first service alphabetically. If the service has multiple ports defined, the default service uses the SOAP port name that is first alphabetically.
53 | 
54 | **Deprecated:**
55 | 
56 | use webreferences2 instead
57 | 
58 | **Returns:**
59 | 
60 | the default service of the WebReference object.
61 | 
62 | ---
63 | 
64 | ### getService
65 | 
66 | **Signature:** `getService(service : String, port : String) : Stub`
67 | 
68 | **Description:** Returns a specific service from this WebReference.
69 | 
70 | **Deprecated:**
71 | 
72 | use webreferences2 instead
73 | 
74 | **Parameters:**
75 | 
76 | - `service`: the service to locate.
77 | - `port`: the port name to use. var port = webref.getService("SampleServiceName","SamplePortName");
78 | 
79 | **Returns:**
80 | 
81 | a specific service from this WebReference.
82 | 
83 | ---
```

--------------------------------------------------------------------------------
/docs/dw_web/FormList.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: dw.web
  2 | 
  3 | # Class FormList
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - dw.web.FormElement
  9 |   - dw.web.FormGroup
 10 |     - dw.web.FormList
 11 | 
 12 | ## Description
 13 | 
 14 | Represents a list of forms.
 15 | 
 16 | ## Properties
 17 | 
 18 | ### selectManyItems
 19 | 
 20 | **Type:** List (Read Only)
 21 | 
 22 | The selected list items if the list is
 23 |  configured to support selection of items.
 24 | 
 25 | ### selectManyObjects
 26 | 
 27 | **Type:** List (Read Only)
 28 | 
 29 | A list of all selected objects if the list is configured
 30 |  to support the selection of items. The objects are the objects that were
 31 |  bound to each row.
 32 | 
 33 | ### selectOneItem
 34 | 
 35 | **Type:** FormListItem (Read Only)
 36 | 
 37 | The default list item if the list is configured to
 38 |  support the selection of a default item.
 39 | 
 40 | ### selectOneObject
 41 | 
 42 | **Type:** Object (Read Only)
 43 | 
 44 | The selected object if the list is configured to
 45 |  support the selection of a default item. The object is the object
 46 |  bound to the item.
 47 | 
 48 | ## Constructor Summary
 49 | 
 50 | ## Method Summary
 51 | 
 52 | ### getSelectManyItems
 53 | 
 54 | **Signature:** `getSelectManyItems() : List`
 55 | 
 56 | returns the selected list items if the list is configured to support selection of items.
 57 | 
 58 | ### getSelectManyObjects
 59 | 
 60 | **Signature:** `getSelectManyObjects() : List`
 61 | 
 62 | Returns a list of all selected objects if the list is configured to support the selection of items.
 63 | 
 64 | ### getSelectOneItem
 65 | 
 66 | **Signature:** `getSelectOneItem() : FormListItem`
 67 | 
 68 | Returns the default list item if the list is configured to support the selection of a default item.
 69 | 
 70 | ### getSelectOneObject
 71 | 
 72 | **Signature:** `getSelectOneObject() : Object`
 73 | 
 74 | Returns the selected object if the list is configured to support the selection of a default item.
 75 | 
 76 | ## Method Detail
 77 | 
 78 | ## Method Details
 79 | 
 80 | ### getSelectManyItems
 81 | 
 82 | **Signature:** `getSelectManyItems() : List`
 83 | 
 84 | **Description:** returns the selected list items if the list is configured to support selection of items.
 85 | 
 86 | **Returns:**
 87 | 
 88 | a List of FormListItem elements or null if no selection was configured for the form.
 89 | 
 90 | ---
 91 | 
 92 | ### getSelectManyObjects
 93 | 
 94 | **Signature:** `getSelectManyObjects() : List`
 95 | 
 96 | **Description:** Returns a list of all selected objects if the list is configured to support the selection of items. The objects are the objects that were bound to each row.
 97 | 
 98 | **Returns:**
 99 | 
100 | a List of objects or null if no selection was configured for the form.
101 | 
102 | ---
103 | 
104 | ### getSelectOneItem
105 | 
106 | **Signature:** `getSelectOneItem() : FormListItem`
107 | 
108 | **Description:** Returns the default list item if the list is configured to support the selection of a default item.
109 | 
110 | **Returns:**
111 | 
112 | the default FormListItem elements or null if no selection was configured
113 | 
114 | ---
115 | 
116 | ### getSelectOneObject
117 | 
118 | **Signature:** `getSelectOneObject() : Object`
119 | 
120 | **Description:** Returns the selected object if the list is configured to support the selection of a default item. The object is the object bound to the item.
121 | 
122 | **Returns:**
123 | 
124 | the selected object.
125 | 
126 | ---
```

--------------------------------------------------------------------------------
/docs/dw_extensions.paymentrequest/PaymentRequestHookResult.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: dw.extensions.paymentrequest
  2 | 
  3 | # Class PaymentRequestHookResult
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - dw.extensions.paymentrequest.PaymentRequestHookResult
  9 | 
 10 | ## Description
 11 | 
 12 | Result of a hook handling a Payment Request request
 13 | 
 14 | ## Properties
 15 | 
 16 | ### eventDetail
 17 | 
 18 | **Type:** Object (Read Only)
 19 | 
 20 | Detail to the JS custom event to dispatch in response to this result.
 21 | 
 22 | ### eventName
 23 | 
 24 | **Type:** String (Read Only)
 25 | 
 26 | Name of the JS custom event to dispatch in response to this result.
 27 | 
 28 | ### redirect
 29 | 
 30 | **Type:** URL (Read Only)
 31 | 
 32 | URL to navigate to in response to this result.
 33 | 
 34 | ### status
 35 | 
 36 | **Type:** Status (Read Only)
 37 | 
 38 | Status describing the outcome of this result.
 39 | 
 40 | ## Constructor Summary
 41 | 
 42 | PaymentRequestHookResult(status : Status, redirect : URL) Constructs a result with the given outcome information.
 43 | 
 44 | ## Method Summary
 45 | 
 46 | ### getEventDetail
 47 | 
 48 | **Signature:** `getEventDetail() : Object`
 49 | 
 50 | Detail to the JS custom event to dispatch in response to this result.
 51 | 
 52 | ### getEventName
 53 | 
 54 | **Signature:** `getEventName() : String`
 55 | 
 56 | Name of the JS custom event to dispatch in response to this result.
 57 | 
 58 | ### getRedirect
 59 | 
 60 | **Signature:** `getRedirect() : URL`
 61 | 
 62 | URL to navigate to in response to this result.
 63 | 
 64 | ### getStatus
 65 | 
 66 | **Signature:** `getStatus() : Status`
 67 | 
 68 | Status describing the outcome of this result.
 69 | 
 70 | ### setEvent
 71 | 
 72 | **Signature:** `setEvent(name : String) : void`
 73 | 
 74 | Sets the name of the JS custom event to dispatch in response to this result.
 75 | 
 76 | ### setEvent
 77 | 
 78 | **Signature:** `setEvent(name : String, detail : Object) : void`
 79 | 
 80 | Sets the name and detail of the JS custom event to dispatch in response to this result.
 81 | 
 82 | ## Constructor Detail
 83 | 
 84 | ## Method Detail
 85 | 
 86 | ## Method Details
 87 | 
 88 | ### getEventDetail
 89 | 
 90 | **Signature:** `getEventDetail() : Object`
 91 | 
 92 | **Description:** Detail to the JS custom event to dispatch in response to this result.
 93 | 
 94 | **Returns:**
 95 | 
 96 | event detail
 97 | 
 98 | ---
 99 | 
100 | ### getEventName
101 | 
102 | **Signature:** `getEventName() : String`
103 | 
104 | **Description:** Name of the JS custom event to dispatch in response to this result.
105 | 
106 | **Returns:**
107 | 
108 | event name
109 | 
110 | ---
111 | 
112 | ### getRedirect
113 | 
114 | **Signature:** `getRedirect() : URL`
115 | 
116 | **Description:** URL to navigate to in response to this result.
117 | 
118 | **Returns:**
119 | 
120 | redirect URL
121 | 
122 | ---
123 | 
124 | ### getStatus
125 | 
126 | **Signature:** `getStatus() : Status`
127 | 
128 | **Description:** Status describing the outcome of this result.
129 | 
130 | **Returns:**
131 | 
132 | status of this result
133 | 
134 | ---
135 | 
136 | ### setEvent
137 | 
138 | **Signature:** `setEvent(name : String) : void`
139 | 
140 | **Description:** Sets the name of the JS custom event to dispatch in response to this result.
141 | 
142 | **Parameters:**
143 | 
144 | - `name`: JS custom event name
145 | 
146 | ---
147 | 
148 | ### setEvent
149 | 
150 | **Signature:** `setEvent(name : String, detail : Object) : void`
151 | 
152 | **Description:** Sets the name and detail of the JS custom event to dispatch in response to this result.
153 | 
154 | **Parameters:**
155 | 
156 | - `name`: JS custom event name
157 | - `detail`: JS custom event detail
158 | 
159 | ---
```

--------------------------------------------------------------------------------
/docs/dw_net/WebDAVFileInfo.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: dw.net
  2 | 
  3 | # Class WebDAVFileInfo
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - dw.net.WebDAVFileInfo
  9 | 
 10 | ## Description
 11 | 
 12 | Simple class representing a file on a remote WebDAV location. The class possesses only read-only attributes of the file and does not permit any manipulation of the file itself. Instances of this class are returned by WebDAVClient.propfind(String) which is used to get a listing of files in a WebDAV directory. Note: when this class is used with sensitive data, be careful in persisting sensitive information to disk.
 13 | 
 14 | ## Properties
 15 | 
 16 | ### contentType
 17 | 
 18 | **Type:** String (Read Only)
 19 | 
 20 | The content type of the file.
 21 | 
 22 | ### creationDate
 23 | 
 24 | **Type:** Date (Read Only)
 25 | 
 26 | The creationDate of the file.
 27 | 
 28 | ### directory
 29 | 
 30 | **Type:** boolean (Read Only)
 31 | 
 32 | Identifies if the file is a directory.
 33 | 
 34 | ### name
 35 | 
 36 | **Type:** String (Read Only)
 37 | 
 38 | The name of the file.
 39 | 
 40 | ### path
 41 | 
 42 | **Type:** String (Read Only)
 43 | 
 44 | The path of the file.
 45 | 
 46 | ### size
 47 | 
 48 | **Type:** Number (Read Only)
 49 | 
 50 | The size of the file.
 51 | 
 52 | ## Constructor Summary
 53 | 
 54 | ## Method Summary
 55 | 
 56 | ### getContentType
 57 | 
 58 | **Signature:** `getContentType() : String`
 59 | 
 60 | Returns the content type of the file.
 61 | 
 62 | ### getCreationDate
 63 | 
 64 | **Signature:** `getCreationDate() : Date`
 65 | 
 66 | Returns the creationDate of the file.
 67 | 
 68 | ### getName
 69 | 
 70 | **Signature:** `getName() : String`
 71 | 
 72 | Returns the name of the file.
 73 | 
 74 | ### getPath
 75 | 
 76 | **Signature:** `getPath() : String`
 77 | 
 78 | Returns the path of the file.
 79 | 
 80 | ### getSize
 81 | 
 82 | **Signature:** `getSize() : Number`
 83 | 
 84 | Returns the size of the file.
 85 | 
 86 | ### isDirectory
 87 | 
 88 | **Signature:** `isDirectory() : boolean`
 89 | 
 90 | Identifies if the file is a directory.
 91 | 
 92 | ### lastModified
 93 | 
 94 | **Signature:** `lastModified() : Date`
 95 | 
 96 | Returns the lastModified date of the file.
 97 | 
 98 | ## Method Detail
 99 | 
100 | ## Method Details
101 | 
102 | ### getContentType
103 | 
104 | **Signature:** `getContentType() : String`
105 | 
106 | **Description:** Returns the content type of the file.
107 | 
108 | **Returns:**
109 | 
110 | the content type of the file.
111 | 
112 | ---
113 | 
114 | ### getCreationDate
115 | 
116 | **Signature:** `getCreationDate() : Date`
117 | 
118 | **Description:** Returns the creationDate of the file.
119 | 
120 | **Returns:**
121 | 
122 | the creationDate of the file.
123 | 
124 | ---
125 | 
126 | ### getName
127 | 
128 | **Signature:** `getName() : String`
129 | 
130 | **Description:** Returns the name of the file.
131 | 
132 | **Returns:**
133 | 
134 | the name of the file.
135 | 
136 | ---
137 | 
138 | ### getPath
139 | 
140 | **Signature:** `getPath() : String`
141 | 
142 | **Description:** Returns the path of the file.
143 | 
144 | **Returns:**
145 | 
146 | the path of the file.
147 | 
148 | ---
149 | 
150 | ### getSize
151 | 
152 | **Signature:** `getSize() : Number`
153 | 
154 | **Description:** Returns the size of the file.
155 | 
156 | **Returns:**
157 | 
158 | the size of the file.
159 | 
160 | ---
161 | 
162 | ### isDirectory
163 | 
164 | **Signature:** `isDirectory() : boolean`
165 | 
166 | **Description:** Identifies if the file is a directory.
167 | 
168 | **Returns:**
169 | 
170 | true if the file is a directory, false otherwise.
171 | 
172 | ---
173 | 
174 | ### lastModified
175 | 
176 | **Signature:** `lastModified() : Date`
177 | 
178 | **Description:** Returns the lastModified date of the file.
179 | 
180 | **Returns:**
181 | 
182 | the lastModified date of the file.
183 | 
184 | ---
```

--------------------------------------------------------------------------------
/docs/dw_order/SumItem.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: dw.order
  2 | 
  3 | # Class SumItem
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - dw.order.SumItem
  9 | 
 10 | ## Description
 11 | 
 12 | Container used to represent an subtotal or grandtotal item which contains various prices and a tax breakdown held in a collection of tax-items. Usage example: var invoice : Invoice = ...; var productNet = invoice.productSubTotal.netPrice; var serviceNet = invoice.serviceSubTotal.netPrice; var grandNet = invoice.grandTotal.netPrice; var grandTax = invoice.grandTotal.tax; var grandGross = invoice.grandTotal.grossPrice; # tax breakdown for each(taxItem : TaxItem in invoice.grandTotal.taxItems) { var tax : Money = taxItem.amount; var taxGroup : TaxGroup = taxItem.taxGroup; var rate : Double = taxGroup.rate; var caption :String = taxGroup.caption; var taxType :String = taxGroup.taxType; }
 13 | 
 14 | ## Properties
 15 | 
 16 | ### grossPrice
 17 | 
 18 | **Type:** Money (Read Only)
 19 | 
 20 | Gross price of SumItem.
 21 | 
 22 | ### netPrice
 23 | 
 24 | **Type:** Money (Read Only)
 25 | 
 26 | Net price of SumItem.
 27 | 
 28 | ### tax
 29 | 
 30 | **Type:** Money (Read Only)
 31 | 
 32 | Total tax for SumItem.
 33 | 
 34 | ### taxBasis
 35 | 
 36 | **Type:** Money (Read Only)
 37 | 
 38 | Price of entire SumItem on which tax calculation is based. Same as getNetPrice()
 39 |  or getGrossPrice() depending on whether the order is based on net or gross prices.
 40 | 
 41 | ### taxItems
 42 | 
 43 | **Type:** Collection (Read Only)
 44 | 
 45 | Tax items representing a tax breakdown for the SumItem.
 46 | 
 47 | ## Constructor Summary
 48 | 
 49 | ## Method Summary
 50 | 
 51 | ### getGrossPrice
 52 | 
 53 | **Signature:** `getGrossPrice() : Money`
 54 | 
 55 | Gross price of SumItem.
 56 | 
 57 | ### getNetPrice
 58 | 
 59 | **Signature:** `getNetPrice() : Money`
 60 | 
 61 | Net price of SumItem.
 62 | 
 63 | ### getTax
 64 | 
 65 | **Signature:** `getTax() : Money`
 66 | 
 67 | Total tax for SumItem.
 68 | 
 69 | ### getTaxBasis
 70 | 
 71 | **Signature:** `getTaxBasis() : Money`
 72 | 
 73 | Price of entire SumItem on which tax calculation is based.
 74 | 
 75 | ### getTaxItems
 76 | 
 77 | **Signature:** `getTaxItems() : Collection`
 78 | 
 79 | Tax items representing a tax breakdown for the SumItem.
 80 | 
 81 | ## Method Detail
 82 | 
 83 | ## Method Details
 84 | 
 85 | ### getGrossPrice
 86 | 
 87 | **Signature:** `getGrossPrice() : Money`
 88 | 
 89 | **Description:** Gross price of SumItem.
 90 | 
 91 | **Returns:**
 92 | 
 93 | Gross price of SumItem.
 94 | 
 95 | ---
 96 | 
 97 | ### getNetPrice
 98 | 
 99 | **Signature:** `getNetPrice() : Money`
100 | 
101 | **Description:** Net price of SumItem.
102 | 
103 | **Returns:**
104 | 
105 | Net price of SumItem.
106 | 
107 | ---
108 | 
109 | ### getTax
110 | 
111 | **Signature:** `getTax() : Money`
112 | 
113 | **Description:** Total tax for SumItem.
114 | 
115 | **Returns:**
116 | 
117 | Total tax for SumItem.
118 | 
119 | ---
120 | 
121 | ### getTaxBasis
122 | 
123 | **Signature:** `getTaxBasis() : Money`
124 | 
125 | **Description:** Price of entire SumItem on which tax calculation is based. Same as getNetPrice() or getGrossPrice() depending on whether the order is based on net or gross prices.
126 | 
127 | **Returns:**
128 | 
129 | Price of entire item on which tax calculation is based
130 | 
131 | ---
132 | 
133 | ### getTaxItems
134 | 
135 | **Signature:** `getTaxItems() : Collection`
136 | 
137 | **Description:** Tax items representing a tax breakdown for the SumItem.
138 | 
139 | **Returns:**
140 | 
141 | tax items representing a tax breakdown for the SumItem
142 | 
143 | **See Also:**
144 | 
145 | TaxItem
146 | 
147 | ---
```

--------------------------------------------------------------------------------
/src/utils/log-tool-constants.ts:
--------------------------------------------------------------------------------

```typescript
 1 | /**
 2 |  * Shared constants for log tool handlers
 3 |  * Centralizes defaults, types, and configuration
 4 |  */
 5 | 
 6 | // Log levels enum for type safety
 7 | export enum LogLevel {
 8 |   ERROR = 'error',
 9 |   WARN = 'warn',
10 |   INFO = 'info',
11 |   DEBUG = 'debug',
12 |   ALL = 'all'
13 | }
14 | 
15 | // Default limits for different tool types
16 | export const DEFAULT_LIMITS = {
17 |   latest: 10,
18 |   search: 20,
19 |   jobEntries: 50,
20 |   jobSearch: 20,
21 |   jobFiles: 10,
22 | } as const;
23 | 
24 | // Tool name sets for O(1) lookup
25 | export const LOG_TOOL_NAMES_SET = new Set([
26 |   'get_latest_error',
27 |   'get_latest_warn',
28 |   'get_latest_info',
29 |   'get_latest_debug',
30 |   'summarize_logs',
31 |   'search_logs',
32 |   'list_log_files',
33 |   'get_log_file_contents',
34 | ] as const);
35 | 
36 | export const JOB_LOG_TOOL_NAMES_SET = new Set([
37 |   'get_latest_job_log_files',
38 |   'search_job_logs_by_name',
39 |   'get_job_log_entries',
40 |   'search_job_logs',
41 |   'get_job_execution_summary',
42 | ] as const);
43 | 
44 | // Type definitions
45 | export type LogToolName = 'get_latest_error' | 'get_latest_warn' | 'get_latest_info' | 'get_latest_debug' |
46 |                          'summarize_logs' | 'search_logs' | 'list_log_files' | 'get_log_file_contents';
47 | 
48 | export type JobLogToolName = 'get_latest_job_log_files' | 'search_job_logs_by_name' | 'get_job_log_entries' |
49 |                             'search_job_logs' | 'get_job_execution_summary';
50 | 
51 | // Typed argument interfaces for each tool
52 | export type LogToolArgs =
53 |   | { tool: 'get_latest_error' | 'get_latest_warn' | 'get_latest_info' | 'get_latest_debug'; limit?: number; date?: string }
54 |   | { tool: 'summarize_logs'; date?: string }
55 |   | { tool: 'search_logs'; pattern: string; logLevel?: LogLevel; limit?: number; date?: string }
56 |   | { tool: 'list_log_files' }
57 |   | { tool: 'get_log_file_contents'; filename: string; maxBytes?: number; tailOnly?: boolean };
58 | 
59 | export type JobLogToolArgs =
60 |   | { tool: 'get_latest_job_log_files'; limit?: number }
61 |   | { tool: 'search_job_logs_by_name'; jobName: string; limit?: number }
62 |   | { tool: 'get_job_log_entries'; level?: LogLevel; limit?: number; jobName?: string }
63 |   | { tool: 'search_job_logs'; pattern: string; level?: LogLevel; limit?: number; jobName?: string }
64 |   | { tool: 'get_job_execution_summary'; jobName: string };
65 | 
66 | // Helper functions
67 | export function getLimit(providedLimit: number | undefined, toolType: keyof typeof DEFAULT_LIMITS): number {
68 |   return providedLimit ?? DEFAULT_LIMITS[toolType];
69 | }
70 | 
71 | export function isValidLogLevel(level: string): level is LogLevel {
72 |   return Object.values(LogLevel).includes(level as LogLevel);
73 | }
74 | 
75 | export function deriveLogLevel(toolName: string, argsLevel?: string): LogLevel {
76 |   if (argsLevel && isValidLogLevel(argsLevel)) {
77 |     return argsLevel as LogLevel;
78 |   }
79 | 
80 |   // Extract level from tool name for get_latest_* tools
81 |   const match = toolName.match(/get_latest_(\w+)/);
82 |   if (match && isValidLogLevel(match[1])) {
83 |     return match[1] as LogLevel;
84 |   }
85 | 
86 |   return LogLevel.ALL;
87 | }
88 | 
```

--------------------------------------------------------------------------------
/docs/TopLevel/BigInt.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: TopLevel
  2 | 
  3 | # Class BigInt
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - BigInt
  9 | 
 10 | ## Description
 11 | 
 12 | A BigInt object is a wrapper for a primitive bigint value. bigint values can be numbers too large to be stored as number values. A bigint literal in code is an integer number with an appended n. Example: var hugeNumber = 1245678901234567890n; var hugeNumberObject = BigInt( hugeNumber );
 13 | 
 14 | ## Constructor Summary
 15 | 
 16 | BigInt() Constructs a BigInt with value 0.
 17 | 
 18 | BigInt(value : BigInt) Constructs a new BigInt using the specified BigInt.
 19 | 
 20 | BigInt(value : String) Constructs a BigInt using the specified value.
 21 | 
 22 | ## Method Summary
 23 | 
 24 | ### asIntN
 25 | 
 26 | **Signature:** `static asIntN(bits : Number, value : BigInt) : BigInt`
 27 | 
 28 | Clamps the given BigInt value to a signed integer with a given precision.
 29 | 
 30 | ### asUintN
 31 | 
 32 | **Signature:** `static asUintN(bits : Number, value : BigInt) : BigInt`
 33 | 
 34 | Clamps the given BigInt value to an unsigned integer with a given precision.
 35 | 
 36 | ### toLocaleString
 37 | 
 38 | **Signature:** `toLocaleString() : String`
 39 | 
 40 | Converts this BigInt to a String using local number formatting conventions.
 41 | 
 42 | ### toString
 43 | 
 44 | **Signature:** `toString() : String`
 45 | 
 46 | A String representation of this BigInt.
 47 | 
 48 | ### toString
 49 | 
 50 | **Signature:** `toString(radix : Number) : String`
 51 | 
 52 | Converts the BigInt into a string using the specified radix (base).
 53 | 
 54 | ## Constructor Detail
 55 | 
 56 | ## Method Detail
 57 | 
 58 | ## Method Details
 59 | 
 60 | ### asIntN
 61 | 
 62 | **Signature:** `static asIntN(bits : Number, value : BigInt) : BigInt`
 63 | 
 64 | **Description:** Clamps the given BigInt value to a signed integer with a given precision.
 65 | 
 66 | **Parameters:**
 67 | 
 68 | - `bits`: Number of bits required for resulting integer.
 69 | - `value`: The value to be clamped to the given number of bits.
 70 | 
 71 | **Returns:**
 72 | 
 73 | The value modulo 2bits, as a signed integer.
 74 | 
 75 | ---
 76 | 
 77 | ### asUintN
 78 | 
 79 | **Signature:** `static asUintN(bits : Number, value : BigInt) : BigInt`
 80 | 
 81 | **Description:** Clamps the given BigInt value to an unsigned integer with a given precision.
 82 | 
 83 | **Parameters:**
 84 | 
 85 | - `bits`: Number of bits required for resulting integer.
 86 | - `value`: The value to be clamped to the given number of bits.
 87 | 
 88 | **Returns:**
 89 | 
 90 | The value modulo 2bits, as an unsigned integer.
 91 | 
 92 | ---
 93 | 
 94 | ### toLocaleString
 95 | 
 96 | **Signature:** `toLocaleString() : String`
 97 | 
 98 | **Description:** Converts this BigInt to a String using local number formatting conventions. The current implementation actually only returns the same as toString().
 99 | 
100 | **Returns:**
101 | 
102 | a String using local number formatting conventions.
103 | 
104 | ---
105 | 
106 | ### toString
107 | 
108 | **Signature:** `toString() : String`
109 | 
110 | **Description:** A String representation of this BigInt.
111 | 
112 | **Returns:**
113 | 
114 | a String representation of this BigInt.
115 | 
116 | ---
117 | 
118 | ### toString
119 | 
120 | **Signature:** `toString(radix : Number) : String`
121 | 
122 | **Description:** Converts the BigInt into a string using the specified radix (base).
123 | 
124 | **Parameters:**
125 | 
126 | - `radix`: the radix to use.
127 | 
128 | **Returns:**
129 | 
130 | a String representation of this BigInt.
131 | 
132 | ---
```

--------------------------------------------------------------------------------
/docs/TopLevel/Module.md:
--------------------------------------------------------------------------------

```markdown
 1 | ## Package: TopLevel
 2 | 
 3 | # Class Module
 4 | 
 5 | ## Inheritance Hierarchy
 6 | 
 7 | - Object
 8 |   - Module
 9 | 
10 | ## Description
11 | 
12 | CommonJS modules are JavaScript files that are loaded using the require(String) function. This function returns a module object, which wraps the script code from the file. Within a module implementation, the module object can be accessed via the module variable. A module has a unique absolute id. The same module may be resolved by require(String) for different path arguments, like relative paths (starting with "./" or "../"), or absolute paths. See the documentation of require for more details about the lookup procedure. Every module object has an exports property which can be used by the module implementation to expose its public functions or properties. Only functions and properties that are explicitly exported are accessible from other modules, all others are private and not visible. For convenience, the global exports variable is by default also initialized with the module.exports property of the current module. In the most simple case, module elements can be exposed by adding them to the exports object, like: // Greeting.js exports.sayHello = function() { return 'Hello World!'; }; This is equivalent to: // Greeting.js module.exports.sayHello = function() { return 'Hello World!'; }; With the above implementation, a caller (for example another module in the same directory) could call the module function like this: var message = require('./Greeting').sayHello(); It is also possible to replace the whole module exports object with a completely different value, for example with a function: // Greeting.js module.exports = function sayHello() { return 'Hi!'; } Now the result of require would be a function, which can be invoked directly like: var message = require('./Greeting')(); This construction can be used for exporting constructor functions, so that a module becomes something like a class: // Greeting.js function Greeting() { this.message = 'Hi!'; } Greeting.prototype.getMessage = function() { return this.message; } module.exports = Greeting; which would be used like: var Greeting = require('./Greeting'); var m = new Greeting().getMessage();
13 | 
14 | ## Properties
15 | 
16 | ### cartridge
17 | 
18 | **Type:** String
19 | 
20 | The name of the cartridge which contains the module.
21 | 
22 | ### exports
23 | 
24 | **Type:** Object
25 | 
26 | The exports of the module.
27 | 
28 | ### id
29 | 
30 | **Type:** String
31 | 
32 | The absolute, normalized id of the module, which uniquely identifies it. A call to the
33 |  global.require(String) function with this id would resolve this module.
34 | 
35 | ### superModule
36 | 
37 | **Type:** Module
38 | 
39 | The module (if exists) that is overridden by this module. The super module would have the same path as the
40 |  current module but its code location would be checked later in the lookup sequence. This property is useful to
41 |  reuse functionality implemented in overridden modules.
42 | 
43 | ## Constructor Summary
44 | 
45 | ## Method Summary
```

--------------------------------------------------------------------------------
/docs/sfra/billing.md:
--------------------------------------------------------------------------------

```markdown
 1 | # SFRA Billing Model
 2 | 
 3 | ## Overview
 4 | 
 5 | The Billing model represents billing information for the current basket or order in SFRA applications. It provides a simple structure for managing billing address, payment information, and address associations.
 6 | 
 7 | ## Constructor
 8 | 
 9 | ```javascript
10 | function billing(addressModel, paymentModel, associatedAddressId)
11 | ```
12 | 
13 | Creates a Billing model instance with billing address, payment, and address association information.
14 | 
15 | ### Parameters
16 | 
17 | - `addressModel` (Object) - The billing address of the current basket
18 | - `paymentModel` (Object) - Payment information for the current basket
19 | - `associatedAddressId` (string) - The matching ID of the shipping or customer address
20 | 
21 | ## Properties
22 | 
23 | ### billingAddress
24 | **Type:** Object
25 | 
26 | The billing address model containing complete address information including:
27 | - Address lines, city, state, postal code
28 | - Customer name and contact information
29 | - Country code and other address details
30 | 
31 | ### payment
32 | **Type:** Object
33 | 
34 | Payment model containing payment method information such as:
35 | - Credit card details (masked)
36 | - Payment processor information
37 | - Payment method type
38 | - Payment instrument details
39 | 
40 | ### matchingAddressId
41 | **Type:** string
42 | 
43 | The ID that matches this billing address to either:
44 | - A shipping address (if billing and shipping are the same)
45 | - A saved customer address
46 | - null if it's a new address
47 | 
48 | ## Usage Example
49 | 
50 | ```javascript
51 | var BillingModel = require('*/cartridge/models/billing');
52 | var AddressModel = require('*/cartridge/models/address');
53 | var PaymentModel = require('*/cartridge/models/payment');
54 | 
55 | // Create address and payment models
56 | var billingAddress = new AddressModel(basket.billingAddress);
57 | var paymentInfo = new PaymentModel(basket, customer);
58 | var matchingId = getMatchingAddressId(basket.billingAddress);
59 | 
60 | // Create billing model
61 | var billing = new BillingModel(billingAddress, paymentInfo, matchingId);
62 | 
63 | // Access billing properties
64 | console.log(billing.billingAddress.firstName);
65 | console.log(billing.payment.selectedPaymentInstruments);
66 | console.log(billing.matchingAddressId);
67 | ```
68 | 
69 | ## Address Matching
70 | 
71 | The `matchingAddressId` property helps determine:
72 | - If the billing address matches a shipping address
73 | - If the billing address matches a saved customer address
74 | - Whether to show "same as shipping" options in the UI
75 | - Address management and selection logic
76 | 
77 | ## Notes
78 | 
79 | - Simple container model that aggregates billing-related information
80 | - Used extensively in checkout and order processing
81 | - Address matching enables UI optimizations like "same as shipping"
82 | - Works with both new and saved addresses
83 | - Integrates with payment processing workflows
84 | 
85 | ## Related Models
86 | 
87 | - **AddressModel** - Used for billing address formatting
88 | - **PaymentModel** - Used for payment information
89 | - **OrderModel** - Uses billing model for order information
90 | - **Cart Model** - May include billing information during checkout
91 | 
```

--------------------------------------------------------------------------------
/src/clients/docs/referenced-types-extractor.ts:
--------------------------------------------------------------------------------

```typescript
 1 | /**
 2 |  * Referenced Types Extractor
 3 |  *
 4 |  * Responsible for extracting referenced types from SFCC class documentation
 5 |  * content. Analyzes property types, method signatures, return types, and
 6 |  * parameter types to identify related classes.
 7 |  *
 8 |  * Single Responsibility: Type reference extraction from documentation content
 9 |  */
10 | 
11 | export class ReferencedTypesExtractor {
12 |   /**
13 |    * Parse markdown content and extract referenced types from a class
14 |    */
15 |   static extractReferencedTypes(content: string): string[] {
16 |     const referencedTypes = new Set<string>();
17 |     const lines = content.split('\n');
18 | 
19 |     for (const line of lines) {
20 |       // Extract types from property definitions
21 |       const propTypeMatch = line.match(/\*\*Type:\*\*\s*([A-Za-z][A-Za-z0-9.]*)/);
22 |       if (propTypeMatch) {
23 |         const type = propTypeMatch[1];
24 |         // Only include SFCC types (those that start with uppercase or contain dots)
25 |         if (this.isSFCCType(type)) {
26 |           referencedTypes.add(type);
27 |         }
28 |       }
29 | 
30 |       // Extract return types from method signatures
31 |       const methodReturnMatch = line.match(/:\s*([A-Za-z][A-Za-z0-9.]*)\s*$/);
32 |       if (methodReturnMatch) {
33 |         const type = methodReturnMatch[1];
34 |         if (this.isSFCCType(type)) {
35 |           referencedTypes.add(type);
36 |         }
37 |       }
38 | 
39 |       // Extract parameter types from method signatures
40 |       const paramMatches = line.match(/\(\s*([^)]+)\s*\)/);
41 |       if (paramMatches) {
42 |         const params = paramMatches[1];
43 |         const typeMatches = params.match(/:\s*([A-Za-z][A-Za-z0-9.]*)/g);
44 |         if (typeMatches) {
45 |           typeMatches.forEach(match => {
46 |             const type = match.replace(/:\s*/, '');
47 |             if (this.isSFCCType(type)) {
48 |               referencedTypes.add(type);
49 |             }
50 |           });
51 |         }
52 |       }
53 |     }
54 | 
55 |     return Array.from(referencedTypes);
56 |   }
57 | 
58 |   /**
59 |    * Check if a type name represents an SFCC type
60 |    * SFCC types typically start with uppercase or contain dots
61 |    */
62 |   private static isSFCCType(type: string): boolean {
63 |     return /^[A-Z]/.test(type) || type.includes('.');
64 |   }
65 | 
66 |   /**
67 |    * Filter out circular references and self-references
68 |    */
69 |   static filterCircularReferences(
70 |     referencedTypes: string[],
71 |     currentClassName: string,
72 |   ): string[] {
73 |     return referencedTypes.filter(typeName => {
74 |       // Skip if it's the same class to avoid circular references
75 |       if (typeName === currentClassName || typeName.endsWith(`.${currentClassName}`)) {
76 |         return false;
77 |       }
78 |       return true;
79 |     });
80 |   }
81 | 
82 |   /**
83 |    * Extract and filter referenced types with circular reference protection
84 |    */
85 |   static extractFilteredReferencedTypes(
86 |     content: string,
87 |     currentClassName: string,
88 |   ): string[] {
89 |     const referencedTypes = this.extractReferencedTypes(content);
90 |     return this.filterCircularReferences(referencedTypes, currentClassName);
91 |   }
92 | }
93 | 
```

--------------------------------------------------------------------------------
/docs/dw_svc/ServiceProfile.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: dw.svc
  2 | 
  3 | # Class ServiceProfile
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - dw.object.PersistentObject
  9 |   - dw.object.ExtensibleObject
 10 |     - dw.svc.ServiceProfile
 11 | 
 12 | ## Description
 13 | 
 14 | Configuration object for Service Profiles.
 15 | 
 16 | ## Properties
 17 | 
 18 | ### cbCalls
 19 | 
 20 | **Type:** Number (Read Only)
 21 | 
 22 | The maximum number of errors in an interval allowed by the circuit breaker.
 23 | 
 24 | ### cbMillis
 25 | 
 26 | **Type:** Number (Read Only)
 27 | 
 28 | The interval of the circuit breaker in milliseconds.
 29 | 
 30 | ### ID
 31 | 
 32 | **Type:** String (Read Only)
 33 | 
 34 | The unique Service ID.
 35 | 
 36 | ### rateLimitCalls
 37 | 
 38 | **Type:** Number (Read Only)
 39 | 
 40 | The maximum number of calls in an interval allowed by the rate limiter.
 41 | 
 42 | ### rateLimitMillis
 43 | 
 44 | **Type:** Number (Read Only)
 45 | 
 46 | The interval of the rate limiter in milliseconds.
 47 | 
 48 | ### timeoutMillis
 49 | 
 50 | **Type:** Number (Read Only)
 51 | 
 52 | The service call timeout in milliseconds.
 53 | 
 54 | ## Constructor Summary
 55 | 
 56 | ## Method Summary
 57 | 
 58 | ### getCbCalls
 59 | 
 60 | **Signature:** `getCbCalls() : Number`
 61 | 
 62 | Returns the maximum number of errors in an interval allowed by the circuit breaker.
 63 | 
 64 | ### getCbMillis
 65 | 
 66 | **Signature:** `getCbMillis() : Number`
 67 | 
 68 | Returns the interval of the circuit breaker in milliseconds.
 69 | 
 70 | ### getID
 71 | 
 72 | **Signature:** `getID() : String`
 73 | 
 74 | Returns the unique Service ID.
 75 | 
 76 | ### getRateLimitCalls
 77 | 
 78 | **Signature:** `getRateLimitCalls() : Number`
 79 | 
 80 | Returns the maximum number of calls in an interval allowed by the rate limiter.
 81 | 
 82 | ### getRateLimitMillis
 83 | 
 84 | **Signature:** `getRateLimitMillis() : Number`
 85 | 
 86 | Returns the interval of the rate limiter in milliseconds.
 87 | 
 88 | ### getTimeoutMillis
 89 | 
 90 | **Signature:** `getTimeoutMillis() : Number`
 91 | 
 92 | Returns the service call timeout in milliseconds.
 93 | 
 94 | ## Method Detail
 95 | 
 96 | ## Method Details
 97 | 
 98 | ### getCbCalls
 99 | 
100 | **Signature:** `getCbCalls() : Number`
101 | 
102 | **Description:** Returns the maximum number of errors in an interval allowed by the circuit breaker.
103 | 
104 | **Returns:**
105 | 
106 | Maximum number of errors in an interval allowed by the circuit breaker.
107 | 
108 | ---
109 | 
110 | ### getCbMillis
111 | 
112 | **Signature:** `getCbMillis() : Number`
113 | 
114 | **Description:** Returns the interval of the circuit breaker in milliseconds.
115 | 
116 | **Returns:**
117 | 
118 | Circuit breaker interval in milliseconds.
119 | 
120 | ---
121 | 
122 | ### getID
123 | 
124 | **Signature:** `getID() : String`
125 | 
126 | **Description:** Returns the unique Service ID.
127 | 
128 | **Returns:**
129 | 
130 | unique Service ID
131 | 
132 | ---
133 | 
134 | ### getRateLimitCalls
135 | 
136 | **Signature:** `getRateLimitCalls() : Number`
137 | 
138 | **Description:** Returns the maximum number of calls in an interval allowed by the rate limiter.
139 | 
140 | **Returns:**
141 | 
142 | Maximum number of calls in an interval allowed by the rate limiter.
143 | 
144 | ---
145 | 
146 | ### getRateLimitMillis
147 | 
148 | **Signature:** `getRateLimitMillis() : Number`
149 | 
150 | **Description:** Returns the interval of the rate limiter in milliseconds.
151 | 
152 | **Returns:**
153 | 
154 | Interval of the rate limiter in milliseconds.
155 | 
156 | ---
157 | 
158 | ### getTimeoutMillis
159 | 
160 | **Signature:** `getTimeoutMillis() : Number`
161 | 
162 | **Description:** Returns the service call timeout in milliseconds.
163 | 
164 | **Returns:**
165 | 
166 | Service call timeout in milliseconds.
167 | 
168 | ---
```

--------------------------------------------------------------------------------
/docs/dw_system/Pipeline.md:
--------------------------------------------------------------------------------

```markdown
 1 | ## Package: dw.system
 2 | 
 3 | # Class Pipeline
 4 | 
 5 | ## Inheritance Hierarchy
 6 | 
 7 | - Object
 8 |   - dw.system.Pipeline
 9 | 
10 | ## Description
11 | 
12 | A helper for executing pipelines from JavaScript. The main purpose for this API is to invoke process pipelines from JavaScript controllers, e.g. pipelines that return with an end node and that do not perform user interactions. Pipelines that span across multiple requests (e.g. that contain Interaction-Continue-Nodes) are not supported and may not work as expected. The pipeline will be executed within the current request and not by a remote call, so this API works roughly like a Call node in a pipeline. The called pipeline will get its own local pipeline dictionary. The dictionary can be populated with initial values from an argument object. Any results from the pipeline can be read from the pipeline dictionary that is returned by the execute(String) methods. If an exception occurs during the pipeline processing, the Error-branch of the pipeline will be called. If no error handling exists for the pipeline, the exception will be propagated and can be handled by the script code. If the pipeline finishes with an End node, the name of the end node can be obtained from the returned pipeline dictionary under the key 'EndNodeName'. Example: let Pipeline = require('dw/system/Pipeline'); let pdict = Pipeline.execute('MyPipeline-Start', { MyArgString: 'someStringValue', MyArgNumber: 12345, MyArgBoolean: true }); let result = pdict.MyReturnValue; This feature requires an API version >=15.5.
13 | 
14 | ## Constructor Summary
15 | 
16 | ## Method Summary
17 | 
18 | ### execute
19 | 
20 | **Signature:** `static execute(pipeline : String) : PipelineDictionary`
21 | 
22 | Executes a pipeline.
23 | 
24 | ### execute
25 | 
26 | **Signature:** `static execute(pipeline : String, args : Object) : PipelineDictionary`
27 | 
28 | Executes a pipeline.
29 | 
30 | ## Method Detail
31 | 
32 | ## Method Details
33 | 
34 | ### execute
35 | 
36 | **Signature:** `static execute(pipeline : String) : PipelineDictionary`
37 | 
38 | **Description:** Executes a pipeline.
39 | 
40 | **API Versioned:**
41 | 
42 | From version 15.5. New convenience method for easier migration of pipeline-based systems to JavaScript controllers.
43 | 
44 | **Parameters:**
45 | 
46 | - `pipeline`: the pipeline identifier, must consist of the pipeline name and the start node name, like 'PipelineName-StartNodeName'
47 | 
48 | **Returns:**
49 | 
50 | the pipeline dictionary with the pipeline results
51 | 
52 | ---
53 | 
54 | ### execute
55 | 
56 | **Signature:** `static execute(pipeline : String, args : Object) : PipelineDictionary`
57 | 
58 | **Description:** Executes a pipeline. The pipeline dictionary will be initialized with the provided arguments.
59 | 
60 | **API Versioned:**
61 | 
62 | From version 15.5. New convenience method for easier migration of pipeline-based systems to JavaScript controllers.
63 | 
64 | **Parameters:**
65 | 
66 | - `pipeline`: the pipeline identifier, must consist of a pipeline name and a start node name, like 'PipelineName-StartNodeName'
67 | - `args`: an object whose properties represent the initial values of the pipeline dictionary
68 | 
69 | **Returns:**
70 | 
71 | the pipeline dictionary with the pipeline results
72 | 
73 | ---
```

--------------------------------------------------------------------------------
/docs/dw_order/PaymentProcessor.md:
--------------------------------------------------------------------------------

```markdown
 1 | ## Package: dw.order
 2 | 
 3 | # Class PaymentProcessor
 4 | 
 5 | ## Inheritance Hierarchy
 6 | 
 7 | - Object
 8 |   - dw.object.PersistentObject
 9 |   - dw.object.ExtensibleObject
10 |     - dw.order.PaymentProcessor
11 | 
12 | ## Description
13 | 
14 | A PaymentProcessor represents an entity that processes payments of one or more types. In the B2C Commerce system, a payment processor is just a container for configuration values, which describe, for example, the parameters (URL, merchant ID, password, etc) required for connecting to a payment gateway. The system has several built in PaymentProcessors. These are: BASIC_CREDIT BASIC_GIFT_CERTIFICATE CYBERSOURCE_CREDIT CYBERSOURCE_BML PAYPAL_CREDIT PAYPAL_EXPRESS VERISIGN_CREDIT The first two of these are merely placeholders with no associated preference values. The remaining system payment processors define preference values which are maintained in the Business Manager and are used in conjunction with built-in B2C Commerce payment integrations. Preferences of system PaymentProcessors are not intended to be read programmatically. Merchants may also define custom payment processors. This is done by defining a payment processor with an arbitrary ID in the Business Manager, and then configuring an attribute group with the same ID on the SitePreferences system object. Attributes added to the group will be considered preferences of the payment processor and will be readable through getPreferenceValue(String). Merchants can design their checkout process to read these preferences at run time for connecting to their payment gateways. Every PaymentMethod in the system is associated with at most one PaymentProcessor. This basically represents the physical payment gateway which processes the (logical) payment method. Each payment processor may be associated with an arbitrary number of payment methods. Also, each payment transaction has one PaymentProcessor which is set by custom code during the checkout process.
15 | 
16 | ## Properties
17 | 
18 | ### ID
19 | 
20 | **Type:** String (Read Only)
21 | 
22 | The 'ID' of this processor.
23 | 
24 | ## Constructor Summary
25 | 
26 | ## Method Summary
27 | 
28 | ### getID
29 | 
30 | **Signature:** `getID() : String`
31 | 
32 | Returns the 'ID' of this processor.
33 | 
34 | ### getPreferenceValue
35 | 
36 | **Signature:** `getPreferenceValue(name : String) : Object`
37 | 
38 | Returns the value of the specified preference for this payment processor.
39 | 
40 | ## Method Detail
41 | 
42 | ## Method Details
43 | 
44 | ### getID
45 | 
46 | **Signature:** `getID() : String`
47 | 
48 | **Description:** Returns the 'ID' of this processor.
49 | 
50 | **Returns:**
51 | 
52 | the 'ID' of this processor, e.g. "BASIC_CREDIT".
53 | 
54 | ---
55 | 
56 | ### getPreferenceValue
57 | 
58 | **Signature:** `getPreferenceValue(name : String) : Object`
59 | 
60 | **Description:** Returns the value of the specified preference for this payment processor. If the preference name is invalid (or null) or no preference value is defined for this payment processor, null is returned.
61 | 
62 | **Parameters:**
63 | 
64 | - `name`: preference name. Typically an attribute defined on SitePreferences contained in an attribute group whose name is the same as this.ID.
65 | 
66 | **Returns:**
67 | 
68 | preference value, or null.
69 | 
70 | ---
```

--------------------------------------------------------------------------------
/src/tool-configs/best-practices-tool-config.ts:
--------------------------------------------------------------------------------

```typescript
 1 | import { GenericToolSpec, ToolExecutionContext } from '../core/handlers/base-handler.js';
 2 | import { ToolArguments } from '../core/handlers/base-handler.js';
 3 | import { ValidationHelpers, CommonValidations } from '../core/handlers/validation-helpers.js';
 4 | import { SFCCBestPracticesClient } from '../clients/best-practices-client.js';
 5 | 
 6 | export const BEST_PRACTICE_TOOL_NAMES = [
 7 |   'get_available_best_practice_guides',
 8 |   'get_best_practice_guide',
 9 |   'search_best_practices',
10 |   'get_hook_reference',
11 | ] as const;
12 | 
13 | export type BestPracticeToolName = typeof BEST_PRACTICE_TOOL_NAMES[number];
14 | export const BEST_PRACTICE_TOOL_NAMES_SET = new Set<BestPracticeToolName>(BEST_PRACTICE_TOOL_NAMES);
15 | 
16 | /**
17 |  * Configuration for SFCC best practices tools
18 |  * Maps each tool to its validation, execution, and messaging logic
19 |  */
20 | export const BEST_PRACTICES_TOOL_CONFIG: Record<BestPracticeToolName, GenericToolSpec<ToolArguments, any>> = {
21 |   get_available_best_practice_guides: {
22 |     defaults: (args: ToolArguments) => args,
23 |     validate: (_args: ToolArguments, _toolName: string) => {
24 |       // No validation needed for list operation
25 |     },
26 |     exec: async (_args: ToolArguments, context: ToolExecutionContext) => {
27 |       const client = context.bestPracticesClient as SFCCBestPracticesClient;
28 |       return client.getAvailableGuides();
29 |     },
30 |     logMessage: (_args: ToolArguments) => 'List guides',
31 |   },
32 | 
33 |   get_best_practice_guide: {
34 |     defaults: (args: ToolArguments) => args,
35 |     validate: (args: ToolArguments, toolName: string) => {
36 |       ValidationHelpers.validateArguments(args, CommonValidations.requiredString('guideName'), toolName);
37 |     },
38 |     exec: async (args: ToolArguments, context: ToolExecutionContext) => {
39 |       const client = context.bestPracticesClient as SFCCBestPracticesClient;
40 |       return client.getBestPracticeGuide(args.guideName as string);
41 |     },
42 |     logMessage: (args: ToolArguments) => `Guide ${args.guideName}`,
43 |   },
44 | 
45 |   search_best_practices: {
46 |     defaults: (args: ToolArguments) => args,
47 |     validate: (args: ToolArguments, toolName: string) => {
48 |       ValidationHelpers.validateArguments(args, CommonValidations.requiredString('query'), toolName);
49 |     },
50 |     exec: async (args: ToolArguments, context: ToolExecutionContext) => {
51 |       const client = context.bestPracticesClient as SFCCBestPracticesClient;
52 |       return client.searchBestPractices(args.query as string);
53 |     },
54 |     logMessage: (args: ToolArguments) => `Search best practices ${args.query}`,
55 |   },
56 | 
57 |   get_hook_reference: {
58 |     defaults: (args: ToolArguments) => args,
59 |     validate: (args: ToolArguments, toolName: string) => {
60 |       ValidationHelpers.validateArguments(args, CommonValidations.requiredString('guideName'), toolName);
61 |     },
62 |     exec: async (args: ToolArguments, context: ToolExecutionContext) => {
63 |       const client = context.bestPracticesClient as SFCCBestPracticesClient;
64 |       return client.getHookReference(args.guideName as string);
65 |     },
66 |     logMessage: (args: ToolArguments) => `Hook reference ${args.guideName}`,
67 |   },
68 | };
69 | 
```

--------------------------------------------------------------------------------
/src/clients/ocapi/site-preferences-client.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * OCAPI Site Preferences Client
  3 |  *
  4 |  * This module handles all SFCC site preference related operations including
  5 |  * searching preferences across different instance types and preference groups.
  6 |  */
  7 | 
  8 | import { OCAPIConfig } from '../../types/types.js';
  9 | import { OCAPIAuthClient } from '../base/ocapi-auth-client.js';
 10 | import { QueryBuilder } from '../../utils/query-builder.js';
 11 | import { Validator } from '../../utils/validator.js';
 12 | import { buildOCAPIBaseUrl } from '../../utils/ocapi-url-builder.js';
 13 | 
 14 | /**
 15 |  * Interface for search request structure
 16 |  */
 17 | interface SearchRequest {
 18 |   query?: {
 19 |     text_query?: {
 20 |       fields: string[];
 21 |       search_phrase: string;
 22 |     };
 23 |     term_query?: {
 24 |       fields: string[];
 25 |       operator: string;
 26 |       values: any[];
 27 |     };
 28 |     filtered_query?: {
 29 |       filter: any;
 30 |       query: any;
 31 |     };
 32 |     bool_query?: {
 33 |       must?: any[];
 34 |       must_not?: any[];
 35 |       should?: any[];
 36 |     };
 37 |     match_all_query?: {};
 38 |   };
 39 |   sorts?: Array<{
 40 |     field: string;
 41 |     sort_order?: 'asc' | 'desc';
 42 |   }>;
 43 |   start?: number;
 44 |   count?: number;
 45 |   select?: string;
 46 | }
 47 | 
 48 | /**
 49 |  * Site preferences search options
 50 |  */
 51 | interface SitePreferencesOptions {
 52 |   maskPasswords?: boolean;
 53 |   expand?: string;
 54 | }
 55 | 
 56 | /**
 57 |  * OCAPI Site Preferences Client
 58 |  * Specialized client for site preference operations
 59 |  */
 60 | export class OCAPISitePreferencesClient extends OCAPIAuthClient {
 61 |   constructor(config: OCAPIConfig) {
 62 |     super(config);
 63 |     // Override the baseUrl for this specialized client
 64 |     this.baseUrl = buildOCAPIBaseUrl(config);
 65 |   }
 66 | 
 67 |   /**
 68 |    * Search site preferences across sites in the specified preference group and instance
 69 |    *
 70 |    * Allows searching for preferences by id, display_name, description, and value_type
 71 |    * Supports text queries, term queries, filtered queries, and boolean queries
 72 |    *
 73 |    * Searchable fields:
 74 |    * - id - String
 75 |    * - display_name - Localized String
 76 |    * - description - Localized String
 77 |    * - value_type - one of {
 78 |    *    string, int, double, text, html, date, image, boolean, money, quantity,
 79 |    *    datetime, email, password, set_of_string, set_of_int, set_of_double, enum_of_string, enum_of_int
 80 |    *  }
 81 |    *
 82 |    * Note: value_type can only be joined with other attributes using a conjunction (AND)
 83 |    * Only searchable attributes can be used in sorting
 84 |    */
 85 |   async searchSitePreferences(
 86 |     groupId: string,
 87 |     instanceType: string,
 88 |     searchRequest: SearchRequest,
 89 |     options?: SitePreferencesOptions,
 90 |   ): Promise<any> {
 91 |     Validator.validateRequired({ groupId, instanceType }, ['groupId', 'instanceType']);
 92 |     const validatedInstanceType = Validator.validateInstanceType(instanceType);
 93 |     Validator.validateSearchRequest(searchRequest);
 94 | 
 95 |     let endpoint = `/site_preferences/preference_groups/${encodeURIComponent(groupId)}/${validatedInstanceType}/preference_search`;
 96 | 
 97 |     if (options) {
 98 |       const queryString = QueryBuilder.fromObject(options);
 99 |       if (queryString) {
100 |         endpoint += `?${queryString}`;
101 |       }
102 |     }
103 | 
104 |     return this.post(endpoint, searchRequest);
105 |   }
106 | }
107 | 
```

--------------------------------------------------------------------------------
/docs/dw_job/JobStepExecution.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: dw.job
  2 | 
  3 | # Class JobStepExecution
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - dw.job.JobStepExecution
  9 | 
 10 | ## Description
 11 | 
 12 | Represents an execution of a step that belongs to a job. The job execution this step execution belongs to can be accessed via getJobExecution(). If a pipeline is used to implement a step this step execution is available in the pipeline dictionary under the key 'JobStepExecution'. If a script module is used to implement a step this step execution is available as the second parameter of the module's function that is used to execute the step, e.g.:
 13 | 
 14 | ```javascript
 15 |  ...
 16 |  exports.execute( parameters, stepExecution)
 17 |  {
 18 |       ...
 19 |       var jobExecution = stepExecution.getJobExecution();
 20 |       ...
 21 |  }
 22 |  ...
 23 | ```
 24 | 
 25 | ## Properties
 26 | 
 27 | ### ID
 28 | 
 29 | **Type:** String (Read Only)
 30 | 
 31 | The ID of this step execution.
 32 | 
 33 | ### jobExecution
 34 | 
 35 | **Type:** JobExecution (Read Only)
 36 | 
 37 | The job execution this step execution belongs to.
 38 | 
 39 | ### stepID
 40 | 
 41 | **Type:** String (Read Only)
 42 | 
 43 | The ID of the step this step execution belongs to.
 44 | 
 45 | ### stepTypeID
 46 | 
 47 | **Type:** String (Read Only)
 48 | 
 49 | The ID of the step type of the step this step execution belongs to.
 50 | 
 51 | ## Constructor Summary
 52 | 
 53 | This class does not have a constructor, so you cannot create it directly.
 54 | 
 55 | ## Method Summary
 56 | 
 57 | ### getID
 58 | 
 59 | **Signature:** `getID() : String`
 60 | 
 61 | Returns the ID of this step execution.
 62 | 
 63 | ### getJobExecution
 64 | 
 65 | **Signature:** `getJobExecution() : JobExecution`
 66 | 
 67 | Returns the job execution this step execution belongs to.
 68 | 
 69 | ### getParameterValue
 70 | 
 71 | **Signature:** `getParameterValue(name : String) : Object`
 72 | 
 73 | Returns the value of the parameter of the step this step execution belongs to.
 74 | 
 75 | ### getStepID
 76 | 
 77 | **Signature:** `getStepID() : String`
 78 | 
 79 | Returns the ID of the step this step execution belongs to.
 80 | 
 81 | ### getStepTypeID
 82 | 
 83 | **Signature:** `getStepTypeID() : String`
 84 | 
 85 | Returns the ID of the step type of the step this step execution belongs to.
 86 | 
 87 | ## Method Details
 88 | 
 89 | ### getID
 90 | 
 91 | **Signature:** `getID() : String`
 92 | 
 93 | **Description:** Returns the ID of this step execution.
 94 | 
 95 | **Returns:**
 96 | 
 97 | the ID of this step execution.
 98 | 
 99 | ---
100 | 
101 | ### getJobExecution
102 | 
103 | **Signature:** `getJobExecution() : JobExecution`
104 | 
105 | **Description:** Returns the job execution this step execution belongs to.
106 | 
107 | **Returns:**
108 | 
109 | the job execution this step execution belongs to.
110 | 
111 | ---
112 | 
113 | ### getParameterValue
114 | 
115 | **Signature:** `getParameterValue(name : String) : Object`
116 | 
117 | **Description:** Returns the value of the parameter of the step this step execution belongs to.
118 | 
119 | **Parameters:**
120 | 
121 | - `name`: The name of the parameter.
122 | 
123 | **Returns:**
124 | 
125 | the value of the parameter of the step this step execution belongs to.
126 | 
127 | ---
128 | 
129 | ### getStepID
130 | 
131 | **Signature:** `getStepID() : String`
132 | 
133 | **Description:** Returns the ID of the step this step execution belongs to.
134 | 
135 | **Returns:**
136 | 
137 | the ID of the step this step execution belongs to.
138 | 
139 | ---
140 | 
141 | ### getStepTypeID
142 | 
143 | **Signature:** `getStepTypeID() : String`
144 | 
145 | **Description:** Returns the ID of the step type of the step this step execution belongs to.
146 | 
147 | **Returns:**
148 | 
149 | the ID of the step type of the step this step execution belongs to.
150 | 
151 | ---
152 | 
```

--------------------------------------------------------------------------------
/docs/dw_util/MappingMgr.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: dw.util
  2 | 
  3 | # Class MappingMgr
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - dw.util.MappingMgr
  9 | 
 10 | ## Description
 11 | 
 12 | Used to manage and interface with mappings loaded into the system via the ImportKeyValueMapping job step. Class can be used to retrieve values for known keys, iterate over all keys known in a mapping or list all known mappings. Mappings are read into the system using the ImportKeyValueMapping job step. Generic mapping capability enables you to map keys to values, with the mapping stored in a high-performance data store that is independent of the database. This supports large datasets, with high performance for lookup. An example of using this feature is to map SKUs from a backend system to Commerce Cloud Digital SKUs on-the-fly in Digital script, so that interaction with the backend system is transparent and does not require adding Digital SKUs to the third party system.
 13 | 
 14 | ## Properties
 15 | 
 16 | ### mappingNames
 17 | 
 18 | **Type:** Collection (Read Only)
 19 | 
 20 | List all known mappings.
 21 | 
 22 | ## Constructor Summary
 23 | 
 24 | ## Method Summary
 25 | 
 26 | ### get
 27 | 
 28 | **Signature:** `static get(mappingName : String, key : MappingKey) : Map`
 29 | 
 30 | Returns a map containing value(s) associated to the specified key for the specified mapping.
 31 | 
 32 | ### getFirst
 33 | 
 34 | **Signature:** `static getFirst(mappingName : String, key : MappingKey) : String`
 35 | 
 36 | Gets the first string value of a mapping by name and key.
 37 | 
 38 | ### getMappingNames
 39 | 
 40 | **Signature:** `static getMappingNames() : Collection`
 41 | 
 42 | List all known mappings.
 43 | 
 44 | ### keyIterator
 45 | 
 46 | **Signature:** `static keyIterator(mappingName : String) : SeekableIterator`
 47 | 
 48 | Key iterator over known mapping keys by mapping name.
 49 | 
 50 | ## Method Detail
 51 | 
 52 | ## Method Details
 53 | 
 54 | ### get
 55 | 
 56 | **Signature:** `static get(mappingName : String, key : MappingKey) : Map`
 57 | 
 58 | **Description:** Returns a map containing value(s) associated to the specified key for the specified mapping.
 59 | 
 60 | **Parameters:**
 61 | 
 62 | - `mappingName`: the mapping name
 63 | - `key`: the key
 64 | 
 65 | **Throws:**
 66 | 
 67 | IllegalArgumentException - if mappingName is unknown
 68 | 
 69 | ---
 70 | 
 71 | ### getFirst
 72 | 
 73 | **Signature:** `static getFirst(mappingName : String, key : MappingKey) : String`
 74 | 
 75 | **Description:** Gets the first string value of a mapping by name and key. Ordering is determined by the input CSV file. Throws an exception if mappingName does not exist.
 76 | 
 77 | **Parameters:**
 78 | 
 79 | - `mappingName`: the mapping name
 80 | - `key`: the key
 81 | 
 82 | **Returns:**
 83 | 
 84 | the value if a single value. The first value sequentially if a compound value.
 85 | 
 86 | **Throws:**
 87 | 
 88 | IllegalArgumentException - if mappingName is unknown
 89 | 
 90 | ---
 91 | 
 92 | ### getMappingNames
 93 | 
 94 | **Signature:** `static getMappingNames() : Collection`
 95 | 
 96 | **Description:** List all known mappings.
 97 | 
 98 | **Returns:**
 99 | 
100 | the collection of mapping names
101 | 
102 | ---
103 | 
104 | ### keyIterator
105 | 
106 | **Signature:** `static keyIterator(mappingName : String) : SeekableIterator`
107 | 
108 | **Description:** Key iterator over known mapping keys by mapping name. Throws an exception if mappingName does not exist.
109 | 
110 | **Parameters:**
111 | 
112 | - `mappingName`: the mapping name
113 | 
114 | **Returns:**
115 | 
116 | the seekable iterator
117 | 
118 | **Throws:**
119 | 
120 | IllegalArgumentException - if mappingName is unknown
121 | 
122 | ---
```

--------------------------------------------------------------------------------
/docs/dw_suggest/SuggestedTerms.md:
--------------------------------------------------------------------------------

```markdown
  1 | ## Package: dw.suggest
  2 | 
  3 | # Class SuggestedTerms
  4 | 
  5 | ## Inheritance Hierarchy
  6 | 
  7 | - Object
  8 |   - dw.suggest.SuggestedTerms
  9 | 
 10 | ## Description
 11 | 
 12 | This container represents a list of suggested terms, all belonging to a particular single original term of the users input search phrase. Each user input term of the search phrase is being processed separately by the suggestion engine. For each original term, a list of terms will be suggested, either completed terms, corrected terms or even the exact term if they are known to the engine as they are. A instance of this class refers to the original unmodified term, as well as to a list of SuggestedTerms objects representing a single suggested term.
 13 | 
 14 | ## Properties
 15 | 
 16 | ### empty
 17 | 
 18 | **Type:** boolean (Read Only)
 19 | 
 20 | Returns true if this set of suggested terms is empty.
 21 | 
 22 | ### firstTerm
 23 | 
 24 | **Type:** SuggestedTerm (Read Only)
 25 | 
 26 | This method returns the suggested term which is considered best matching
 27 |  with the original term. See getTerms() for a note on ordering of
 28 |  suggested terms.
 29 | 
 30 | ### originalTerm
 31 | 
 32 | **Type:** String (Read Only)
 33 | 
 34 | The original term of the user input, for which this instance
 35 |  provides a list of suggested terms. Suggested terms can either be corrected,
 36 |  or completed or exact matching.
 37 | 
 38 | ### terms
 39 | 
 40 | **Type:** Iterator (Read Only)
 41 | 
 42 | The list of SuggestedTerms suggested for the original term.
 43 | 
 44 | ## Constructor Summary
 45 | 
 46 | ## Method Summary
 47 | 
 48 | ### getFirstTerm
 49 | 
 50 | **Signature:** `getFirstTerm() : SuggestedTerm`
 51 | 
 52 | This method returns the suggested term which is considered best matching with the original term.
 53 | 
 54 | ### getOriginalTerm
 55 | 
 56 | **Signature:** `getOriginalTerm() : String`
 57 | 
 58 | Returns the original term of the user input, for which this instance provides a list of suggested terms.
 59 | 
 60 | ### getTerms
 61 | 
 62 | **Signature:** `getTerms() : Iterator`
 63 | 
 64 | Returns the list of SuggestedTerms suggested for the original term.
 65 | 
 66 | ### isEmpty
 67 | 
 68 | **Signature:** `isEmpty() : boolean`
 69 | 
 70 | Returns true if this set of suggested terms is empty.
 71 | 
 72 | ## Method Detail
 73 | 
 74 | ## Method Details
 75 | 
 76 | ### getFirstTerm
 77 | 
 78 | **Signature:** `getFirstTerm() : SuggestedTerm`
 79 | 
 80 | **Description:** This method returns the suggested term which is considered best matching with the original term. See getTerms() for a note on ordering of suggested terms.
 81 | 
 82 | **Returns:**
 83 | 
 84 | the best matching term
 85 | 
 86 | **See Also:**
 87 | 
 88 | getOriginalTerm()
 89 | getTerms()
 90 | 
 91 | ---
 92 | 
 93 | ### getOriginalTerm
 94 | 
 95 | **Signature:** `getOriginalTerm() : String`
 96 | 
 97 | **Description:** Returns the original term of the user input, for which this instance provides a list of suggested terms. Suggested terms can either be corrected, or completed or exact matching.
 98 | 
 99 | **Returns:**
100 | 
101 | the original unmodified term of the user input search phrase
102 | 
103 | ---
104 | 
105 | ### getTerms
106 | 
107 | **Signature:** `getTerms() : Iterator`
108 | 
109 | **Description:** Returns the list of SuggestedTerms suggested for the original term.
110 | 
111 | **Returns:**
112 | 
113 | a iterator of suggested terms, might be empty
114 | 
115 | **See Also:**
116 | 
117 | getOriginalTerm()
118 | isEmpty()
119 | 
120 | ---
121 | 
122 | ### isEmpty
123 | 
124 | **Signature:** `isEmpty() : boolean`
125 | 
126 | **Description:** Returns true if this set of suggested terms is empty.
127 | 
128 | **Returns:**
129 | 
130 | true if no suggested term is contained in this set, false otherwise
131 | 
132 | ---
```
Page 5/61FirstPrevNextLast