#
tokens: 49882/50000 72/825 files (page 3/43)
lines: off (toggle) GitHub
raw markdown copy
This is page 3 of 43. Use http://codebase.md/taurgis/sfcc-dev-mcp?lines=false&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

--------------------------------------------------------------------------------
/src/core/handlers/code-version-handler.ts:
--------------------------------------------------------------------------------

```typescript
import { BaseToolHandler, ToolExecutionContext, GenericToolSpec, HandlerContext, ToolArguments } from './base-handler.js';
import { OCAPICodeVersionsClient } from '../../clients/ocapi/code-versions-client.js';
import { ClientFactory } from './client-factory.js';
import {
  CODE_VERSION_TOOL_CONFIG,
  CodeVersionToolName,
  CODE_VERSION_TOOL_NAMES_SET,
} from '../../tool-configs/code-version-tool-config.js';

/**
 * Handler for code version management tools using config-driven dispatch
 * Provides code version listing, activation, and deployment management
 */
export class CodeVersionToolHandler extends BaseToolHandler<CodeVersionToolName> {
  private codeVersionsClient: OCAPICodeVersionsClient | null = null;
  private clientFactory: ClientFactory;

  constructor(context: HandlerContext, subLoggerName: string) {
    super(context, subLoggerName);
    this.clientFactory = new ClientFactory(context, this.logger);
  }

  protected async onInitialize(): Promise<void> {
    this.codeVersionsClient = this.clientFactory.createCodeVersionsClient();
    if (this.codeVersionsClient) {
      this.logger.debug('Code versions client initialized');
    }
  }

  protected async onDispose(): Promise<void> {
    this.codeVersionsClient = null;
    this.logger.debug('Code versions client disposed');
  }

  canHandle(toolName: string): boolean {
    return CODE_VERSION_TOOL_NAMES_SET.has(toolName as CodeVersionToolName);
  }

  protected getToolNameSet(): Set<CodeVersionToolName> {
    return CODE_VERSION_TOOL_NAMES_SET;
  }

  protected getToolConfig(): Record<string, GenericToolSpec<ToolArguments, any>> {
    return CODE_VERSION_TOOL_CONFIG;
  }

  protected async createExecutionContext(): Promise<ToolExecutionContext> {
    if (!this.codeVersionsClient) {
      throw new Error(ClientFactory.getClientRequiredError('OCAPI'));
    }

    return {
      handlerContext: this.context,
      logger: this.logger,
      codeVersionsClient: this.codeVersionsClient,
    };
  }
}

```

--------------------------------------------------------------------------------
/src/utils/query-builder.ts:
--------------------------------------------------------------------------------

```typescript
/**
 * Query Builder Utility
 *
 * This module provides utilities for building query strings and handling URL parameters
 * for SFCC API requests with proper encoding and array handling.
 */

/**
 * Query parameter builder for SFCC APIs
 */
export class QueryBuilder {
  private params: URLSearchParams;

  constructor() {
    this.params = new URLSearchParams();
  }

  /**
   * Add a parameter to the query string
   */
  add(key: string, value: string | number | boolean): QueryBuilder {
    if (value !== undefined && value !== null) {
      this.params.append(key, value.toString());
    }
    return this;
  }

  /**
   * Add an array parameter with proper handling for different parameter types
   */
  addArray(key: string, values: (string | number)[]): QueryBuilder {
    if (!Array.isArray(values) || values.length === 0) {
      return this;
    }

    if (key === 'refine') {
      // Special handling for OCAPI refine parameters (multiple entries)
      values.forEach(value => this.params.append(key, value.toString()));
    } else {
      // Join arrays with comma for most parameters
      this.params.append(key, values.join(','));
    }

    return this;
  }

  /**
   * Add multiple parameters from an object
   */
  addFromObject(params: Record<string, any>): QueryBuilder {
    Object.entries(params).forEach(([key, value]) => {
      if (value !== undefined && value !== null) {
        if (Array.isArray(value)) {
          this.addArray(key, value);
        } else {
          this.add(key, value);
        }
      }
    });
    return this;
  }

  /**
   * Build the final query string
   */
  build(): string {
    return this.params.toString();
  }

  /**
   * Reset the builder
   */
  reset(): QueryBuilder {
    this.params = new URLSearchParams();
    return this;
  }

  /**
   * Static method to build query string from object
   */
  static fromObject(params: Record<string, any>): string {
    return new QueryBuilder().addFromObject(params).build();
  }
}

```

--------------------------------------------------------------------------------
/docs/dw_system/SitePreferences.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.system

# Class SitePreferences

## Inheritance Hierarchy

- Object
  - dw.object.PersistentObject
  - dw.object.ExtensibleObject
    - dw.system.SitePreferences

## Description

SitePreferences is a container for custom site-level attributes. The object corresponds with system object type "SitePreferences". It has no system attributes and exists only as a place for merchants to define custom attributes which need to be available for each site. Logically there is only one SitePreferences instance per site. The instance is obtained by calling Site.getPreferences(). Once an instance of the container is obtained, it is possible to read/write site preference values by using the usual syntax for ExtensibleObject instances. For example: var sitePrefs : SitePreferences = dw.system.Site.getCurrent().getPreferences(); var mySitePrefValue : String = sitePrefs.getCustom()["mySitePref"]; Note: this class allows access to sensitive security-related data. Pay special attention to PCI DSS v3. requirements 2, 4, and 12. Commerce Cloud Digital defines many site-level preferences, relating to baskets, timezone, locales, customers, etc, which can be managed within the "Site Preferences" module of the Business Manager, but these preferences are not accessible through this object. (SourceCodeURLParameterName is the one exception to this rule.)

## Properties

### sourceCodeURLParameterName

**Type:** String (Read Only)

The name of the source code url paremeter configured for the
 site.

## Constructor Summary

## Method Summary

### getSourceCodeURLParameterName

**Signature:** `getSourceCodeURLParameterName() : String`

Returns the name of the source code url paremeter configured for the site.

## Method Detail

## Method Details

### getSourceCodeURLParameterName

**Signature:** `getSourceCodeURLParameterName() : String`

**Description:** Returns the name of the source code url paremeter configured for the site.

**Returns:**

source code url parameter name

---
```

--------------------------------------------------------------------------------
/docs/TopLevel/Error.md:
--------------------------------------------------------------------------------

```markdown
## Package: TopLevel

# Class Error

## Inheritance Hierarchy

- Object
  - Error

## Description

Error represents a generic exception.

## Properties

### message

**Type:** String

An error message that provides details about the exception.

### name

**Type:** String

The name of the error based on the constructor used.

### stack

**Type:** String

The script stack trace. 
 This property is filled on throwing or via an explicit call captureStackTrace(Error, Function).

## Constructor Summary

Error() Constructs the Error object.

Error(msg : String) Constructs the Error object using the specified message.

## Method Summary

### captureStackTrace

**Signature:** `static captureStackTrace(error : Error, constructorOpt : Function) : void`

Fills the stack property for the passed error.

### toString

**Signature:** `toString() : String`

Returns a String representation of the Error.

## Constructor Detail

## Method Detail

## Method Details

### captureStackTrace

**Signature:** `static captureStackTrace(error : Error, constructorOpt : Function) : void`

**Description:** Fills the stack property for the passed error. The optional constructorOpt parameter allows you to pass in a function value. When collecting the stack trace all frames above the topmost call to this function, including that call, are left out of the stack trace. This can be useful to hide implementation details that won’t be useful to the user. The usual way of defining a custom error that captures a stack trace would be: function MyError() { // fill the stack trace, but hide the call to MyError Error.captureStackTrace(this, MyError); }

**API Versioned:**

From version 21.2.

**Parameters:**

- `error`: The error whose stack trace should be filled.
- `constructorOpt`: An optional filter to hide the topmost stack frames.

---

### toString

**Signature:** `toString() : String`

**Description:** Returns a String representation of the Error.

**Returns:**

a String representation of the Error.

---
```

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

```json
{
  "_v": "23.2",
  "_type": "object_attribute_group_search_result",
  "count": 6,
  "hits": [
    {
      "_type": "object_attribute_group",
      "_resource_state": "725cfb77da0718c12083846811819be73641bc2ac674cae8f5588db9058dde79",
      "id": "ExternalSearch",
      "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/Category/attribute_groups/ExternalSearch"
    },
    {
      "_type": "object_attribute_group",
      "_resource_state": "31ad3c262c0bebb9aa39db3f558dbb16c6cf2f76de016df268d110f51469c42b",
      "id": "Presentation",
      "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/Category/attribute_groups/Presentation"
    },
    {
      "_type": "object_attribute_group",
      "_resource_state": "b09a3a5aa52110b13baa7206d34d3cdd8260216087712ba267861885a4981609",
      "id": "SearchRanking",
      "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/Category/attribute_groups/SearchRanking"
    },
    {
      "_type": "object_attribute_group",
      "_resource_state": "08a38cfa148750c5949ac5625bd3ad5ebd0ab372cbadf933d197f542f9fc4185",
      "id": "SiteMap",
      "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/Category/attribute_groups/SiteMap"
    },
    {
      "_type": "object_attribute_group",
      "_resource_state": "552e4186fc4e97e07f7839c8cf1aaf41009dcd8b82efb35c8d025b4384595eb8",
      "id": "VariationGroups",
      "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/Category/attribute_groups/VariationGroups"
    },
    {
      "_type": "object_attribute_group",
      "_resource_state": "501f3723e08441d2f5f061c21e7efa0f68a9f86d6950ccae6fc8c8d9839441a3",
      "id": "customAttributes",
      "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/Category/attribute_groups/customAttributes"
    }
  ],
  "query": {
    "match_all_query": {
      "_type": "match_all_query"
    }
  },
  "start": 0,
  "total": 6
}
```

--------------------------------------------------------------------------------
/docs/dw_util/Iterator.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.util

# Class Iterator

## Inheritance Hierarchy

- Object
  - dw.util.Iterator

## Description

The Iterator class allows you to access items in a collection.

## Constructor Summary

## Method Summary

### asList

**Signature:** `asList() : List`

Convert the iterator into a list.

### asList

**Signature:** `asList(start : Number, size : Number) : List`

Converts a sub-sequence within the iterator into a list.

### hasNext

**Signature:** `hasNext() : boolean`

Indicates if there are more elements.

### next

**Signature:** `next() : Object`

Returns the next element from the Iterator.

## Method Detail

## Method Details

### asList

**Signature:** `asList() : List`

**Description:** Convert the iterator into a list. After this conversion the iterator is empty and hasNext() will always return false. Note: This method should be used with care. For example a large database result is pulled into memory completely with this method and can cause an OutOfMemory situation.

**Returns:**

the iterator as a list.

---

### asList

**Signature:** `asList(start : Number, size : Number) : List`

**Description:** Converts a sub-sequence within the iterator into a list. Note: This method should be used with care. For example a large database result is pulled into memory completely with this method and can cause an OutOfMemory situation.

**Parameters:**

- `start`: the number of elements to iterate before adding elements to the sublist. Negative values are treated as 0.
- `size`: the maximum number of elements to add to the sublist. Nonpositive values always result in empty list.

**Returns:**

a sub-sequence within the iterator into a list.

---

### hasNext

**Signature:** `hasNext() : boolean`

**Description:** Indicates if there are more elements.

**Returns:**

true if there are more elements, false otherwise.

---

### next

**Signature:** `next() : Object`

**Description:** Returns the next element from the Iterator.

**Returns:**

the next element from the Iterator.

---
```

--------------------------------------------------------------------------------
/docs/dw_io/CSVStreamReader.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.io

# Class CSVStreamReader

## Inheritance Hierarchy

- Object
  - dw.io.CSVStreamReader

## Description

The class supports reading a CSV file. The reader supports handling CSV entries where the separator is contained in quotes and also CSV entries where a quoted entry contains newline characters.

## Constructor Summary

CSVStreamReader(ioreader : Reader) Creates a new CSVReader with a ',' as separator character and a '"' as quote character.

CSVStreamReader(ioreader : Reader, separator : String) Creates a new CSVReader with the specified separator character and a '"' as quote character.

CSVStreamReader(ioreader : Reader, separator : String, quote : String) Creates a new CSVReader with the specified separator character and the specified quote character.

CSVStreamReader(ioreader : Reader, separator : String, quote : String, skip : Number) Creates a new CSVReader.

## Method Summary

### close

**Signature:** `close() : void`

Closes the underlying reader.

### readAll

**Signature:** `readAll() : List`

Returns a list of lines representing the entire CSV file.

### readNext

**Signature:** `readNext() : String[]`

Returns the next line from the input stream.

## Constructor Detail

## Method Detail

## Method Details

### close

**Signature:** `close() : void`

**Description:** Closes the underlying reader.

---

### readAll

**Signature:** `readAll() : List`

**Description:** Returns a list of lines representing the entire CSV file. Each line is a array of strings. Using this method on large feeds is inherently unsafe and may lead to an out-of-memory condition. Instead use method readNext() and process entries line by line.

**Returns:**

a list of lines representing the entire CSV file.

---

### readNext

**Signature:** `readNext() : String[]`

**Description:** Returns the next line from the input stream. The line is returned as an array of strings. The method returns null if the end of the stream is reached.

**Returns:**

the next line from the input stream as an array of strings.

---
```

--------------------------------------------------------------------------------
/docs/dw_svc/FTPServiceDefinition.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.svc

# Class FTPServiceDefinition

## Inheritance Hierarchy

- Object
  - dw.svc.ServiceDefinition
  - dw.svc.FTPServiceDefinition

## Description

Represents an FTP or SFTP Service Definition. There are two basic styles of configuration for this service. In the first style, createRequest is implemented to call the setOperation method on the Service. This will cause the single operation to be performed and returned as the data object in the parseResponse method. Any error status is set automatically based on the returned value of the operation. In the second style, execute is implemented to perform one or more operations using the serviceClient available on the Service object. This serviceClient will be either an FTPClient or an SFTPClient. The return value of execute will be passed as the data object in the parseResponse method.

## Properties

### autoDisconnect

**Type:** boolean

The status of whether the underlying FTP connection will be disconnected after the service call.

## Constructor Summary

## Method Summary

### isAutoDisconnect

**Signature:** `isAutoDisconnect() : boolean`

Returns the status of whether the underlying FTP connection will be disconnected after the service call.

### setAutoDisconnect

**Signature:** `setAutoDisconnect(b : boolean) : FTPServiceDefinition`

Sets the auto-disconnect flag.

## Method Detail

## Method Details

### isAutoDisconnect

**Signature:** `isAutoDisconnect() : boolean`

**Description:** Returns the status of whether the underlying FTP connection will be disconnected after the service call.

**Returns:**

The auto-disconnect flag.

---

### setAutoDisconnect

**Signature:** `setAutoDisconnect(b : boolean) : FTPServiceDefinition`

**Description:** Sets the auto-disconnect flag. If true, the underlying FTP connection will be disconnected after the service call. If false then it will remain open. The default value is true.

**Parameters:**

- `b`: true to enable auto-disconnect, false otherwise.

**Returns:**

this FTP or SFTP Service Definition.

---
```

--------------------------------------------------------------------------------
/docs/dw_system/HookMgr.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.system

# Class HookMgr

## Inheritance Hierarchy

- Object
  - dw.system.HookMgr

## Description

This class provides functionality to call hooks. A hook is an extension point in the business logic, where you can register scripts to customize functionality.

## Constructor Summary

## Method Summary

### callHook

**Signature:** `static callHook(extensionPoint : String, function : String, args : Object...) : Object`

Calls a hook on base of the specified extensionPoint and function.

### hasHook

**Signature:** `static hasHook(extensionPoint : String) : boolean`

Checks whether a hook is registered or a system default implementation exists for this extension point.

## Method Detail

## Method Details

### callHook

**Signature:** `static callHook(extensionPoint : String, function : String, args : Object...) : Object`

**Description:** Calls a hook on base of the specified extensionPoint and function. If a hook throws an exception, then this method will also throw an exception. If no hook and no system default implementation is provided, then this method will return undefined. Sample: dw.system.HookMgr.callHook( "dw.order.calculate", "calculate", basket );

**Parameters:**

- `extensionPoint`: the extension point to call
- `function`: the script function to call
- `args`: the Array of function parameters

**Returns:**

the object returned by the hook or undefined

---

### hasHook

**Signature:** `static hasHook(extensionPoint : String) : boolean`

**Description:** Checks whether a hook is registered or a system default implementation exists for this extension point. extensionPoint refers to the same name used to register a script as implementation. With this method it's only possible to check for a whole script registered but it is not possible to check, whether an individual function is implemented. Sample: dw.system.HookMgr.hasHook( "dw.order.calculate" );

**Parameters:**

- `extensionPoint`: the extension point

**Returns:**

true, if a hook is registered or a default implementation exists, otherwise false

---
```

--------------------------------------------------------------------------------
/tests/servers/sfcc-mock-server/src/utils/mock-data-loader.js:
--------------------------------------------------------------------------------

```javascript
/**
 * Mock Data Loader Utility
 * 
 * Handles loading and caching of mock data files with fallback strategies.
 * Provides consistent error handling and logging for data loading operations.
 */

const fs = require('fs');
const path = require('path');

class MockDataLoader {
    constructor(basePath) {
        this.basePath = basePath;
        this.cache = new Map();
    }

    /**
     * Load mock data with caching and fallback
     */
    loadData(filename, fallbackData = null) {
        // Check cache first
        if (this.cache.has(filename)) {
            return this.cache.get(filename);
        }

        try {
            const filePath = path.join(this.basePath, filename);
            
            if (fs.existsSync(filePath)) {
                const data = JSON.parse(fs.readFileSync(filePath, 'utf8'));
                this.cache.set(filename, data);
                return data;
            }
        } catch (error) {
            console.warn(`Warning: Could not load mock data from ${filename}:`, error.message);
        }

        // Use fallback data if provided
        if (fallbackData !== null) {
            this.cache.set(filename, fallbackData);
            return fallbackData;
        }

        return null;
    }

    /**
     * Load mock data from OCAPI subdirectory
     */
    loadOcapiData(filename, fallbackData = null) {
        return this.loadData(path.join('ocapi', filename), fallbackData);
    }

    /**
     * Check if a file exists
     */
    fileExists(filename) {
        const filePath = path.join(this.basePath, filename);
        return fs.existsSync(filePath);
    }

    /**
     * Clear cache for a specific file or all files
     */
    clearCache(filename = null) {
        if (filename) {
            this.cache.delete(filename);
        } else {
            this.cache.clear();
        }
    }

    /**
     * Get cache statistics
     */
    getCacheStats() {
        return {
            size: this.cache.size,
            keys: Array.from(this.cache.keys())
        };
    }
}

module.exports = MockDataLoader;
```

--------------------------------------------------------------------------------
/src/core/handlers/abstract-log-tool-handler.ts:
--------------------------------------------------------------------------------

```typescript
import { BaseToolHandler, GenericToolSpec, ToolExecutionContext, HandlerContext } from './base-handler.js';
import { SFCCLogClient } from '../../clients/logs/index.js';
import { ClientFactory } from './client-factory.js';

/**
 * Abstract base class for log-related tool handlers
 * Extends the generic config-driven handler with log-specific functionality
 */
export abstract class AbstractLogToolHandler<TToolName extends string = string> extends BaseToolHandler<TToolName> {
  protected logClient: SFCCLogClient | null = null;
  protected clientFactory: ClientFactory;

  constructor(context: HandlerContext, subLoggerName: string) {
    super(context, subLoggerName);
    this.clientFactory = new ClientFactory(context, this.logger);
  }

  protected async onInitialize(): Promise<void> {
    this.logClient = this.clientFactory.createLogClient();
    if (this.logClient) {
      this.logger.debug('Log client initialized');
    }
  }

  protected async onDispose(): Promise<void> {
    this.logClient = null;
    this.logger.debug('Log client disposed');
  }

  /**
   * Get the log client with proper error handling
   * Eliminates repetitive null checks in handlers
   */
  protected getLogClient(): SFCCLogClient {
    if (!this.logClient) {
      throw new Error(ClientFactory.getClientRequiredError('Log'));
    }
    return this.logClient;
  }

  /**
   * Create execution context for log tools
   * Provides access to log client and handler context
   */
  protected async createExecutionContext(): Promise<ToolExecutionContext> {
    return {
      handlerContext: this.context,
      logger: this.logger,
      logClient: this.getLogClient(),
    };
  }

  /**
   * Abstract method to get tool configuration
   * Each concrete log handler implements this with their specific config
   */
  protected abstract getToolConfig(): Record<TToolName, GenericToolSpec>;

  /**
   * Abstract method to get tool name set for O(1) lookup
   * Each concrete log handler implements this with their specific tool set
   */
  protected abstract getToolNameSet(): Set<string>;
}

```

--------------------------------------------------------------------------------
/docs/dw_catalog/CategoryLink.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.catalog

# Class CategoryLink

## Inheritance Hierarchy

- Object
  - dw.catalog.CategoryLink

## Description

A CategoryLink represents a directed relationship between two catalog categories. Merchants create category links in order to market similar or related groups of products.

## Constants

### LINKTYPE_ACCESSORY

**Type:** Number = 2

Represents an accessory category link.

### LINKTYPE_CROSS_SELL

**Type:** Number = 4

Represents a cross-sell category link.

### LINKTYPE_OTHER

**Type:** Number = 1

Represents a miscellaneous category link.

### LINKTYPE_SPARE_PART

**Type:** Number = 6

Represents a spare part category link.

### LINKTYPE_UP_SELL

**Type:** Number = 5

Represents an up-sell category link.

## Properties

### sourceCategory

**Type:** Category (Read Only)

The object for the relation 'sourceCategory'.

### targetCategory

**Type:** Category (Read Only)

The object for the relation 'targetCategory'.

### typeCode

**Type:** Number (Read Only)

The type of this category link (see constants).

## Constructor Summary

## Method Summary

### getSourceCategory

**Signature:** `getSourceCategory() : Category`

Returns the object for the relation 'sourceCategory'.

### getTargetCategory

**Signature:** `getTargetCategory() : Category`

Returns the object for the relation 'targetCategory'.

### getTypeCode

**Signature:** `getTypeCode() : Number`

Returns the type of this category link (see constants).

## Method Detail

## Method Details

### getSourceCategory

**Signature:** `getSourceCategory() : Category`

**Description:** Returns the object for the relation 'sourceCategory'.

**Returns:**

the object for the relation 'sourceCategory'

---

### getTargetCategory

**Signature:** `getTargetCategory() : Category`

**Description:** Returns the object for the relation 'targetCategory'.

**Returns:**

the object for the relation 'targetCategory'

---

### getTypeCode

**Signature:** `getTypeCode() : Number`

**Description:** Returns the type of this category link (see constants).

**Returns:**

the type of the link.

---
```

--------------------------------------------------------------------------------
/docs/dw_catalog/ProductLink.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.catalog

# Class ProductLink

## Inheritance Hierarchy

- Object
  - dw.catalog.ProductLink

## Description

The class represents a link between two products.

## Constants

### LINKTYPE_ACCESSORY

**Type:** Number = 4

Represents an accessory product link.

### LINKTYPE_ALT_ORDERUNIT

**Type:** Number = 6

Represents an alternative order unit product link.

### LINKTYPE_CROSS_SELL

**Type:** Number = 1

Represents a cross-sell product link.

### LINKTYPE_NEWER_VERSION

**Type:** Number = 5

Represents a newer verion link.

### LINKTYPE_OTHER

**Type:** Number = 8

Represents a miscellaneous product link.

### LINKTYPE_REPLACEMENT

**Type:** Number = 2

Represents a replacement product link.

### LINKTYPE_SPARE_PART

**Type:** Number = 7

Represents a spare part product link.

### LINKTYPE_UP_SELL

**Type:** Number = 3

Represents an up-sell product link.

## Properties

### sourceProduct

**Type:** Product (Read Only)

The source product for this link.

### targetProduct

**Type:** Product (Read Only)

The target product for this link.

### typeCode

**Type:** Number (Read Only)

The type of this link (see constants).

## Constructor Summary

## Method Summary

### getSourceProduct

**Signature:** `getSourceProduct() : Product`

Returns the source product for this link.

### getTargetProduct

**Signature:** `getTargetProduct() : Product`

Returns the target product for this link.

### getTypeCode

**Signature:** `getTypeCode() : Number`

Returns the type of this link (see constants).

## Method Detail

## Method Details

### getSourceProduct

**Signature:** `getSourceProduct() : Product`

**Description:** Returns the source product for this link.

**Returns:**

the source product for this link.

---

### getTargetProduct

**Signature:** `getTargetProduct() : Product`

**Description:** Returns the target product for this link.

**Returns:**

the target product for this link.

---

### getTypeCode

**Signature:** `getTypeCode() : Number`

**Description:** Returns the type of this link (see constants).

**Returns:**

the type of the link.

---
```

--------------------------------------------------------------------------------
/docs/dw_catalog/ProductAvailabilityLevels.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.catalog

# Class ProductAvailabilityLevels

## Inheritance Hierarchy

- Object
  - dw.catalog.ProductAvailabilityLevels

## Description

Encapsulates the quantity of items available for each availability status.

## Properties

### backorder

**Type:** Quantity (Read Only)

The backorder quantity.

### count

**Type:** Number (Read Only)

The number of attributes that contain non-zero quantities.

### inStock

**Type:** Quantity (Read Only)

The quantity in stock.

### notAvailable

**Type:** Quantity (Read Only)

The quantity that is not available.

### preorder

**Type:** Quantity (Read Only)

The pre-order quantity.

## Constructor Summary

## Method Summary

### getBackorder

**Signature:** `getBackorder() : Quantity`

Returns the backorder quantity.

### getCount

**Signature:** `getCount() : Number`

Returns the number of attributes that contain non-zero quantities.

### getInStock

**Signature:** `getInStock() : Quantity`

Returns the quantity in stock.

### getNotAvailable

**Signature:** `getNotAvailable() : Quantity`

Returns the quantity that is not available.

### getPreorder

**Signature:** `getPreorder() : Quantity`

Returns the pre-order quantity.

## Method Detail

## Method Details

### getBackorder

**Signature:** `getBackorder() : Quantity`

**Description:** Returns the backorder quantity.

**Returns:**

the backorder quantity.

---

### getCount

**Signature:** `getCount() : Number`

**Description:** Returns the number of attributes that contain non-zero quantities.

**Returns:**

the number of attributes that contain non-zero quantities.

---

### getInStock

**Signature:** `getInStock() : Quantity`

**Description:** Returns the quantity in stock.

**Returns:**

the quantity in stock.

---

### getNotAvailable

**Signature:** `getNotAvailable() : Quantity`

**Description:** Returns the quantity that is not available.

**Returns:**

the quantity that is not available.

---

### getPreorder

**Signature:** `getPreorder() : Quantity`

**Description:** Returns the pre-order quantity.

**Returns:**

the pre-order quantity.

---
```

--------------------------------------------------------------------------------
/docs/dw_content/Library.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.content

# Class Library

## Inheritance Hierarchy

- Object
  - dw.object.PersistentObject
  - dw.object.ExtensibleObject
    - dw.content.Library

## Description

Class representing a collection of Content assets, and a Folder hierarchy organizing these content assets. Currently only one library is allowed per site. An instance of this library can be obtained by calling ContentMgr.getSiteLibrary().

## Properties

### CMSChannelID

**Type:** String (Read Only)

The CMS channel of the library.

### displayName

**Type:** String (Read Only)

The display name for the library as known in the current
 locale or null if it cannot be found.

### ID

**Type:** String (Read Only)

The ID of this library.

### root

**Type:** Folder (Read Only)

The root folder for this library.

## Constructor Summary

## Method Summary

### getCMSChannelID

**Signature:** `getCMSChannelID() : String`

Returns the CMS channel of the library.

### getDisplayName

**Signature:** `getDisplayName() : String`

Returns the display name for the library as known in the current locale or null if it cannot be found.

### getID

**Signature:** `getID() : String`

Returns the ID of this library.

### getRoot

**Signature:** `getRoot() : Folder`

Returns the root folder for this library.

## Method Detail

## Method Details

### getCMSChannelID

**Signature:** `getCMSChannelID() : String`

**Description:** Returns the CMS channel of the library.

**Returns:**

the CMS channel of the library

---

### getDisplayName

**Signature:** `getDisplayName() : String`

**Description:** Returns the display name for the library as known in the current locale or null if it cannot be found.

**Returns:**

the display name for the library as known in the current locale or null if it cannot be found.

---

### getID

**Signature:** `getID() : String`

**Description:** Returns the ID of this library.

**Returns:**

the ID of this library.

---

### getRoot

**Signature:** `getRoot() : Folder`

**Description:** Returns the root folder for this library.

**Returns:**

the root Folder for this library.

---
```

--------------------------------------------------------------------------------
/docs-site/src/styles/prism-theme.css:
--------------------------------------------------------------------------------

```css
/* Custom Prism.js theme for SFCC Development MCP Server docs */
/* Override default Prism styles with a clean, modern theme */

pre[class*="language-"] {
  background: transparent;
  margin: 0;
  padding: 0;
  overflow: visible;
}

code[class*="language-"] {
  background: transparent;
  text-shadow: none;
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
  font-size: 0.875rem;
  line-height: 1.5;
  color: #374151; /* slate-700 */
}

/* Tokens */
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
  color: #6b7280; /* slate-500 */
  font-style: italic;
}

.token.punctuation {
  color: #6b7280; /* slate-500 */
}

.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
  color: #dc2626; /* red-600 */
}

.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
  color: #059669; /* emerald-600 */
}

.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
  color: #7c3aed; /* violet-600 */
}

.token.atrule,
.token.attr-value,
.token.keyword {
  color: #2563eb; /* blue-600 */
}

.token.function,
.token.class-name {
  color: #ea580c; /* orange-600 */
}

.token.regex,
.token.important,
.token.variable {
  color: #dc2626; /* red-600 */
}

.token.important,
.token.bold {
  font-weight: bold;
}

.token.italic {
  font-style: italic;
}

.token.entity {
  cursor: help;
}

/* JSON specific */
.token.key {
  color: #2563eb; /* blue-600 */
}

/* YAML specific */
.token.title {
  color: #2563eb; /* blue-600 */
}

/* Bash/Shell specific */
.token.command {
  color: #059669; /* emerald-600 */
}

.token.parameter {
  color: #dc2626; /* red-600 */
}

/* JSX/TSX specific */
.token.tag .token.punctuation {
  color: #6b7280; /* slate-500 */
}

.token.tag .token.script-punctuation {
  color: #6b7280; /* slate-500 */
}

.token.attr-value .token.punctuation {
  color: #059669; /* emerald-600 */
}

.token.attr-value .token.punctuation:first-child {
  color: #059669; /* emerald-600 */
}

```

--------------------------------------------------------------------------------
/docs/dw_order/TaxGroup.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.order

# Class TaxGroup

## Inheritance Hierarchy

- Object
  - dw.order.TaxGroup

## Description

Contains the formal definition of a tax including a type (it's just the key), a percentage value if provided, a caption and a description.

## Properties

### caption

**Type:** String (Read Only)

Gets the caption.

### description

**Type:** String (Read Only)

Gets the description.

### rate

**Type:** Number (Read Only)

Gets the percentage amount of the rate.

### taxType

**Type:** String (Read Only)

Gets the tax type.

## Constructor Summary

## Method Summary

### create

**Signature:** `static create(taxType : String, caption : String, description : String, taxRate : Decimal) : TaxGroup`

Creates a TaxGroup.

### getCaption

**Signature:** `getCaption() : String`

Gets the caption.

### getDescription

**Signature:** `getDescription() : String`

Gets the description.

### getRate

**Signature:** `getRate() : Number`

Gets the percentage amount of the rate.

### getTaxType

**Signature:** `getTaxType() : String`

Gets the tax type.

## Method Detail

## Method Details

### create

**Signature:** `static create(taxType : String, caption : String, description : String, taxRate : Decimal) : TaxGroup`

**Description:** Creates a TaxGroup. This TaxGroup can be used for example in ReturnItem.addTaxItem(Decimal, TaxGroup).

**Parameters:**

- `taxType`: the tax type
- `caption`: the caption
- `description`: the description
- `taxRate`: the tax rate as floating point. 1.0 means 100 %.

**Returns:**

the tax group

---

### getCaption

**Signature:** `getCaption() : String`

**Description:** Gets the caption.

**Returns:**

the caption

---

### getDescription

**Signature:** `getDescription() : String`

**Description:** Gets the description.

**Returns:**

the description

---

### getRate

**Signature:** `getRate() : Number`

**Description:** Gets the percentage amount of the rate.

**Returns:**

the tax rate percentage value

---

### getTaxType

**Signature:** `getTaxType() : String`

**Description:** Gets the tax type.

**Returns:**

the tax type

---
```

--------------------------------------------------------------------------------
/docs/dw_campaign/CouponStatusCodes.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.campaign

# Class CouponStatusCodes

## Inheritance Hierarchy

- Object
  - dw.campaign.CouponStatusCodes

## Description

Helper class containing status codes for why a coupon code cannot be added to cart or why a coupon code already in cart is not longer valid for redemption.

## Constants

### APPLIED

**Type:** String = "APPLIED"

Coupon is currently applied in basket = Coupon code is valid for redemption and Coupon is assigned to one or multiple applicable promotions.

### COUPON_ALREADY_IN_BASKET

**Type:** String = "COUPON_ALREADY_IN_BASKET"

Indicates that another code of the same MultiCode/System coupon has already been added to basket.

### COUPON_CODE_ALREADY_IN_BASKET

**Type:** String = "COUPON_CODE_ALREADY_IN_BASKET"

Indicates that coupon code has already been added to basket.

### COUPON_CODE_ALREADY_REDEEMED

**Type:** String = "COUPON_CODE_ALREADY_REDEEMED"

Indicates that code of MultiCode/System coupon has already been redeemed.

### COUPON_CODE_UNKNOWN

**Type:** String = "COUPON_CODE_UNKNOWN"

Indicates that coupon not found for given coupon code or that the code itself was not found.

### COUPON_DISABLED

**Type:** String = "COUPON_DISABLED"

Indicates that coupon is not enabled.

### CUSTOMER_REDEMPTION_LIMIT_EXCEEDED

**Type:** String = "CUSTOMER_REDEMPTION_LIMIT_EXCEEDED"

Indicates that No. of redemptions per code & customer exceeded.

### NO_ACTIVE_PROMOTION

**Type:** String = "NO_ACTIVE_PROMOTION"

Indicates that coupon is not assigned to an active promotion.

### NO_APPLICABLE_PROMOTION

**Type:** String = "NO_APPLICABLE_PROMOTION"

Coupon is assigned to one or multiple active promotions, but none of these promotions is currently applicable.

### REDEMPTION_LIMIT_EXCEEDED

**Type:** String = "REDEMPTION_LIMIT_EXCEEDED"

Indicates that no. of redemptions per code exceeded. Usually happens for single code coupons

### TIMEFRAME_REDEMPTION_LIMIT_EXCEEDED

**Type:** String = "TIMEFRAME_REDEMPTION_LIMIT_EXCEEDED"

Indicates that No. of redemptions per code,customer & time exceeded.

## Properties

## Constructor Summary

## Method Summary
```

--------------------------------------------------------------------------------
/docs/dw_web/URLRedirectMgr.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.web

# Class URLRedirectMgr

## Inheritance Hierarchy

- Object
  - dw.web.URLRedirectMgr

## Description

URLRedirect manager class. Methods in this class generate URLRedirects based on the current configuration for Static, Dynamic and URLRedirect mappings in Commerce Cloud Digital. Information used to calculate URLRedirects are determined from the current HTTP request. The URL which is used to find a redirect can be accessed with getRedirectOrigin().

## Properties

### redirect

**Type:** URLRedirect (Read Only)

An URLRedirect object, containing a location and status. The redirect is calculated
 based on origin url of current request and the configured Static, Dynamic and URLRedirect mappings for
 the requested site.

### redirectOrigin

**Type:** String (Read Only)

The relative origin url (without protocol, port, hostname and site path information)
 which will be used in getRedirect() to calculate a redirect location for.

## Constructor Summary

## Method Summary

### getRedirect

**Signature:** `static getRedirect() : URLRedirect`

Returns an URLRedirect object, containing a location and status.

### getRedirectOrigin

**Signature:** `static getRedirectOrigin() : String`

Returns the relative origin url (without protocol, port, hostname and site path information) which will be used in getRedirect() to calculate a redirect location for.

## Method Detail

## Method Details

### getRedirect

**Signature:** `static getRedirect() : URLRedirect`

**Description:** Returns an URLRedirect object, containing a location and status. The redirect is calculated based on origin url of current request and the configured Static, Dynamic and URLRedirect mappings for the requested site.

**Returns:**

URLRedirect containing the location and status code, null in case of no redirect was found

---

### getRedirectOrigin

**Signature:** `static getRedirectOrigin() : String`

**Description:** Returns the relative origin url (without protocol, port, hostname and site path information) which will be used in getRedirect() to calculate a redirect location for.

**Returns:**

relative origin url

---
```

--------------------------------------------------------------------------------
/docs/dw_web/CSRFProtection.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.web

# Class CSRFProtection

## Inheritance Hierarchy

- Object
  - dw.web.CSRFProtection

## Description

Used to generate and validate CSRF tokens. CSRFProtection allows applications to protect themselves against CSRF attacks, using synchronizer tokens, a best practice. Once created, these tokens are tied to a user’s session and valid for 60 minutes. Usage: Adding CSRF token to forms: //CSRF token generation <form ... action="<protected location>"> <input name="foo" value="bar"> <input name="${dw.web.CSRFProtection.getTokenName()}" value="${dw.web.CSRFProtection.generateToken()"> </form> Then, in scripts call: dw.web.CSRFProtection.validateRequest();

## Properties

### tokenName

**Type:** String (Read Only)

The system generated CSRF token name. Currently, this name is not user configurable. Must be used for
 validateRequest() to work

## Constructor Summary

## Method Summary

### generateToken

**Signature:** `static generateToken() : String`

Constructs a new unique CSRF token for this session.

### getTokenName

**Signature:** `static getTokenName() : String`

Returns the system generated CSRF token name.

### validateRequest

**Signature:** `static validateRequest() : boolean`

Verifies that a client request contains a valid CSRF token, and that the token has not expired.

## Method Detail

## Method Details

### generateToken

**Signature:** `static generateToken() : String`

**Description:** Constructs a new unique CSRF token for this session.

**Returns:**

a new CSRF token

---

### getTokenName

**Signature:** `static getTokenName() : String`

**Description:** Returns the system generated CSRF token name. Currently, this name is not user configurable. Must be used for validateRequest() to work

**Returns:**

System-generated CSRF token parameter name

---

### validateRequest

**Signature:** `static validateRequest() : boolean`

**Description:** Verifies that a client request contains a valid CSRF token, and that the token has not expired. Returns true if these conditions are met, and false otherwise

**Returns:**

true if request contains a valid CSRF token, false otherwise

---
```

--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------

```yaml
name: CI

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main, develop ]

jobs:
  lint:
    runs-on: ubuntu-latest
    permissions:
      contents: read

    steps:
    - name: Checkout code
      uses: actions/checkout@v5

    - name: Setup Node.js
      uses: actions/setup-node@v5
      with:
        node-version: '20'
        cache: 'npm'

    - name: Install dependencies
      run: npm ci

    - name: Run linting
      run: npm run lint:check

  security:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      security-events: write

    steps:
    - name: Checkout code
      uses: actions/checkout@v5

    - name: Setup Node.js
      uses: actions/setup-node@v5
      with:
        node-version: '20'
        cache: 'npm'

    - name: Install dependencies
      run: npm ci

    - name: Run security audit
      run: npm audit --audit-level=moderate

  test:
    runs-on: ubuntu-latest
    permissions:
      contents: read

    strategy:
      matrix:
        node-version: [18, 20, 22, 24]

    steps:
    - name: Checkout code
      uses: actions/checkout@v5

    - name: Setup Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v5
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'

    - name: Install dependencies
      run: npm ci

    - name: Run build
      run: npm run build

    - name: Setup SFCC mock server
      run: |
        cd tests/servers/sfcc-mock-server
        npm install
        npm run setup:logs
        node server.js --port 3000 &
        sleep 5

    - name: Run tests
      run: npm test

    - name: Stop SFCC mock server
      if: always()
      run: |
        # Kill SFCC mock server process
        pkill -f "node.*server.js" || true
        # Fallback: kill any remaining server processes on port 3000
        lsof -ti :3000 | xargs kill -9 2>/dev/null || true

    - name: Upload coverage reports (Node.js 20 only)
      if: matrix.node-version == 20
      uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v3
      with:
        fail_ci_if_error: false
        verbose: true
        files: ./coverage/lcov.info

```

--------------------------------------------------------------------------------
/docs/dw_campaign/ABTestSegment.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.campaign

# Class ABTestSegment

## Inheritance Hierarchy

- Object
  - dw.object.PersistentObject
  - dw.campaign.ABTestSegment

## Description

Object representing an AB-test segment in the Commerce Cloud Digital. Each AB-test defines 1 or more segments to which customers are randomly assigned by the platform when they qualify for the AB-test. Customers are assigned to segments according to allocation percentages controlled by the merchant. Each AB-test segment defines a set of "experiences" that the merchant is testing and which which apply only to the customers in that segment. There is always one "control" segment which contains only the default set of experiences for that site.

## Properties

### ABTest

**Type:** ABTest (Read Only)

Get the AB-test to which this segment belongs.

### controlSegment

**Type:** boolean (Read Only)

Returns true if this is the "control segment" for the AB-test, meaning
 the segment that has no experiences associated with it.

### ID

**Type:** String (Read Only)

Get the ID of the AB-test segment.

## Constructor Summary

## Method Summary

### getABTest

**Signature:** `getABTest() : ABTest`

Get the AB-test to which this segment belongs.

### getID

**Signature:** `getID() : String`

Get the ID of the AB-test segment.

### isControlSegment

**Signature:** `isControlSegment() : boolean`

Returns true if this is the "control segment" for the AB-test, meaning the segment that has no experiences associated with it.

## Method Detail

## Method Details

### getABTest

**Signature:** `getABTest() : ABTest`

**Description:** Get the AB-test to which this segment belongs.

**Returns:**

the AB-test to which this segment belongs.

---

### getID

**Signature:** `getID() : String`

**Description:** Get the ID of the AB-test segment.

**Returns:**

the ID of the AB-test segment.

---

### isControlSegment

**Signature:** `isControlSegment() : boolean`

**Description:** Returns true if this is the "control segment" for the AB-test, meaning the segment that has no experiences associated with it.

**Returns:**

true if this segment is the "control segment" for the AB-test, or false otherwise.

---
```

--------------------------------------------------------------------------------
/docs/dw_catalog/ProductVariationAttribute.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.catalog

# Class ProductVariationAttribute

## Inheritance Hierarchy

- Object
  - dw.catalog.ProductVariationAttribute

## Description

Represents a product variation attribute

## Properties

### attributeID

**Type:** String (Read Only)

The ID of the product attribute defintion related to 
 this variation attribute.  This ID matches the
 value returned by ObjectAttributeDefinition.getID()  
 for the appropriate product attribute definition.
 This ID is generally different than the ID returned by 
 getID().

### displayName

**Type:** String (Read Only)

The display name for the product variation attribute, which can be used in the
 user interface.

### ID

**Type:** String (Read Only)

The ID of the product variation attribute.

## Constructor Summary

## Method Summary

### getAttributeID

**Signature:** `getAttributeID() : String`

Returns the ID of the product attribute defintion related to this variation attribute.

### getDisplayName

**Signature:** `getDisplayName() : String`

Returns the display name for the product variation attribute, which can be used in the user interface.

### getID

**Signature:** `getID() : String`

Returns the ID of the product variation attribute.

## Method Detail

## Method Details

### getAttributeID

**Signature:** `getAttributeID() : String`

**Description:** Returns the ID of the product attribute defintion related to this variation attribute. This ID matches the value returned by ObjectAttributeDefinition.getID() for the appropriate product attribute definition. This ID is generally different than the ID returned by getID().

**Returns:**

the ID of the product attribute definition of this variation attribute.

---

### getDisplayName

**Signature:** `getDisplayName() : String`

**Description:** Returns the display name for the product variation attribute, which can be used in the user interface.

**Returns:**

the display name for the product variation attribute, which can be used in the user interface.

---

### getID

**Signature:** `getID() : String`

**Description:** Returns the ID of the product variation attribute.

**Returns:**

the ID of the product variation attribute.

---
```

--------------------------------------------------------------------------------
/docs/dw_order/TrackingRef.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.order

# Class TrackingRef

## Inheritance Hierarchy

- Object
  - dw.order.TrackingRef

## Description

Provides basic information about the TrackingInfo a ShippingOrderItem is contained.

## Properties

### quantity

**Type:** Quantity

Gets the quantity, the shipping order item is assigned to the tracking
 info.

### shippingOrderItem

**Type:** ShippingOrderItem (Read Only)

Gets the shipping order item which is assigned to the tracking info.

### trackingInfo

**Type:** TrackingInfo (Read Only)

Gets the tracking info, the shipping order item is assigned to.

## Constructor Summary

## Method Summary

### getQuantity

**Signature:** `getQuantity() : Quantity`

Gets the quantity, the shipping order item is assigned to the tracking info.

### getShippingOrderItem

**Signature:** `getShippingOrderItem() : ShippingOrderItem`

Gets the shipping order item which is assigned to the tracking info.

### getTrackingInfo

**Signature:** `getTrackingInfo() : TrackingInfo`

Gets the tracking info, the shipping order item is assigned to.

### setQuantity

**Signature:** `setQuantity(quantity : Quantity) : void`

Sets the quantity, the shipping order item is assigned to the tracking info.

## Method Detail

## Method Details

### getQuantity

**Signature:** `getQuantity() : Quantity`

**Description:** Gets the quantity, the shipping order item is assigned to the tracking info.

**Returns:**

the quantity the shipping order item is assigned to the tracking info.

---

### getShippingOrderItem

**Signature:** `getShippingOrderItem() : ShippingOrderItem`

**Description:** Gets the shipping order item which is assigned to the tracking info.

**Returns:**

the shipping order item

---

### getTrackingInfo

**Signature:** `getTrackingInfo() : TrackingInfo`

**Description:** Gets the tracking info, the shipping order item is assigned to.

**Returns:**

the tracking info

---

### setQuantity

**Signature:** `setQuantity(quantity : Quantity) : void`

**Description:** Sets the quantity, the shipping order item is assigned to the tracking info.

**Parameters:**

- `quantity`: the quantity, the shipping order item is assigned to the tracking info.

---
```

--------------------------------------------------------------------------------
/docs/dw_catalog/SortingOption.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.catalog

# Class SortingOption

## Inheritance Hierarchy

- Object
  - dw.object.PersistentObject
  - dw.catalog.SortingOption

## Description

Represents an option for how to sort products in storefront search results.

## Properties

### description

**Type:** String (Read Only)

The description of the sorting option for the current locale.

### displayName

**Type:** String (Read Only)

The display name of the of the sorting option for the current locale.

### ID

**Type:** String (Read Only)

The ID of the sorting option.

### sortingRule

**Type:** SortingRule (Read Only)

The sorting rule for this sorting option,
 or null if there is no associated rule.

## Constructor Summary

## Method Summary

### getDescription

**Signature:** `getDescription() : String`

Returns the description of the sorting option for the current locale.

### getDisplayName

**Signature:** `getDisplayName() : String`

Returns the display name of the of the sorting option for the current locale.

### getID

**Signature:** `getID() : String`

Returns the ID of the sorting option.

### getSortingRule

**Signature:** `getSortingRule() : SortingRule`

Returns the sorting rule for this sorting option, or null if there is no associated rule.

## Method Detail

## Method Details

### getDescription

**Signature:** `getDescription() : String`

**Description:** Returns the description of the sorting option for the current locale.

**Returns:**

The value of the property for the current locale, or null if it wasn't found.

---

### getDisplayName

**Signature:** `getDisplayName() : String`

**Description:** Returns the display name of the of the sorting option for the current locale.

**Returns:**

The value of the property for the current locale, or null if it wasn't found.

---

### getID

**Signature:** `getID() : String`

**Description:** Returns the ID of the sorting option.

**Returns:**

sorting option ID

---

### getSortingRule

**Signature:** `getSortingRule() : SortingRule`

**Description:** Returns the sorting rule for this sorting option, or null if there is no associated rule.

**Returns:**

a ProductSortingRule instance representing the rule for this option or null.

---
```

--------------------------------------------------------------------------------
/docs/dw_customer/AgentUserStatusCodes.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.customer

# Class AgentUserStatusCodes

## Inheritance Hierarchy

- Object
  - dw.customer.AgentUserStatusCodes

## Description

AgentUserStatusCodes contains constants representing status codes that can be used with a Status object to indicate the success or failure of the agent user login process.

## Constants

### AGENT_USER_NOT_AVAILABLE

**Type:** String = "AGENT_USER_NOT_AVAILABLE"

Indicates that the agent user is not available.

### AGENT_USER_NOT_LOGGED_IN

**Type:** String = "AGENT_USER_NOT_LOGGED_IN"

Indicates that the agent user is not logged in.

### CREDENTIALS_INVALID

**Type:** String = "CREDENTIALS_INVALID"

Indicates that the given agent user login or password was wrong.

### CUSTOMER_DISABLED

**Type:** String = "CUSTOMER_DISABLED"

Indicates that the customer is disabled.

### CUSTOMER_UNREGISTERED

**Type:** String = "CUSTOMER_UNREGISTERED"

Indicates that the customer is either not registered or not registered with the current site.

### INSECURE_CONNECTION

**Type:** String = "INSECURE_CONNECTION"

Indicates that the current connection is not secure (HTTP instead of HTTPS) and the server is configured to require a secure connection.

### INSUFFICIENT_PERMISSION

**Type:** String = "INSUFFICIENT_PERMISSION"

Indicates that the given agent user does not have the permission 'Login_Agent' which is required to login to the storefront as an agent user.

### LOGIN_SUCCESSFUL

**Type:** String = "LOGIN_SUCCESSFUL"

Indicates that the agent user login was successful.

### NO_STOREFRONT

**Type:** String = "NO_STOREFRONT"

Indicates that the current context is not a storefront request.

### PASSWORD_EXPIRED

**Type:** String = "PASSWORD_EXPIRED"

Indicates that the given agent user password has expired and needs to be changed in the Business Manager.

### USER_DISABLED

**Type:** String = "USER_DISABLED"

Indicates that the agent user account has been disabled in the Business Manager.

### USER_LOCKED

**Type:** String = "USER_LOCKED"

Indicates that the agent user account is locked, because the maximum number of failed login attempts was exceeded.

## Properties

## Constructor Summary

AgentUserStatusCodes()

## Method Summary

## Constructor Detail
```

--------------------------------------------------------------------------------
/docs/TopLevel/Namespace.md:
--------------------------------------------------------------------------------

```markdown
## Package: TopLevel

# Class Namespace

## Inheritance Hierarchy

- Object
  - Namespace

## Description

Namespace objects represent XML namespaces and provide an association between a namespace prefix and a Unique Resource Identifier (URI). The prefix is either the undefined value or a string value that may be used to reference the namespace within the lexical representation of an XML value. When an XML object containing a namespace with an undefined prefix is encoded as XML by the method toXMLString(), the implementation will automatically generate a prefix. The URI is a string value used to uniquely identify the namespace.

## Properties

### prefix

**Type:** String (Read Only)

The prefix of the Namespace object.

### uri

**Type:** String (Read Only)

The Uniform Resource Identifier (URI) of the Namespace object.

## Constructor Summary

Namespace() Constructs a simple namespace where the uri and prefix properties are set to an empty string.

Namespace(uriValue : Object) Constructs a Namespace object and assigns values to the uri and prefix properties based on the type of uriValue.

Namespace(prefixValue : Object, uriValue : Object) Constructs a Namespace object and assigns values to the uri and prefix properties.

## Method Summary

### getPrefix

**Signature:** `getPrefix() : String`

Returns the prefix of the Namespace object.

### getUri

**Signature:** `getUri() : String`

Returns the Uniform Resource Identifier (URI) of the Namespace object.

### toString

**Signature:** `toString() : String`

Returns a string representation of this Namespace object.

## Constructor Detail

## Method Detail

## Method Details

### getPrefix

**Signature:** `getPrefix() : String`

**Description:** Returns the prefix of the Namespace object.

**Returns:**

the prefix of the Namespace object.

---

### getUri

**Signature:** `getUri() : String`

**Description:** Returns the Uniform Resource Identifier (URI) of the Namespace object.

**Returns:**

the Uniform Resource Identifier (URI) of the Namespace object.

---

### toString

**Signature:** `toString() : String`

**Description:** Returns a string representation of this Namespace object.

**Returns:**

a string representation of this Namespace object.

---
```

--------------------------------------------------------------------------------
/docs/dw_extensions.facebook/FacebookFeedHooks.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.extensions.facebook

# Class FacebookFeedHooks

## Inheritance Hierarchy

- dw.extensions.facebook.FacebookFeedHooks

## Description

FacebookFeedHooks interface containing extension points for customizing Facebook 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.facebook.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.

## Constants

## Properties

## Constructor Summary

## Method Summary

### transformProduct

**Signature:** `transformProduct(product : Product, facebookProduct : FacebookProduct, feedId : String) : Status`

Called after default transformation of given Demandware product to Facebook product as part of the catalog feed export.

## Method Detail

## Method Details

### transformProduct

**Signature:** `transformProduct(product : Product, facebookProduct : FacebookProduct, feedId : String) : Status`

**Description:** Called after default transformation of given Demandware product to Facebook product as part of the catalog feed export. To customize multiple feeds differently, for example if one is for Facebook Dynamic Ads and the other is for Instagram Commerce, use the feedId parameter to determine which feed is being exported. If the same customization should apply to all feeds, ignore the parameter.

**Parameters:**

- `product`: the Demandware product
- `facebookProduct`: the Facebook representation of the product
- `feedId`: the merchant-selected ID for the feed being exported

**Returns:**

a non-null Status ends the hook execution

---
```

--------------------------------------------------------------------------------
/docs/dw_system/RESTErrorResponse.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.system

# Class RESTErrorResponse

## Inheritance Hierarchy

- Object
  - dw.system.RESTErrorResponse

## Description

This class represents a REST error response that is compliant with RFC 9457. It can only be instantiated using the createError methods in RESTResponseMgr. Here is an example: var error = RESTResponseMgr.createError(400); error.custom.foo = "bar"; error.render(); The above script would result in an HTTP response with status code 400 and the following body: { "type": "https://api.commercecloud.salesforce.com/documentation/error/v1/custom-errors/bad-request", "c_foo": "bar" } NOTE: Custom attributes are rendered with "c_" prefix as shown in the example above. Rendering works as described in JSON.stringify(Object).

## Properties

### custom

**Type:** CustomAttributes (Read Only)

All the custom attributes associated with the error response object. The attributes are stored for the
 lifetime of the error response object.

## Constructor Summary

## Method Summary

### getCustom

**Signature:** `getCustom() : CustomAttributes`

Returns all the custom attributes associated with the error response object.

### render

**Signature:** `render() : void`

Sends the RESTErrorResponse object as an HTTP error response to the client, adhering to RFC 9457.

## Method Detail

## Method Details

### getCustom

**Signature:** `getCustom() : CustomAttributes`

**Description:** Returns all the custom attributes associated with the error response object. The attributes are stored for the lifetime of the error response object.

**Returns:**

All the custom attributes associated with the error response object.

---

### render

**Signature:** `render() : void`

**Description:** Sends the RESTErrorResponse object as an HTTP error response to the client, adhering to RFC 9457. This method sets the "Content-Type" header to "application/problem+json", HTTP Status Code to statusCode attribute and constructs the body from type, title, detail and custom attributes of the object. Custom attributes are rendered with "c_" prefix to the attribute name.

**Throws:**

IllegalStateException - If the RESTErrorResponse object is already rendered.
Exception - If there is an error while serializing the RESTErrorResponse object.

---
```

--------------------------------------------------------------------------------
/docs/dw_customer/CustomerPasswordConstraints.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.customer

# Class CustomerPasswordConstraints

## Inheritance Hierarchy

- Object
  - dw.customer.CustomerPasswordConstraints

## Description

Provides access to the constraints of customer passwords. An instance of this class can be obtained via CustomerMgr.getPasswordConstraints().

## Properties

### forceLetters

**Type:** boolean (Read Only)

Returns true if letters are enforced.

### forceMixedCase

**Type:** boolean (Read Only)

Returns true if mixed case is enforced.

### forceNumbers

**Type:** boolean (Read Only)

Returns true if numbers are enforced.

### minLength

**Type:** Number (Read Only)

The minimum length.

### minSpecialChars

**Type:** Number (Read Only)

The minimum number of special characters.

## Constructor Summary

## Method Summary

### getMinLength

**Signature:** `static getMinLength() : Number`

Returns the minimum length.

### getMinSpecialChars

**Signature:** `static getMinSpecialChars() : Number`

Returns the minimum number of special characters.

### isForceLetters

**Signature:** `static isForceLetters() : boolean`

Returns true if letters are enforced.

### isForceMixedCase

**Signature:** `static isForceMixedCase() : boolean`

Returns true if mixed case is enforced.

### isForceNumbers

**Signature:** `static isForceNumbers() : boolean`

Returns true if numbers are enforced.

## Method Detail

## Method Details

### getMinLength

**Signature:** `static getMinLength() : Number`

**Description:** Returns the minimum length.

**Returns:**

the minimum length

---

### getMinSpecialChars

**Signature:** `static getMinSpecialChars() : Number`

**Description:** Returns the minimum number of special characters.

**Returns:**

the minimum number of special characters

---

### isForceLetters

**Signature:** `static isForceLetters() : boolean`

**Description:** Returns true if letters are enforced.

**Returns:**

if letters are enforced

---

### isForceMixedCase

**Signature:** `static isForceMixedCase() : boolean`

**Description:** Returns true if mixed case is enforced.

**Returns:**

if mixed case is enforced

---

### isForceNumbers

**Signature:** `static isForceNumbers() : boolean`

**Description:** Returns true if numbers are enforced.

**Returns:**

if numbers are enforced

---
```

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

```typescript

import React from 'react';

export const SearchIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (
  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" {...props}>
    <path strokeLinecap="round" strokeLinejoin="round" d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z" />
  </svg>
);

export const ReactIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="-11.5 -10.23174 23 20.46348" {...props}>
        <circle cx="0" cy="0" r="2.05" fill="currentColor"></circle>
        <g stroke="currentColor" strokeWidth="1" fill="none">
            <ellipse rx="11" ry="4.2"></ellipse>
            <ellipse rx="11" ry="4.2" transform="rotate(60)"></ellipse>
            <ellipse rx="11" ry="4.2" transform="rotate(120)"></ellipse>
        </g>
    </svg>
);

export const ChevronDownIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (
    <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" {...props}>
        <path strokeLinecap="round" strokeLinejoin="round" d="M19.5 8.25l-7.5 7.5-7.5-7.5" />
    </svg>
);

export const CopyIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (
  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" {...props}>
    <path strokeLinecap="round" strokeLinejoin="round" d="M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 00-3.375-3.375h-1.5a1.125 1.125 0 01-1.125-1.125v-1.5a3.375 3.375 0 00-3.375-3.375H9.75" />
  </svg>
);

export const CheckIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (
    <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" {...props}>
        <path strokeLinecap="round" strokeLinejoin="round" d="M4.5 12.75l6 6 9-13.5" />
    </svg>
);

```

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

```typescript
import React from 'react';
import { Link } from 'react-router-dom';

interface NewcomerCTAProps {
  /** Additional CSS classes to apply to the wrapper */
  className?: string;
  /** Custom href if different from default */
  href?: string;
  /** Whether to show as centered or inline */
  centered?: boolean;
}

/**
 * Prominent call-to-action button for users new to MCP servers.
 * Directs them to the AI assistant setup guide.
 */
const NewcomerCTA: React.FC<NewcomerCTAProps> = ({ 
  className = '', 
  href = '/ai-interfaces/#ai-assistant-setup',
  centered = true 
}) => {
  const wrapperClasses = centered ? 'text-center' : '';
  
  return (
    <div className={`${wrapperClasses} ${className}`}>
      <div className="inline-block bg-gradient-to-r from-orange-500 to-red-500 p-1 rounded-2xl shadow-lg">
        <Link 
          to={href}
          className="group block bg-white rounded-xl px-8 py-4 text-center no-underline hover:no-underline focus:no-underline transition-all duration-300 hover:bg-gray-50"
        >
          <div className="flex items-center justify-center gap-3">
            <div className="bg-gradient-to-r from-orange-500 to-red-500 rounded-full p-2 md:p-3 shadow-inner">
              <svg className="w-6 h-6 md:w-7 md:h-7 text-white drop-shadow-sm" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true" focusable="false">
                <path 
                  fillRule="evenodd" 
                  d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-3a1 1 0 00-.867.5 1 1 0 11-1.731-1A3 3 0 0113 8a3.001 3.001 0 01-2 2.83V11a1 1 0 11-2 0v-1a1 1 0 011-1 1 1 0 100-2zm0 8a1 1 0 100-2 1 1 0 000 2z" 
                  clipRule="evenodd" 
                />
              </svg>
            </div>
            <div className="text-left">
              <div className="text-lg font-bold text-gray-900 mb-1">
                New to MCP servers? 
                <span className="ml-2 group-hover:translate-x-1 inline-block transition-transform text-orange-600">→</span>
              </div>
              <div className="text-sm text-gray-600">
                Complete setup guide for AI assistants (Claude, GitHub Copilot, etc.)
              </div>
            </div>
          </div>
        </Link>
      </div>
    </div>
  );
};

export default NewcomerCTA;
```

--------------------------------------------------------------------------------
/docs/TopLevel/Function.md:
--------------------------------------------------------------------------------

```markdown
## Package: TopLevel

# Class Function

## Inheritance Hierarchy

- Object
  - Function

## Description

The Function class represent a JavaScript function.

## Properties

### length

**Type:** Number

The number of named arguments that were specified
 when the function was declared.

### prototype

**Type:** Object

An object that defines properties and methods
 shared by all objects created with that
 constructor function.

## Constructor Summary

Function(args : String...) Constructs the function with the specified arguments where the last argument represents the function body and all preceeding arguments represent the function parameters.

## Method Summary

### apply

**Signature:** `apply(thisobj : Object, args : Array) : Object`

Invokes this function as a method of the specified object passing the specified Array of arguments.

### call

**Signature:** `call(thisobj : Object, args : Object...) : Object`

Invokes this function as a method of the specified object passing the specified optional arguments.

### toString

**Signature:** `toString() : String`

Returns a String representation of this function object.

## Constructor Detail

## Method Detail

## Method Details

### apply

**Signature:** `apply(thisobj : Object, args : Array) : Object`

**Description:** Invokes this function as a method of the specified object passing the specified Array of arguments.

**Parameters:**

- `thisobj`: the object to which the function is applied.
- `args`: Array of values or an arguments object to be passed as arguments to the function.

**Returns:**

whatever value is returned by the invocation of the function.

---

### call

**Signature:** `call(thisobj : Object, args : Object...) : Object`

**Description:** Invokes this function as a method of the specified object passing the specified optional arguments.

**Parameters:**

- `thisobj`: the object to which the function is applied.
- `args`: an optional list of one or more arguments values that are passed as arguments to the function.

**Returns:**

whatever value is returned by the invocation of the function.

---

### toString

**Signature:** `toString() : String`

**Description:** Returns a String representation of this function object.

**Returns:**

a String representation of this function object.

---
```

--------------------------------------------------------------------------------
/docs/dw_value/EnumValue.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.value

# Class EnumValue

## Inheritance Hierarchy

- Object
  - dw.value.EnumValue

## Description

The class represents a single value for an Enumeration type. Enumeration types can be configured through the business manager for custom attributes. Some system attributes, e.g. the order status, are also of Enumeration types. Each EnumValue has a base value and a display value. The type of the base value can be either String or Integer. Every EnumValue has a display value. If the value of an Enumeration type object attribute is null, when that attribute is accessed an EnumValue is returned that has a base value of null, rather than null itself. This means that empty(object.attribute) would be false, and empty(object.attribute.value) would be true.

## Properties

### displayValue

**Type:** String (Read Only)

The display value of the enumeration value. If no display value
 is configured the method return the string representation of the value.

### value

**Type:** Object (Read Only)

The value of the enumeration value. This is either an integer
 value or a string.

## Constructor Summary

## Method Summary

### getDisplayValue

**Signature:** `getDisplayValue() : String`

Returns the display value of the enumeration value.

### getValue

**Signature:** `getValue() : Object`

Returns the value of the enumeration value.

### toString

**Signature:** `toString() : String`

Same as getDisplayValue().

### valueOf

**Signature:** `valueOf() : Object`

According the ECMA specification, this method returns the "natural" primitive value of this object.

## Method Detail

## Method Details

### getDisplayValue

**Signature:** `getDisplayValue() : String`

**Description:** Returns the display value of the enumeration value. If no display value is configured the method return the string representation of the value.

---

### getValue

**Signature:** `getValue() : Object`

**Description:** Returns the value of the enumeration value. This is either an integer value or a string.

---

### toString

**Signature:** `toString() : String`

**Description:** Same as getDisplayValue().

---

### valueOf

**Signature:** `valueOf() : Object`

**Description:** According the ECMA specification, this method returns the "natural" primitive value of this object. Here it is equivalent to getValue().

---
```

--------------------------------------------------------------------------------
/tests/mcp/yaml/search-custom-object-attribute-definitions.docs-only.test.mcp.yml:
--------------------------------------------------------------------------------

```yaml
description: "Tests for search_custom_object_attribute_definitions tool in docs-only mode"
# Run with: npx aegis "tests/mcp/yaml/search-custom-object-attribute-definitions.docs-only.test.mcp.yml" --config ./aegis.config.docs-only.json

tests:
  # Docs-Only Mode Tests (tool not configured)
  - it: "should return configuration error in docs-only mode"
    request:
      jsonrpc: "2.0"
      method: "tools/call"
      id: 1
      params:
        name: "search_custom_object_attribute_definitions"
        arguments:
          objectType: "VersionHistory"
          searchRequest:
            query:
              match_all_query: {}
    expect:
      response:
        jsonrpc: "2.0"
        id: 1
        result:
          content:
            match:arrayElements:
              match:partial:
                type: "text"
                text: "match:contains:OCAPI client not configured"
          isError: true
      stderr: "toBeEmpty"
      performance:
        maxResponseTime: "500ms"

  - it: "should handle error gracefully with minimal parameters in docs-only mode"
    request:
      jsonrpc: "2.0"
      method: "tools/call"
      id: 2
      params:
        name: "search_custom_object_attribute_definitions"
        arguments:
          objectType: "CustomAPI"
    expect:
      response:
        jsonrpc: "2.0"
        id: 2
        result:
          content:
            match:arrayElements:
              match:partial:
                type: "text"
                text: "match:contains:OCAPI client not configured"
          isError: true
      stderr: "toBeEmpty"
      performance:
        maxResponseTime: "500ms"

  - it: "should return OCAPI client not configured error even with invalid parameters"
    request:
      jsonrpc: "2.0"
      method: "tools/call"
      id: 3
      params:
        name: "search_custom_object_attribute_definitions"
        arguments:
          objectType: ""
          searchRequest:
            query:
              match_all_query: {}
    expect:
      response:
        jsonrpc: "2.0"
        id: 3
        result:
          content:
            match:arrayElements:
              match:partial:
                type: "text"
                text: "match:contains:OCAPI client not configured"
          isError: true
      stderr: "toBeEmpty"
      performance:
        maxResponseTime: "500ms"
```

--------------------------------------------------------------------------------
/docs/dw_catalog/StoreInventoryFilterValue.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.catalog

# Class StoreInventoryFilterValue

## Inheritance Hierarchy

- Object
  - dw.catalog.StoreInventoryFilterValue

## Description

This class represents a store inventory filter value, which can be used for a StoreInventoryFilter to filter the search result by one or more store inventory list IDs via ProductSearchModel.setStoreInventoryFilter(StoreInventoryFilter). Compared to ProductSearchModel.setInventoryListIDs(List) the store inventory filter allows a customization of the inventory parameter name and the inventory list ID values for URL generations. A StoreInventoryFilterValue provides the mapping between a semantic value e.g. store1,store2 or Burlington,Boston to the related real inventory list ID. 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") ));

## Properties

### inventoryListID

**Type:** String (Read Only)

The real inventory list ID of this store inventory filter value.

### semanticInventoryID

**Type:** String (Read Only)

The semantic inventory ID of this store inventory filter value.

## Constructor Summary

StoreInventoryFilterValue(semanticInventoryListID : String, inventoryListID : String) Creates a new StoreInventoryFilterValue instance for the semantic inventory ID and real inventory list ID.

## Method Summary

### getInventoryListID

**Signature:** `getInventoryListID() : String`

Returns the real inventory list ID of this store inventory filter value.

### getSemanticInventoryID

**Signature:** `getSemanticInventoryID() : String`

Returns the semantic inventory ID of this store inventory filter value.

## Constructor Detail

## Method Detail

## Method Details

### getInventoryListID

**Signature:** `getInventoryListID() : String`

**Description:** Returns the real inventory list ID of this store inventory filter value.

**Returns:**

the real inventory list ID of this store inventory filter value.

---

### getSemanticInventoryID

**Signature:** `getSemanticInventoryID() : String`

**Description:** Returns the semantic inventory ID of this store inventory filter value.

**Returns:**

the semantic inventory ID of this store inventory filter value.

---
```

--------------------------------------------------------------------------------
/docs/dw_io/FileWriter.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.io

# Class FileWriter

## Inheritance Hierarchy

- Object
  - dw.io.Writer
  - dw.io.FileWriter

## Description

Convenience class for writing character files. Files are stored in a shared file system where multiple processes could access the same file. The client code is responsible for ensuring that no more than one process writes to a file at a given time. Note: when this class is used with sensitive data, be careful in persisting sensitive information to disk.

## Properties

### lineSeparator

**Type:** String

Get the current line separator (e.g. '\n' or '\r\n'), if no value is set the system default '\n' will be used.

## Constructor Summary

FileWriter(file : File) Constructs the writer for the specified file.

FileWriter(file : File, append : boolean) Constructs the writer for the specified file.

FileWriter(file : File, encoding : String) Constructs the writer for the specified file with the specified encoding.

FileWriter(file : File, encoding : String, append : boolean) Constructs the writer for the specified file with the specified encoding.

## Method Summary

### close

**Signature:** `close() : void`

Closes the writer.

### getLineSeparator

**Signature:** `getLineSeparator() : String`

Get the current line separator (e.g.

### setLineSeparator

**Signature:** `setLineSeparator(lineSeparator : String) : void`

Set the line separator (e.g.

### writeLine

**Signature:** `writeLine(str : String) : void`

Writes the specified line and appends the line separator.

## Constructor Detail

## Method Detail

## Method Details

### close

**Signature:** `close() : void`

**Description:** Closes the writer.

---

### getLineSeparator

**Signature:** `getLineSeparator() : String`

**Description:** Get the current line separator (e.g. '\n' or '\r\n'), if no value is set the system default '\n' will be used.

---

### setLineSeparator

**Signature:** `setLineSeparator(lineSeparator : String) : void`

**Description:** Set the line separator (e.g. '\n' or '\r\n'), if no value is set the system default '\n' will be used.

**Parameters:**

- `lineSeparator`: that will be written at the end of each line

---

### writeLine

**Signature:** `writeLine(str : String) : void`

**Description:** Writes the specified line and appends the line separator.

**Parameters:**

- `str`: the line to write to the file.

---
```

--------------------------------------------------------------------------------
/docs/dw_order/AppeasementItem.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.order

# Class AppeasementItem

## Inheritance Hierarchy

- Object
  - dw.object.Extensible
  - dw.order.AbstractItem
    - dw.order.AppeasementItem

## Description

Represents an item of an Appeasement which is associated with one OrderItem usually representing an Order ProductLineItem. Items are created using method Appeasement.addItems(Money, List) When the related Appeasement were set to status COMPLETED, only the the custom attributes of the appeasement item can be changed. Order post-processing APIs (gillian) are now inactive by default and will throw an exception if accessed. Activation needs preliminary approval by Product Management. Please contact support in this case. Existing customers using these APIs are not affected by this change and can use the APIs until further notice.

## Properties

### appeasementNumber

**Type:** String (Read Only)

The number of the Appeasement to which this item belongs.

### parentItem

**Type:** AppeasementItem

Returns null or the parent item.

## Constructor Summary

## Method Summary

### getAppeasementNumber

**Signature:** `getAppeasementNumber() : String`

Returns the number of the Appeasement to which this item belongs.

### getParentItem

**Signature:** `getParentItem() : AppeasementItem`

Returns null or the parent item.

### setParentItem

**Signature:** `setParentItem(parentItem : AppeasementItem) : void`

Set a parent item.

## Method Detail

## Method Details

### getAppeasementNumber

**Signature:** `getAppeasementNumber() : String`

**Description:** Returns the number of the Appeasement to which this item belongs.

**Returns:**

the number of the Appeasement to which this item belongs

---

### getParentItem

**Signature:** `getParentItem() : AppeasementItem`

**Description:** Returns null or the parent item.

**Returns:**

null or the parent item.

---

### setParentItem

**Signature:** `setParentItem(parentItem : AppeasementItem) : void`

**Description:** Set a parent item. The parent item must belong to the same Appeasement. An infinite parent-child loop is disallowed as is a parent-child depth greater than 10. Setting a parent item indicates a dependency of the child item on the parent item, and can be used to form a parallel structure to that accessed using ProductLineItem.getParent().

**Parameters:**

- `parentItem`: The parent item, null is allowed

---
```

--------------------------------------------------------------------------------
/docs/TopLevel/WeakMap.md:
--------------------------------------------------------------------------------

```markdown
## Package: TopLevel

# Class WeakMap

## Inheritance Hierarchy

- Object
  - WeakMap

## Description

The WeakMap is map whose entries are subject to garbage collection if there are no more references to the keys. Keys must be objects (no primitives). Elements can't be iterated.

## Properties

### size

**Type:** Number

Number of key/value pairs stored in this map.

## Constructor Summary

WeakMap() Creates an empty map.

WeakMap(values : Iterable) If the passed value is null or undefined then an empty map is constructed.

## Method Summary

### clear

**Signature:** `clear() : void`

Removes all key/value pairs from this map.

### delete

**Signature:** `delete(key : Object) : boolean`

Removes the entry for the given key.

### get

**Signature:** `get(key : Object) : Object`

Returns the value associated with the given key.

### has

**Signature:** `has(key : Object) : boolean`

Returns if this map has value associated with the given key.

### set

**Signature:** `set(key : Object, value : Object) : WeakMap`

Adds or updates a key/value pair to the map.

## Constructor Detail

## Method Detail

## Method Details

### clear

**Signature:** `clear() : void`

**Description:** Removes all key/value pairs from this map.

---

### delete

**Signature:** `delete(key : Object) : boolean`

**Description:** Removes the entry for the given key.

**Parameters:**

- `key`: The key of the key/value pair to be removed from the map.

**Returns:**

true if the map contained an entry for the passed key that was removed. Else false is returned.

---

### get

**Signature:** `get(key : Object) : Object`

**Description:** Returns the value associated with the given key.

**Parameters:**

- `key`: The key to look for.

**Returns:**

The value associated with the given key if an entry with the key exists else undefined is returned.

---

### has

**Signature:** `has(key : Object) : boolean`

**Description:** Returns if this map has value associated with the given key.

**Parameters:**

- `key`: The key to look for.

**Returns:**

true if an entry with the key exists else false is returned.

---

### set

**Signature:** `set(key : Object, value : Object) : WeakMap`

**Description:** Adds or updates a key/value pair to the map.

**Parameters:**

- `key`: The key object.
- `value`: The value to be associate with the key.

**Returns:**

This map object.

---
```

--------------------------------------------------------------------------------
/docs/dw_svc/LocalServiceRegistry.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.svc

# Class LocalServiceRegistry

## Inheritance Hierarchy

- Object
  - dw.svc.LocalServiceRegistry

## Description

The LocalServiceRegistry is responsible for managing Service instances. Typical usage involves several steps: The service is defined in the Business Manager and configured with necessary credentials. An instance of the service is created and configured in a script: var myFTPService = LocalServiceRegistry.createService("MyFTPService", { mockExec : function(svc:FTPService, params) { return [ { "name": "file1", "timestamp": new Date(2011, 02, 21)}, { "name": "file2", "timestamp": new Date(2012, 02, 21)}, { "name": "file3", "timestamp": new Date(2013, 02, 21)} ]; }, createRequest: function(svc:FTPService, params) { svc.setOperation("list", "/"); }, parseResponse : function(svc:FTPService, listOutput) { var x : Array = []; var resp : Array = listOutput; for(var i = 0; i < resp.length; i++) { var f = resp[i]; x.push( { "name": f['name'], "timestamp": f['timestamp'] } ); } return x; } }); The service is called in order to perform the operation: var result : Result = myFTPService.call(); if(result.status == 'OK') { // The result.object is the object returned by the 'after' callback. } else { // Handle the error. See result.error for more information. } Unlike ServiceRegistry, the configured service is local to the current script call, so this deals directly with Service instances rather than the intermediate ServiceDefinition. This means that a cartridge-level initialization script (and the package.json) is no longer needed. See ServiceCallback for all the callback options, and individual Service classes for customization specific to a service type.

## Constructor Summary

## Method Summary

### createService

**Signature:** `static createService(serviceID : String, configObj : Object) : Service`

Constructs and configures a service with a callback.

## Method Detail

## Method Details

### createService

**Signature:** `static createService(serviceID : String, configObj : Object) : Service`

**Description:** Constructs and configures a service with a callback.

**Parameters:**

- `serviceID`: Unique Service ID.
- `configObj`: Configuration callback. See ServiceCallback for a description of available callback methods.

**Returns:**

Associated Service, which can be used for further protocol-specific configuration.

---
```

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

```typescript

import React, { useState, useEffect } from 'react';
import { useLocation } from 'react-router-dom';
import { TocItem } from '../types';

interface OnThisPageProps {
  items: TocItem[];
}

const OnThisPage: React.FC<OnThisPageProps> = ({ items }) => {
  const [activeId, setActiveId] = useState<string>('');
  const location = useLocation();
  const [initialPathHash, setInitialPathHash] = useState('');

  // Reset active ID when location changes
  useEffect(() => {
    setActiveId('');
  }, [location.pathname]);

  useEffect(() => {
    // Only run on client side
    if (typeof window === 'undefined') return;
    
    if (items.length === 0) {
      setActiveId('');
      return;
    }

    // Set initial path hash on client side only to prevent SSR hydration mismatch
    setInitialPathHash(window.location.hash);

    const observer = new IntersectionObserver(
      (entries) => {
        const visibleHeadings = entries
          .filter(entry => entry.isIntersecting)
          .map(entry => entry.target.id);
        
        if (visibleHeadings.length > 0) {
          // Set the first visible heading as active
          setActiveId(visibleHeadings[0]);
        }
      },
      {
        rootMargin: '-20px 0px -80% 0px',
        threshold: 0
      }
    );

    // Observe all headings
    items.forEach(item => {
      const element = document.getElementById(item.id);
      if (element) {
        observer.observe(element);
      }
    });

    return () => {
      observer.disconnect();
    };
  }, [items, location.pathname]); // Added location.pathname to dependencies

  if (items.length === 0) {
    return null;
  }

  return (
    <div className="pt-12">
      <h2 className="text-sm font-bold text-slate-800 mb-4">On this page</h2>
      <div className="max-h-96 overflow-y-auto">
        <ul className="space-y-2 text-sm">
          {items.map(item => (
            <li key={item.id}>
              <a
                href={`#${item.id}`}
                className={`block transition-colors ${
                  activeId === item.id
                    ? 'text-blue-600 font-medium border-l-2 border-blue-600 pl-2 -ml-2'
                    : 'text-slate-500 hover:text-slate-800'
                }`}
              >
                {item.label}
              </a>
            </li>
          ))}
        </ul>
      </div>
    </div>
  );
};

export default OnThisPage;

```

--------------------------------------------------------------------------------
/docs/dw_campaign/SlotContent.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.campaign

# Class SlotContent

## Inheritance Hierarchy

- Object
  - dw.campaign.SlotContent

## Description

Represents content for a slot.

## Properties

### calloutMsg

**Type:** MarkupText (Read Only)

The callout message for the slot.

### content

**Type:** Collection (Read Only)

A collection of content based on the content type
 for the slot. The collection will include one of the following
 types: Product, Content, Category, or MarkupText.

### custom

**Type:** Map (Read Only)

The custom attributes for the slot.

### recommenderName

**Type:** String (Read Only)

The recommender name for slot configurations of type 'Recommendation'

### slotID

**Type:** String (Read Only)

The unique slot ID.

## Constructor Summary

## Method Summary

### getCalloutMsg

**Signature:** `getCalloutMsg() : MarkupText`

Returns the callout message for the slot.

### getContent

**Signature:** `getContent() : Collection`

Returns a collection of content based on the content type for the slot.

### getCustom

**Signature:** `getCustom() : Map`

Returns the custom attributes for the slot.

### getRecommenderName

**Signature:** `getRecommenderName() : String`

Returns the recommender name for slot configurations of type 'Recommendation'

### getSlotID

**Signature:** `getSlotID() : String`

Returns the unique slot ID.

## Method Detail

## Method Details

### getCalloutMsg

**Signature:** `getCalloutMsg() : MarkupText`

**Description:** Returns the callout message for the slot.

**Returns:**

Callout message of the slot.

---

### getContent

**Signature:** `getContent() : Collection`

**Description:** Returns a collection of content based on the content type for the slot. The collection will include one of the following types: Product, Content, Category, or MarkupText.

**Returns:**

All content of the slot.

---

### getCustom

**Signature:** `getCustom() : Map`

**Description:** Returns the custom attributes for the slot.

**Returns:**

Custom attributes of the slot.

---

### getRecommenderName

**Signature:** `getRecommenderName() : String`

**Description:** Returns the recommender name for slot configurations of type 'Recommendation'

**Returns:**

the recommender name for slot configurations of type 'Recommendation'

---

### getSlotID

**Signature:** `getSlotID() : String`

**Description:** Returns the unique slot ID.

**Returns:**

ID of the slot.

---
```

--------------------------------------------------------------------------------
/docs/dw_catalog/ProductOptionValue.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.catalog

# Class ProductOptionValue

## Inheritance Hierarchy

- Object
  - dw.object.PersistentObject
  - dw.object.ExtensibleObject
    - dw.catalog.ProductOptionValue

## Description

Represents the value of a product option.

## Properties

### description

**Type:** String (Read Only)

The the product option value's description
 in the current locale.

### displayValue

**Type:** String (Read Only)

The the product option value's display name
 in the current locale.

### ID

**Type:** String (Read Only)

The product option value's ID.

### productIDModifier

**Type:** String (Read Only)

The product option value's product ID modifier which
 can be used to build the SKU for the actual product.

## Constructor Summary

## Method Summary

### getDescription

**Signature:** `getDescription() : String`

Returns the the product option value's description in the current locale.

### getDisplayValue

**Signature:** `getDisplayValue() : String`

Returns the the product option value's display name in the current locale.

### getID

**Signature:** `getID() : String`

Returns the product option value's ID.

### getProductIDModifier

**Signature:** `getProductIDModifier() : String`

Returns the product option value's product ID modifier which can be used to build the SKU for the actual product.

## Method Detail

## Method Details

### getDescription

**Signature:** `getDescription() : String`

**Description:** Returns the the product option value's description in the current locale.

**Returns:**

The value of the product option value's description in the current locale, or null if it wasn't found.

---

### getDisplayValue

**Signature:** `getDisplayValue() : String`

**Description:** Returns the the product option value's display name in the current locale.

**Returns:**

The value of the product option value's display name in the current locale, or null if it wasn't found.

---

### getID

**Signature:** `getID() : String`

**Description:** Returns the product option value's ID.

**Returns:**

the product option value's ID.

---

### getProductIDModifier

**Signature:** `getProductIDModifier() : String`

**Description:** Returns the product option value's product ID modifier which can be used to build the SKU for the actual product.

**Returns:**

the product option value's product ID modifier which can be used to build the SKU for the actual product.

---
```

--------------------------------------------------------------------------------
/docs/dw_customer/AuthenticationStatus.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.customer

# Class AuthenticationStatus

## Inheritance Hierarchy

- Object
  - dw.customer.AuthenticationStatus

## Description

Holds the status of an authentication process.

## Constants

### AUTH_OK

**Type:** String = "AUTH_OK"

Authentication was successful

### ERROR_CUSTOMER_DISABLED

**Type:** String = "ERROR_CUSTOMER_DISABLED"

customer could be found, but is disabled. Password was not verified.

### ERROR_CUSTOMER_LOCKED

**Type:** String = "ERROR_CUSTOMER_LOCKED"

customer could be found, but is locked (too many failed login attempts). Password was verified before.

### ERROR_CUSTOMER_NOT_FOUND

**Type:** String = "ERROR_CUSTOMER_NOT_FOUND"

customer could not be found

### ERROR_PASSWORD_EXPIRED

**Type:** String = "ERROR_PASSWORD_EXPIRED"

Password does match, but is expired.

### ERROR_PASSWORD_MISMATCH

**Type:** String = "ERROR_PASSWORD_MISMATCH"

the used password is not correct

### ERROR_UNKNOWN

**Type:** String = "ERROR_UNKNOWN"

Any other error

## Properties

### authenticated

**Type:** boolean (Read Only)

checks whether the authentication was successful or not

### customer

**Type:** Customer (Read Only)

The customer, corresponding to the login used during authentication. This customer is not logged in after authentication.

### status

**Type:** String (Read Only)

the status code (see the constants above)

## Constructor Summary

## Method Summary

### getCustomer

**Signature:** `getCustomer() : Customer`

The customer, corresponding to the login used during authentication.

### getStatus

**Signature:** `getStatus() : String`

the status code (see the constants above)

### isAuthenticated

**Signature:** `isAuthenticated() : boolean`

checks whether the authentication was successful or not

## Method Detail

## Method Details

### getCustomer

**Signature:** `getCustomer() : Customer`

**Description:** The customer, corresponding to the login used during authentication. This customer is not logged in after authentication.

**Returns:**

the customer described by the login

---

### getStatus

**Signature:** `getStatus() : String`

**Description:** the status code (see the constants above)

**Returns:**

the status code

---

### isAuthenticated

**Signature:** `isAuthenticated() : boolean`

**Description:** checks whether the authentication was successful or not

**Returns:**

the when the authentication was successful

---
```

--------------------------------------------------------------------------------
/tests/servers/sfcc-mock-server/mock-data/ocapi/custom-object-attributes-globalsettings.json:
--------------------------------------------------------------------------------

```json
{
  "_v": "23.2",
  "_type": "object_attribute_definition_search_result",
  "count": 3,
  "data": [
    {
      "_type": "object_attribute_definition",
      "id": "customString",
      "displayName": {
        "default": "Custom String Field"
      },
      "description": {
        "default": "A custom string field for storing additional data"
      },
      "value_type": "string",
      "mandatory": false,
      "max_length": 256,
      "min_length": null,
      "regular_expression": null,
      "default_value": null,
      "localizable": true,
      "searchable": true,
      "system": false,
      "visible": true,
      "_links": {
        "self": {
          "href": "https://{{hostname}}/s/-/dw/data/v23_2/custom_object_definitions/GlobalSettings/attribute_definitions/customString"
        }
      }
    },
    {
      "_type": "object_attribute_definition",
      "id": "customNumber",
      "displayName": {
        "default": "Custom Number Field"
      },
      "description": {
        "default": "A custom number field for numeric values"
      },
      "value_type": "double",
      "mandatory": false,
      "max_length": null,
      "min_length": null,
      "regular_expression": null,
      "scale": 2,
      "max_value": 999999.99,
      "min_value": 0.0,
      "default_value": null,
      "localizable": false,
      "searchable": true,
      "system": false,
      "visible": true,
      "_links": {
        "self": {
          "href": "https://{{hostname}}/s/-/dw/data/v23_2/custom_object_definitions/GlobalSettings/attribute_definitions/customNumber"
        }
      }
    },
    {
      "_type": "object_attribute_definition",
      "id": "customBoolean",
      "displayName": {
        "default": "Custom Boolean Field"
      },
      "description": {
        "default": "A custom boolean field for true/false values"
      },
      "value_type": "boolean",
      "mandatory": false,
      "max_length": null,
      "min_length": null,
      "regular_expression": null,
      "default_value": false,
      "localizable": false,
      "searchable": false,
      "system": false,
      "visible": true,
      "_links": {
        "self": {
          "href": "https://{{hostname}}/s/-/dw/data/v23_2/custom_object_definitions/GlobalSettings/attribute_definitions/customBoolean"
        }
      }
    }
  ],
  "next": null,
  "previous": null,
  "start": 0,
  "total": 3,
  "query": {
    "match_all_query": {}
  }
}
```

--------------------------------------------------------------------------------
/docs/TopLevel/Int8Array.md:
--------------------------------------------------------------------------------

```markdown
## Package: TopLevel

# Class Int8Array

## Inheritance Hierarchy

- Object
  - Int8Array

## Description

An optimized array to store 8-bit signed integer numbers. Elements of this array are stored in an ArrayBuffer object.

## Constants

### BYTES_PER_ELEMENT

**Type:** Number = 1

Number value of the element size.

## Properties

### buffer

**Type:** ArrayBuffer

The array buffer referenced by this typed array.

### byteLength

**Type:** Number

The number of bytes in the array buffer used by this typed array.

### byteOffset

**Type:** Number

The start offset for this typed array within the array buffer.

### length

**Type:** Number

The number of elements.

## Constructor Summary

Int8Array() Creates an empty array.

Int8Array(length : Number) Creates an array with the given element count.

Int8Array(typedArray : Object) Creates an array as a copy of the passed typed array.

Int8Array(array : Array) Creates an array as a copy of the passed array.

Int8Array(buffer : ArrayBuffer, byteOffset : Number, length : Number) Creates a typed array as a view on the given ArrayBuffer.

## Method Summary

### get

**Signature:** `get(index : Number) : Number`

Returns the value at the specified index.

### set

**Signature:** `set(values : Object, offset : Number) : void`

Copies all values from the source array into this typed array.

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Int8Array`

Returns a new array object based on the same ArrayBuffer store.

## Constructor Detail

## Method Detail

## Method Details

### get

**Signature:** `get(index : Number) : Number`

**Description:** Returns the value at the specified index. Note: This is not ECMAScript standard. Use array element access syntax for single value access.

**Parameters:**

- `index`: The index to use.

**Returns:**

The value at the specified index.

---

### set

**Signature:** `set(values : Object, offset : Number) : void`

**Description:** Copies all values from the source array into this typed array.

**Parameters:**

- `values`: The source values. Can be an array or a typed array.
- `offset`: Optional. Target offset.

---

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Int8Array`

**Description:** Returns a new array object based on the same ArrayBuffer store.

**Parameters:**

- `begin`: Optional. The first included element.
- `end`: Optional. The index of the end. This element is not included.

**Returns:**

The new array object.

---
```

--------------------------------------------------------------------------------
/docs/dw_extensions.payments/SalesforcePaymentsSiteConfiguration.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.extensions.payments

# Class SalesforcePaymentsSiteConfiguration

## Inheritance Hierarchy

- Object
  - dw.extensions.payments.SalesforcePaymentsSiteConfiguration

## Description

Salesforce Payments representation of a payment site configuration object. See Salesforce Payments documentation for how to gain access and configure it for use on your sites. A payment site configuration contains information about the configuration of the site such as whether the site is activated with Express Checkout, Multi-Step Checkout or both.

## Properties

### cardCaptureAutomatic

**Type:** boolean (Read Only)

Returns true if the capture method is set to automatic for credit card Payment Intents created for this site, or
 false if the capture method is set to manual.

### expressCheckoutEnabled

**Type:** boolean (Read Only)

Returns true if Express Checkout is enabled for the site.

### multiStepCheckoutEnabled

**Type:** boolean (Read Only)

Returns true if Multi-Step Checkout is enabled for the site.

## Constructor Summary

## Method Summary

### isCardCaptureAutomatic

**Signature:** `isCardCaptureAutomatic() : boolean`

Returns true if the capture method is set to automatic for credit card Payment Intents created for this site, or false if the capture method is set to manual.

### isExpressCheckoutEnabled

**Signature:** `isExpressCheckoutEnabled() : boolean`

Returns true if Express Checkout is enabled for the site.

### isMultiStepCheckoutEnabled

**Signature:** `isMultiStepCheckoutEnabled() : boolean`

Returns true if Multi-Step Checkout is enabled for the site.

## Method Detail

## Method Details

### isCardCaptureAutomatic

**Signature:** `isCardCaptureAutomatic() : boolean`

**Description:** Returns true if the capture method is set to automatic for credit card Payment Intents created for this site, or false if the capture method is set to manual.

**Returns:**

true if the credit card capture method is automatic, or false if it is manual

---

### isExpressCheckoutEnabled

**Signature:** `isExpressCheckoutEnabled() : boolean`

**Description:** Returns true if Express Checkout is enabled for the site.

**Returns:**

true if Express Checkout is enabled for the site, or false if not

---

### isMultiStepCheckoutEnabled

**Signature:** `isMultiStepCheckoutEnabled() : boolean`

**Description:** Returns true if Multi-Step Checkout is enabled for the site.

**Returns:**

true if Multi-Step Checkout is enabled for the site, or false if not

---
```

--------------------------------------------------------------------------------
/docs-site/public/sitemap.xml:
--------------------------------------------------------------------------------

```
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
        http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">    
    <!-- SFCC Development MCP Server Homepage -->
    <url>
        <loc>https://sfcc-mcp-dev.rhino-inquisitor.com</loc>
        <lastmod>2025-09-20</lastmod>
        <changefreq>weekly</changefreq>
        <priority>1.0</priority>
    </url>    
    <!-- Configuration Guide -->
    <url>
        <loc>https://sfcc-mcp-dev.rhino-inquisitor.com/configuration/</loc>
        <lastmod>2025-09-20</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.9</priority>
    </url>    
    <!-- AI Interface Setup Guide -->
    <url>
        <loc>https://sfcc-mcp-dev.rhino-inquisitor.com/ai-interfaces/</loc>
        <lastmod>2025-09-20</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.8</priority>
    </url>    
    <!-- Features Overview -->
    <url>
        <loc>https://sfcc-mcp-dev.rhino-inquisitor.com/features/</loc>
        <lastmod>2025-09-20</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.8</priority>
    </url>    
    <!-- Available Tools -->
    <url>
        <loc>https://sfcc-mcp-dev.rhino-inquisitor.com/tools/</loc>
        <lastmod>2025-09-20</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.8</priority>
    </url>    
    <!-- Examples and Use Cases -->
    <url>
        <loc>https://sfcc-mcp-dev.rhino-inquisitor.com/examples/</loc>
        <lastmod>2025-09-20</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.8</priority>
    </url>    
    <!-- Security Guidelines -->
    <url>
        <loc>https://sfcc-mcp-dev.rhino-inquisitor.com/security/</loc>
        <lastmod>2025-09-20</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.7</priority>
    </url>    
    <!-- Development Guide -->
    <url>
        <loc>https://sfcc-mcp-dev.rhino-inquisitor.com/development/</loc>
        <lastmod>2025-09-20</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.6</priority>
    </url>    
    <!-- Troubleshooting Guide -->
    <url>
        <loc>https://sfcc-mcp-dev.rhino-inquisitor.com/troubleshooting/</loc>
        <lastmod>2025-09-20</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.7</priority>
    </url>
</urlset>
```

--------------------------------------------------------------------------------
/docs/TopLevel/Int16Array.md:
--------------------------------------------------------------------------------

```markdown
## Package: TopLevel

# Class Int16Array

## Inheritance Hierarchy

- Object
  - Int16Array

## Description

An optimized array to store 16-bit signed integer numbers. Elements of this array are stored in an ArrayBuffer object.

## Constants

### BYTES_PER_ELEMENT

**Type:** Number = 2

Number value of the element size.

## Properties

### buffer

**Type:** ArrayBuffer

The array buffer referenced by this typed array.

### byteLength

**Type:** Number

The number of bytes in the array buffer used by this typed array.

### byteOffset

**Type:** Number

The start offset for this typed array within the array buffer.

### length

**Type:** Number

The number of elements.

## Constructor Summary

Int16Array() Creates an empty array.

Int16Array(length : Number) Creates an array with the given element count.

Int16Array(typedArray : Object) Creates an array as a copy of the passed typed array.

Int16Array(array : Array) Creates an array as a copy of the passed array.

Int16Array(buffer : ArrayBuffer, byteOffset : Number, length : Number) Creates a typed array as a view on the given ArrayBuffer.

## Method Summary

### get

**Signature:** `get(index : Number) : Number`

Returns the value at the specified index.

### set

**Signature:** `set(values : Object, offset : Number) : void`

Copies all values from the source array into this typed array.

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Int16Array`

Returns a new array object based on the same ArrayBuffer store.

## Constructor Detail

## Method Detail

## Method Details

### get

**Signature:** `get(index : Number) : Number`

**Description:** Returns the value at the specified index. Note: This is not ECMAScript standard. Use array element access syntax for single value access.

**Parameters:**

- `index`: The index to use.

**Returns:**

The value at the specified index.

---

### set

**Signature:** `set(values : Object, offset : Number) : void`

**Description:** Copies all values from the source array into this typed array.

**Parameters:**

- `values`: The source values. Can be an array or a typed array.
- `offset`: Optional. Target offset.

---

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Int16Array`

**Description:** Returns a new array object based on the same ArrayBuffer store.

**Parameters:**

- `begin`: Optional. The first included element.
- `end`: Optional. The index of the end. This element is not included.

**Returns:**

The new array object.

---
```

--------------------------------------------------------------------------------
/docs/TopLevel/Int32Array.md:
--------------------------------------------------------------------------------

```markdown
## Package: TopLevel

# Class Int32Array

## Inheritance Hierarchy

- Object
  - Int32Array

## Description

An optimized array to store 32-bit signed integer numbers. Elements of this array are stored in an ArrayBuffer object.

## Constants

### BYTES_PER_ELEMENT

**Type:** Number = 4

Number value of the element size.

## Properties

### buffer

**Type:** ArrayBuffer

The array buffer referenced by this typed array.

### byteLength

**Type:** Number

The number of bytes in the array buffer used by this typed array.

### byteOffset

**Type:** Number

The start offset for this typed array within the array buffer.

### length

**Type:** Number

The number of elements.

## Constructor Summary

Int32Array() Creates an empty array.

Int32Array(length : Number) Creates an array with the given element count.

Int32Array(typedArray : Object) Creates an array as a copy of the passed typed array.

Int32Array(array : Array) Creates an array as a copy of the passed array.

Int32Array(buffer : ArrayBuffer, byteOffset : Number, length : Number) Creates a typed array as a view on the given ArrayBuffer.

## Method Summary

### get

**Signature:** `get(index : Number) : Number`

Returns the value at the specified index.

### set

**Signature:** `set(values : Object, offset : Number) : void`

Copies all values from the source array into this typed array.

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Int32Array`

Returns a new array object based on the same ArrayBuffer store.

## Constructor Detail

## Method Detail

## Method Details

### get

**Signature:** `get(index : Number) : Number`

**Description:** Returns the value at the specified index. Note: This is not ECMAScript standard. Use array element access syntax for single value access.

**Parameters:**

- `index`: The index to use.

**Returns:**

The value at the specified index.

---

### set

**Signature:** `set(values : Object, offset : Number) : void`

**Description:** Copies all values from the source array into this typed array.

**Parameters:**

- `values`: The source values. Can be an array or a typed array.
- `offset`: Optional. Target offset.

---

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Int32Array`

**Description:** Returns a new array object based on the same ArrayBuffer store.

**Parameters:**

- `begin`: Optional. The first included element.
- `end`: Optional. The index of the end. This element is not included.

**Returns:**

The new array object.

---
```

--------------------------------------------------------------------------------
/docs/TopLevel/Uint8Array.md:
--------------------------------------------------------------------------------

```markdown
## Package: TopLevel

# Class Uint8Array

## Inheritance Hierarchy

- Object
  - Uint8Array

## Description

An optimized array to store 8-bit unsigned integer numbers. Elements of this array are stored in an ArrayBuffer object.

## Constants

### BYTES_PER_ELEMENT

**Type:** Number = 1

Number value of the element size.

## Properties

### buffer

**Type:** ArrayBuffer

The array buffer referenced by this typed array.

### byteLength

**Type:** Number

The number of bytes in the array buffer used by this typed array.

### byteOffset

**Type:** Number

The start offset for this typed array within the array buffer.

### length

**Type:** Number

The number of elements.

## Constructor Summary

Uint8Array() Creates an empty array.

Uint8Array(length : Number) Creates an array with the given element count.

Uint8Array(typedArray : Object) Creates an array as a copy of the passed typed array.

Uint8Array(array : Array) Creates an array as a copy of the passed array.

Uint8Array(buffer : ArrayBuffer, byteOffset : Number, length : Number) Creates a typed array as a view on the given ArrayBuffer.

## Method Summary

### get

**Signature:** `get(index : Number) : Number`

Returns the value at the specified index.

### set

**Signature:** `set(values : Object, offset : Number) : void`

Copies all values from the source array into this typed array.

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Uint8Array`

Returns a new array object based on the same ArrayBuffer store.

## Constructor Detail

## Method Detail

## Method Details

### get

**Signature:** `get(index : Number) : Number`

**Description:** Returns the value at the specified index. Note: This is not ECMAScript standard. Use array element access syntax for single value access.

**Parameters:**

- `index`: The index to use.

**Returns:**

The value at the specified index.

---

### set

**Signature:** `set(values : Object, offset : Number) : void`

**Description:** Copies all values from the source array into this typed array.

**Parameters:**

- `values`: The source values. Can be an array or a typed array.
- `offset`: Optional. Target offset.

---

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Uint8Array`

**Description:** Returns a new array object based on the same ArrayBuffer store.

**Parameters:**

- `begin`: Optional. The first included element.
- `end`: Optional. The index of the end. This element is not included.

**Returns:**

The new array object.

---
```

--------------------------------------------------------------------------------
/docs/TopLevel/Uint32Array.md:
--------------------------------------------------------------------------------

```markdown
## Package: TopLevel

# Class Uint32Array

## Inheritance Hierarchy

- Object
  - Uint32Array

## Description

An optimized array to store 32-bit unsigned integer numbers. Elements of this array are stored in an ArrayBuffer object.

## Constants

### BYTES_PER_ELEMENT

**Type:** Number = 4

Number value of the element size.

## Properties

### buffer

**Type:** ArrayBuffer

The array buffer referenced by this typed array.

### byteLength

**Type:** Number

The number of bytes in the array buffer used by this typed array.

### byteOffset

**Type:** Number

The start offset for this typed array within the array buffer.

### length

**Type:** Number

The number of elements.

## Constructor Summary

Uint32Array() Creates an empty array.

Uint32Array(length : Number) Creates an array with the given element count.

Uint32Array(typedArray : Object) Creates an array as a copy of the passed typed array.

Uint32Array(array : Array) Creates an array as a copy of the passed array.

Uint32Array(buffer : ArrayBuffer, byteOffset : Number, length : Number) Creates a typed array as a view on the given ArrayBuffer.

## Method Summary

### get

**Signature:** `get(index : Number) : Number`

Returns the value at the specified index.

### set

**Signature:** `set(values : Object, offset : Number) : void`

Copies all values from the source array into this typed array.

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Uint32Array`

Returns a new array object based on the same ArrayBuffer store.

## Constructor Detail

## Method Detail

## Method Details

### get

**Signature:** `get(index : Number) : Number`

**Description:** Returns the value at the specified index. Note: This is not ECMAScript standard. Use array element access syntax for single value access.

**Parameters:**

- `index`: The index to use.

**Returns:**

The value at the specified index.

---

### set

**Signature:** `set(values : Object, offset : Number) : void`

**Description:** Copies all values from the source array into this typed array.

**Parameters:**

- `values`: The source values. Can be an array or a typed array.
- `offset`: Optional. Target offset.

---

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Uint32Array`

**Description:** Returns a new array object based on the same ArrayBuffer store.

**Parameters:**

- `begin`: Optional. The first included element.
- `end`: Optional. The index of the end. This element is not included.

**Returns:**

The new array object.

---
```

--------------------------------------------------------------------------------
/docs/TopLevel/Uint16Array.md:
--------------------------------------------------------------------------------

```markdown
## Package: TopLevel

# Class Uint16Array

## Inheritance Hierarchy

- Object
  - Uint16Array

## Description

An optimized array to store 16-bit unsigned integer numbers. Elements of this array are stored in an ArrayBuffer object.

## Constants

### BYTES_PER_ELEMENT

**Type:** Number = 2

The number value of the element size.

## Properties

### buffer

**Type:** ArrayBuffer

The array buffer referenced by this typed array.

### byteLength

**Type:** Number

The number of bytes in the array buffer used by this typed array.

### byteOffset

**Type:** Number

The start offset for this typed array within the array buffer.

### length

**Type:** Number

The number of elements.

## Constructor Summary

Uint16Array() Creates an empty array.

Uint16Array(length : Number) Creates an array with the given element count.

Uint16Array(typedArray : Object) Creates an array as a copy of the passed typed array.

Uint16Array(array : Array) Creates an array as a copy of the passed array.

Uint16Array(buffer : ArrayBuffer, byteOffset : Number, length : Number) Creates a typed array as a view on the given ArrayBuffer.

## Method Summary

### get

**Signature:** `get(index : Number) : Number`

Returns the value at the specified index.

### set

**Signature:** `set(values : Object, offset : Number) : void`

Copies all values from the source array into this typed array.

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Uint16Array`

Returns a new array object based on the same ArrayBuffer store.

## Constructor Detail

## Method Detail

## Method Details

### get

**Signature:** `get(index : Number) : Number`

**Description:** Returns the value at the specified index. Note: This is not ECMAScript standard. Use array element access syntax for single value access.

**Parameters:**

- `index`: The index to use.

**Returns:**

The value at the specified index.

---

### set

**Signature:** `set(values : Object, offset : Number) : void`

**Description:** Copies all values from the source array into this typed array.

**Parameters:**

- `values`: The source values. Can be an array or a typed array.
- `offset`: Optional. Target offset.

---

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Uint16Array`

**Description:** Returns a new array object based on the same ArrayBuffer store.

**Parameters:**

- `begin`: Optional. The first included element.
- `end`: Optional. The index of the end. This element is not included.

**Returns:**

The new array object.

---
```

--------------------------------------------------------------------------------
/docs/TopLevel/Float32Array.md:
--------------------------------------------------------------------------------

```markdown
## Package: TopLevel

# Class Float32Array

## Inheritance Hierarchy

- Object
  - Float32Array

## Description

An optimized array to store 32-bit floating point numbers. Elements of this array are stored in an ArrayBuffer object.

## Constants

### BYTES_PER_ELEMENT

**Type:** Number = 4

Number value of the element size.

## Properties

### buffer

**Type:** ArrayBuffer

The array buffer referenced by this typed array.

### byteLength

**Type:** Number

The number of bytes in the array buffer used by this typed array.

### byteOffset

**Type:** Number

The start offset for this typed array within the array buffer.

### length

**Type:** Number

The number of elements.

## Constructor Summary

Float32Array() Creates an empty array.

Float32Array(length : Number) Creates an array with the given element count.

Float32Array(typedArray : Object) Creates an array as a copy of the passed typed array.

Float32Array(array : Array) Creates an array as a copy of the passed array.

Float32Array(buffer : ArrayBuffer, byteOffset : Number, length : Number) Creates a typed array as a view on the given ArrayBuffer.

## Method Summary

### get

**Signature:** `get(index : Number) : Number`

Returns the value at the specified index.

### set

**Signature:** `set(values : Object, offset : Number) : void`

Copies all values from the source array into this typed array.

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Float32Array`

Returns a new array object based on the same ArrayBuffer store.

## Constructor Detail

## Method Detail

## Method Details

### get

**Signature:** `get(index : Number) : Number`

**Description:** Returns the value at the specified index. Note: This is not ECMAScript standard. Use array element access syntax for single value access.

**Parameters:**

- `index`: The index to use.

**Returns:**

The value at the specified index.

---

### set

**Signature:** `set(values : Object, offset : Number) : void`

**Description:** Copies all values from the source array into this typed array.

**Parameters:**

- `values`: The source values. Can be an array or a typed array.
- `offset`: Optional. Target offset.

---

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Float32Array`

**Description:** Returns a new array object based on the same ArrayBuffer store.

**Parameters:**

- `begin`: Optional. The first included element.
- `end`: Optional. The index of the end. This element is not included.

**Returns:**

The new array object.

---
```

--------------------------------------------------------------------------------
/docs/TopLevel/Float64Array.md:
--------------------------------------------------------------------------------

```markdown
## Package: TopLevel

# Class Float64Array

## Inheritance Hierarchy

- Object
  - Float64Array

## Description

An optimized array to store 64-bit floating point numbers. Elements of this array are stored in an ArrayBuffer object.

## Constants

### BYTES_PER_ELEMENT

**Type:** Number = 8

Number value of the element size.

## Properties

### buffer

**Type:** ArrayBuffer

The array buffer referenced by this typed array.

### byteLength

**Type:** Number

The number of bytes in the array buffer used by this typed array.

### byteOffset

**Type:** Number

The start offset for this typed array within the array buffer.

### length

**Type:** Number

The number of elements.

## Constructor Summary

Float64Array() Creates an empty array.

Float64Array(length : Number) Creates an array with the given element count.

Float64Array(typedArray : Object) Creates an array as a copy of the passed typed array.

Float64Array(array : Array) Creates an array as a copy of the passed array.

Float64Array(buffer : ArrayBuffer, byteOffset : Number, length : Number) Creates a typed array as a view on the given ArrayBuffer.

## Method Summary

### get

**Signature:** `get(index : Number) : Number`

Returns the value at the specified index.

### set

**Signature:** `set(values : Object, offset : Number) : void`

Copies all values from the source array into this typed array.

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Float64Array`

Returns a new array object based on the same ArrayBuffer store.

## Constructor Detail

## Method Detail

## Method Details

### get

**Signature:** `get(index : Number) : Number`

**Description:** Returns the value at the specified index. Note: This is not ECMAScript standard. Use array element access syntax for single value access.

**Parameters:**

- `index`: The index to use.

**Returns:**

The value at the specified index.

---

### set

**Signature:** `set(values : Object, offset : Number) : void`

**Description:** Copies all values from the source array into this typed array.

**Parameters:**

- `values`: The source values. Can be an array or a typed array.
- `offset`: Optional. Target offset.

---

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Float64Array`

**Description:** Returns a new array object based on the same ArrayBuffer store.

**Parameters:**

- `begin`: Optional. The first included element.
- `end`: Optional. The index of the end. This element is not included.

**Returns:**

The new array object.

---
```

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

```markdown
## Package: dw.catalog

# Class StoreInventoryFilter

## Inheritance Hierarchy

- Object
  - dw.catalog.StoreInventoryFilter

## Description

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" ) ) );

## Properties

### semanticURLParameter

**Type:** String (Read Only)

The semantic URL parameter of this StoreInventoryFilter.

### storeInventoryFilterValues

**Type:** List (Read Only)

A list of StoreInventoryFilterValue instances used by this StoreInventoryFilter.

## Constructor Summary

StoreInventoryFilter(semanticURLParameter : String, storeFilterValues : List) Creates a new StoreInventoryFilter instance for the given semantic URL parameter and a list of StoreInventoryFilterValue instances.

## Method Summary

### getSemanticURLParameter

**Signature:** `getSemanticURLParameter() : String`

Returns the semantic URL parameter of this StoreInventoryFilter.

### getStoreInventoryFilterValues

**Signature:** `getStoreInventoryFilterValues() : List`

Returns a list of StoreInventoryFilterValue instances used by this StoreInventoryFilter.

## Constructor Detail

## Method Detail

## Method Details

### getSemanticURLParameter

**Signature:** `getSemanticURLParameter() : String`

**Description:** Returns the semantic URL parameter of this StoreInventoryFilter.

**Returns:**

the semantic URL parameter of this StoreInventoryFilter.

---

### getStoreInventoryFilterValues

**Signature:** `getStoreInventoryFilterValues() : List`

**Description:** Returns a list of StoreInventoryFilterValue instances used by this StoreInventoryFilter.

**Returns:**

a list of StoreInventoryFilterValue instances used by this StoreInventoryFilter.

---
```

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

```markdown
# SFRA Range Price Model

## Overview

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.

## Constructor

```javascript
function RangePrice(min, max)
```

Creates a Range Price model instance with minimum and maximum pricing.

### Parameters

- `min` (dw.value.Money) - Range minimum price
- `max` (dw.value.Money) - Range maximum price

## Properties

### type
**Type:** string

Always set to 'range' to identify this as a range price model.

### min
**Type:** DefaultPrice

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.

### max
**Type:** DefaultPrice

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.

## Usage Example

```javascript
var RangePrice = require('*/cartridge/models/price/range');

// For a product bundle with varying prices
var minPrice = new Money(19.99, 'USD');
var maxPrice = new Money(49.99, 'USD');

var rangePrice = new RangePrice(minPrice, maxPrice);

console.log(rangePrice.type);              // "range"
console.log(rangePrice.min.sales.formatted);     // "$19.99"
console.log(rangePrice.max.sales.formatted);     // "$49.99"

// Display price range
console.log(rangePrice.min.sales.formatted + ' - ' + rangePrice.max.sales.formatted);
// Output: "$19.99 - $49.99"
```

## Use Cases

Range prices are commonly used for:
- **Product Bundles** - When bundle contents affect total price
- **Product Sets** - Collections with varying individual prices
- **Variable Products** - Products with options that affect pricing
- **Category Displays** - Showing price ranges for product collections

## Notes

- Both min and max are DefaultPrice models created with only the sales price (no list price)
- Min and max prices are accessed via `.sales` property (e.g., `rangePrice.min.sales.formatted`)
- Type property helps identify this as a range price in templates
- Useful for displaying "from X to Y" pricing
- Maintains currency and formatting consistency through DefaultPrice

## Related Models

- **DefaultPrice Model** - Used for min and max price formatting
- **TieredPrice Model** - Alternative pricing model for quantity discounts
- **Product Models** - May use range prices for variable products

```

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

```markdown
## Package: TopLevel

# Class QName

## Inheritance Hierarchy

- Object
  - QName

## Description

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.

## Properties

### localName

**Type:** String (Read Only)

The local name of the QName object.

### uri

**Type:** String (Read Only)

The Uniform Resource Identifier (URI) of the QName object.

## Constructor Summary

QName() Constructs a QName object where localName is set to an empty String.

QName(qname : QName) Constructs a QName object that is a copy of the specified qname.

QName(uri : Namespace, localName : QName) Creates a QName object with a uri from a Namespace object and a localName from a QName object.

## Method Summary

### getLocalName

**Signature:** `getLocalName() : String`

Returns the local name of the QName object.

### getUri

**Signature:** `getUri() : String`

Returns the Uniform Resource Identifier (URI) of the QName object.

### toString

**Signature:** `toString() : String`

Returns a string composed of the URI, and the local name for the QName object, separated by "::".

## Constructor Detail

## Method Detail

## Method Details

### getLocalName

**Signature:** `getLocalName() : String`

**Description:** Returns the local name of the QName object.

**Returns:**

the local name of the QName object.

---

### getUri

**Signature:** `getUri() : String`

**Description:** Returns the Uniform Resource Identifier (URI) of the QName object.

**Returns:**

the Uniform Resource Identifier (URI) of the QName object.

---

### toString

**Signature:** `toString() : String`

**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

**Returns:**

a string composed of the URI, and the local name for the QName object, separated by "::".

---
```

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

```markdown
## Package: dw.customer

# Class ProductListItemPurchase

## Inheritance Hierarchy

- Object
  - dw.object.PersistentObject
  - dw.object.ExtensibleObject
    - dw.customer.ProductListItemPurchase

## Description

A record of the purchase of an item contained in a product list.

## Properties

### item

**Type:** ProductListItem (Read Only)

The item that was purchased.

### orderNo

**Type:** String (Read Only)

The number of the order in which the
 product list item was purchased.

### purchaseDate

**Type:** Date (Read Only)

The date on which the product list item was purchased.

### purchaserName

**Type:** String (Read Only)

The name of the purchaser of the product list item.

### quantity

**Type:** Quantity (Read Only)

The quantity of the product list item that was purchased.

## Constructor Summary

## Method Summary

### getItem

**Signature:** `getItem() : ProductListItem`

Returns the item that was purchased.

### getOrderNo

**Signature:** `getOrderNo() : String`

Returns the number of the order in which the product list item was purchased.

### getPurchaseDate

**Signature:** `getPurchaseDate() : Date`

Returns the date on which the product list item was purchased.

### getPurchaserName

**Signature:** `getPurchaserName() : String`

Returns the name of the purchaser of the product list item.

### getQuantity

**Signature:** `getQuantity() : Quantity`

Returns the quantity of the product list item that was purchased.

## Method Detail

## Method Details

### getItem

**Signature:** `getItem() : ProductListItem`

**Description:** Returns the item that was purchased.

**Returns:**

the item that was purchased.

---

### getOrderNo

**Signature:** `getOrderNo() : String`

**Description:** Returns the number of the order in which the product list item was purchased.

**Returns:**

the number of the order in which the product list item was purchased.

---

### getPurchaseDate

**Signature:** `getPurchaseDate() : Date`

**Description:** Returns the date on which the product list item was purchased.

**Returns:**

the date on which the product list item was purchased.

---

### getPurchaserName

**Signature:** `getPurchaserName() : String`

**Description:** Returns the name of the purchaser of the product list item.

**Returns:**

the name of the purchaser of the product list item.

---

### getQuantity

**Signature:** `getQuantity() : Quantity`

**Description:** Returns the quantity of the product list item that was purchased.

**Returns:**

the quantity of the product list item that was purchased.

---
```

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

```typescript
import React from 'react';
import { SITE_DATES } from '../constants';

interface StructuredDataProps {
  structuredData?: object;
}

const StructuredData: React.FC<StructuredDataProps> = ({ structuredData }) => {
  const combinedData = [
    // Global Software Application Schema
    {
      "@context": "https://schema.org",
      "@type": "SoftwareApplication",
      "name": "SFCC Development MCP Server",
      "applicationCategory": "DeveloperApplication",
      "applicationSubCategory": "Development Tools",
      "operatingSystem": "Node.js",
      "description": "A Model Context Protocol server for Salesforce B2C Commerce Cloud development with AI-powered documentation access, log analysis, and development best practices.",
      "url": "https://sfcc-mcp-dev.rhino-inquisitor.com/",
      "downloadUrl": "https://www.npmjs.com/package/sfcc-dev-mcp",
      "installUrl": "https://sfcc-mcp-dev.rhino-inquisitor.com/configuration/",
      "softwareVersion": "1.0.0",
      "datePublished": SITE_DATES.PUBLISHED,
      "dateModified": SITE_DATES.MODIFIED,
      "author": {
        "@type": "Person",
        "name": "Thomas Theunen",
        "url": "https://github.com/taurgis"
      },
      "publisher": {
        "@type": "Person",
        "name": "Thomas Theunen"
      },
      "programmingLanguage": ["JavaScript", "TypeScript"],
      "runtimePlatform": "Node.js",
      "keywords": "SFCC, Salesforce Commerce Cloud, Model Context Protocol, MCP server, AI development tools, SFCC documentation, Commerce Cloud development",
      "requirements": "Node.js 18+, npm",
      "featureList": [
        "SFCC API Documentation Access",
        "Real-time Log Analysis", 
        "System Object Exploration",
        "Cartridge Generation",
        "Best Practices Guides",
        "AI Assistant Integration"
      ],
      "screenshot": "https://sfcc-mcp-dev.rhino-inquisitor.com/explain-product-pricing-methods.png",
      "offers": {
        "@type": "Offer",
        "price": "0",
        "priceCurrency": "USD",
        "availability": "https://schema.org/InStock"
      },
      "license": "https://opensource.org/licenses/MIT",
      "codeRepository": "https://github.com/taurgis/sfcc-dev-mcp",
      "maintainer": {
        "@type": "Person", 
        "name": "Thomas Theunen"
      }
    },
    // Page-specific structured data (if provided)
    ...(structuredData ? [structuredData] : [])
  ];

  return (
    <script 
      type="application/ld+json" 
      dangerouslySetInnerHTML={{ __html: JSON.stringify(combinedData) }} 
    />
  );
};

export default StructuredData;
```

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

```markdown
## Package: dw.crypto

# Class JWSHeader

## Inheritance Hierarchy

- Object
  - dw.crypto.JWSHeader

## Description

This class represents an immutable header of a JWS (JSON Web Signature) object.

## Properties

### algorithm

**Type:** String (Read Only)

Get the value of the algorithm parameter (alg).

## Constructor Summary

## Method Summary

### getAlgorithm

**Signature:** `getAlgorithm() : String`

Get the value of the algorithm parameter (alg).

### parse

**Signature:** `static parse(map : Object) : JWSHeader`

Convert the given Map or JavaScript object into a JWS header.

### parseEncoded

**Signature:** `static parseEncoded(base64encoded : String) : JWSHeader`

Parse the given string as a Base64URL-encoded JWS header.

### parseJSON

**Signature:** `static parseJSON(json : String) : JWSHeader`

Parse the given string as a JWS header.

### toMap

**Signature:** `toMap() : Map`

Get a copy of these headers as a Map.

### toString

**Signature:** `toString() : String`

Get the content of the headers as a JSON String.

## Method Detail

## Method Details

### getAlgorithm

**Signature:** `getAlgorithm() : String`

**Description:** Get the value of the algorithm parameter (alg).

**Returns:**

Algorithm parameter from this header.

---

### parse

**Signature:** `static parse(map : Object) : JWSHeader`

**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.

**Parameters:**

- `map`: Map or object data to convert.

**Returns:**

JWS Header.

---

### parseEncoded

**Signature:** `static parseEncoded(base64encoded : String) : JWSHeader`

**Description:** Parse the given string as a Base64URL-encoded JWS header. The algorithm parameter (alg) is required. See JWS.verify(CertificateRef) for supported values.

**Parameters:**

- `base64encoded`: Base64URL string to parse.

**Returns:**

JWS Header.

---

### parseJSON

**Signature:** `static parseJSON(json : String) : JWSHeader`

**Description:** Parse the given string as a JWS header. The algorithm parameter (alg) is required. See JWS.verify(CertificateRef) for supported values.

**Parameters:**

- `json`: JSON string to parse.

**Returns:**

JWS Header.

---

### toMap

**Signature:** `toMap() : Map`

**Description:** Get a copy of these headers as a Map.

**Returns:**

Copy of the JWS headers.

---

### toString

**Signature:** `toString() : String`

**Description:** Get the content of the headers as a JSON String.

**Returns:**

JSON String.

---
```

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

```markdown
## Package: dw.svc

# Class ServiceCredential

## Inheritance Hierarchy

- Object
  - dw.object.PersistentObject
  - dw.object.ExtensibleObject
    - dw.customer.EncryptedObject
      - dw.svc.ServiceCredential

## Description

Configuration object for Service Credentials.

## Constants

### ENCRYPTION_ALGORITHM_RSA

**Type:** String = "RSA"

Constant for specification of the public key encryption algorithm RSA.

## Properties

### ID

**Type:** String (Read Only)

The unique Credential ID.

### password

**Type:** String (Read Only)

The Password in plain text.

### URL

**Type:** String (Read Only)

Return the URL.

### user

**Type:** String (Read Only)

The User ID.

## Constructor Summary

## Method Summary

### getEncryptedPassword

**Signature:** `getEncryptedPassword(algorithm : String, publicKey : CertificateRef) : String`

Encrypts the password from this object with the given algorithm and the public key taken from a certificate in the keystore.

### getID

**Signature:** `getID() : String`

Returns the unique Credential ID.

### getPassword

**Signature:** `getPassword() : String`

Returns the Password in plain text.

### getURL

**Signature:** `getURL() : String`

Return the URL.

### getUser

**Signature:** `getUser() : String`

Returns the User ID.

## Method Detail

## Method Details

### getEncryptedPassword

**Signature:** `getEncryptedPassword(algorithm : String, publicKey : CertificateRef) : String`

**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.

**Deprecated:**

Use Cipher to encrypt data as needed.

**Parameters:**

- `algorithm`: The algorithm to be used for the encryption of this password. Currently only "RSA" is supported.
- `publicKey`: A reference to a trusted certificate entry containing the public key in the keystore.

**Returns:**

the base64-encoded representation of the password.

---

### getID

**Signature:** `getID() : String`

**Description:** Returns the unique Credential ID.

**Returns:**

unique Credential ID.

---

### getPassword

**Signature:** `getPassword() : String`

**Description:** Returns the Password in plain text.

**Returns:**

Password.

---

### getURL

**Signature:** `getURL() : String`

**Description:** Return the URL.

**Returns:**

URL.

---

### getUser

**Signature:** `getUser() : String`

**Description:** Returns the User ID.

**Returns:**

User ID.

---
```

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

```yaml
---
description: "Test list_log_files tool in full mode - Optimized for aegis framework testing"
tests:
  # Core MCP protocol validation
  - it: "should return valid MCP response with log file metadata"
    request:
      jsonrpc: "2.0"
      id: "list-files-basic"
      method: "tools/call"
      params:
        name: "list_log_files"
        arguments: {}
    expect:
      response:
        jsonrpc: "2.0"
        id: "list-files-basic"
        result:
          content:
            match:arrayElements:
              match:partial:
                type: "text"
                text: "match:contains:Available log files"
          isError: false
      stderr: "toBeEmpty"
    performance:
      maxResponseTime: "2000ms"

  # SFCC log pattern validation (combined test for all log levels)
  - it: "should include all SFCC log levels with correct naming patterns"
    request:
      jsonrpc: "2.0"
      id: "list-files-patterns"
      method: "tools/call"
      params:
        name: "list_log_files"
        arguments: {}
    expect:
      response:
        jsonrpc: "2.0"
        id: "list-files-patterns"
        result:
          content:
            match:arrayElements:
              match:partial:
                text: "match:regex:(debug|error|info|warn)-blade-[\\d]{8}-[\\d]{6}\\.log"
          isError: false
      stderr: "toBeEmpty"

  # Comprehensive metadata validation (combined size and timestamp test)
  - it: "should include complete file metadata with proper formatting"
    request:
      jsonrpc: "2.0"
      id: "list-files-metadata"
      method: "tools/call"
      params:
        name: "list_log_files"
        arguments: {}
    expect:
      response:
        jsonrpc: "2.0"
        id: "list-files-metadata"
        result:
          content:
            match:arrayElements:
              match:partial:
                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"
          isError: false
      stderr: "toBeEmpty"

  # Parameter handling (simple edge case for aegis testing)
  - it: "should handle empty arguments gracefully"
    request:
      jsonrpc: "2.0"
      id: "list-files-empty-args"
      method: "tools/call"
      params:
        name: "list_log_files"
        arguments: {}
    expect:
      response:
        jsonrpc: "2.0"
        id: "list-files-empty-args"
        result:
          content:
            match:arrayElements:
              type: "text"
              text: "match:type:string"
          isError: false
      stderr: "toBeEmpty"

```

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

```markdown
## Package: dw.catalog

# Class SearchRefinementDefinition

## Inheritance Hierarchy

- Object
  - dw.object.PersistentObject
  - dw.object.ExtensibleObject
    - dw.catalog.SearchRefinementDefinition

## Description

Common search refinement definition base class.

## Properties

### attributeID

**Type:** String (Read Only)

The attribute ID. If the refinement definition is not an
 attribute refinement, the method returns an empty string.

### attributeRefinement

**Type:** boolean (Read Only)

Identifies if this is an attribute refinement.

### cutoffThreshold

**Type:** Number (Read Only)

The cut-off threshold.

### displayName

**Type:** String (Read Only)

The display name.

### valueTypeCode

**Type:** Number (Read Only)

A code for the data type used for this search refinement definition. See constants
 defined in ObjectAttributeDefinition.

## Constructor Summary

## Method Summary

### getAttributeID

**Signature:** `getAttributeID() : String`

Returns the attribute ID.

### getCutoffThreshold

**Signature:** `getCutoffThreshold() : Number`

Returns the cut-off threshold.

### getDisplayName

**Signature:** `getDisplayName() : String`

Returns the display name.

### getValueTypeCode

**Signature:** `getValueTypeCode() : Number`

Returns a code for the data type used for this search refinement definition.

### isAttributeRefinement

**Signature:** `isAttributeRefinement() : boolean`

Identifies if this is an attribute refinement.

## Method Detail

## Method Details

### getAttributeID

**Signature:** `getAttributeID() : String`

**Description:** Returns the attribute ID. If the refinement definition is not an attribute refinement, the method returns an empty string.

**Returns:**

the attribute ID.

---

### getCutoffThreshold

**Signature:** `getCutoffThreshold() : Number`

**Description:** Returns the cut-off threshold.

**Returns:**

the cut-off threshold.

---

### getDisplayName

**Signature:** `getDisplayName() : String`

**Description:** Returns the display name.

**Returns:**

the display name.

---

### getValueTypeCode

**Signature:** `getValueTypeCode() : Number`

**Description:** Returns a code for the data type used for this search refinement definition. See constants defined in ObjectAttributeDefinition.

**Returns:**

a code for the data type used for this search refinement definition. See constants defined in ObjectAttributeDefinition.

---

### isAttributeRefinement

**Signature:** `isAttributeRefinement() : boolean`

**Description:** Identifies if this is an attribute refinement.

**Returns:**

true if this is an attribute refinement, false otherwise.

---
```

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

```markdown
## Package: dw.suggest

# Class SearchPhraseSuggestions

## Inheritance Hierarchy

- Object
  - dw.suggest.SearchPhraseSuggestions

## Description

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.

## Properties

### suggestedPhrases

**Type:** Iterator (Read Only)

A list of SuggestedPhrase objects that relates to the
 user input search phrase.

### suggestedTerms

**Type:** Iterator (Read Only)

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.

## Constructor Summary

## Method Summary

### getSuggestedPhrases

**Signature:** `getSuggestedPhrases() : Iterator`

Returns a list of SuggestedPhrase objects that relates to the user input search phrase.

### getSuggestedTerms

**Signature:** `getSuggestedTerms() : Iterator`

Returns a list of SuggestedTerms objects.

### hasSuggestedPhrases

**Signature:** `hasSuggestedPhrases() : boolean`

Returns whether this suggestions container has any suggested phrases.

### hasSuggestedTerms

**Signature:** `hasSuggestedTerms() : boolean`

Returns whether this suggestions container has any suggested terms.

## Method Detail

## Method Details

### getSuggestedPhrases

**Signature:** `getSuggestedPhrases() : Iterator`

**Description:** Returns a list of SuggestedPhrase objects that relates to the user input search phrase.

**Returns:**

a list of SuggestedPhrases

**See Also:**

hasSuggestedPhrases()

---

### getSuggestedTerms

**Signature:** `getSuggestedTerms() : Iterator`

**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.

**Returns:**

a list of SuggestedTerms for each term of the user input search phrase

**See Also:**

hasSuggestedTerms()

---

### hasSuggestedPhrases

**Signature:** `hasSuggestedPhrases() : boolean`

**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.

**Returns:**

true only if there are phrases available

---

### hasSuggestedTerms

**Signature:** `hasSuggestedTerms() : boolean`

**Description:** Returns whether this suggestions container has any suggested terms. Note that this method checks suggested terms only, but not suggested phrases.

**Returns:**

true only if there are terms available

---
```

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

```html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    
    <!-- Search Engine Specific -->
    <meta name="googlebot" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" />
    
    <!-- Favicons -->
    <link rel="icon" type="image/x-icon" href="/favicon.ico" />
    <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
    <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
    <link rel="icon" type="image/png" sizes="192x192" href="/android-chrome-192x192.png" />
    <link rel="icon" type="image/png" sizes="512x512" href="/android-chrome-512x512.png" />
    
    <!-- Web App Manifest -->
    <link rel="manifest" href="/site.webmanifest" />
    
    <!-- Import Map - Must come before module scripts -->
    <script type="importmap">
{
  "imports": {
    "react/": "https://aistudiocdn.com/react@^19.1.1/",
    "react": "https://aistudiocdn.com/react@^19.1.1",
    "react-dom/": "https://aistudiocdn.com/react-dom@^19.1.1/",
    "react-router-dom": "https://aistudiocdn.com/react-router-dom@^7.8.2"
  }
}
</script>
    
    <link rel="preload" href="/main.tsx" as="script" crossorigin />
    <link rel="modulepreload" href="/main.tsx" />
    
    <!-- Critical CSS -->
    <style>
      body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; }
      .loading { display: flex; justify-content: center; align-items: center; height: 100vh; }
    </style>
    
    <!-- Additional SEO -->
    <meta name="theme-color" content="#2563eb" />
    <meta name="msapplication-TileColor" content="#2563eb" />
    <meta name="format-detection" content="telephone=no" />
    <meta name="color-scheme" content="light" />
    <meta name="mobile-web-app-capable" content="yes" />

</head>
  <body class="bg-white">
    <div id="root" role="application" aria-label="SFCC Development MCP Server Documentation"></div>
    <noscript>
      <div style="text-align: center; padding: 50px; font-family: system-ui;">
        <h1>JavaScript Required</h1>
        <p>This documentation site requires JavaScript to function properly. Please enable JavaScript in your browser and refresh the page.</p>
      </div>
    </noscript>
    <script type="module" src="/main.tsx"></script>
  </body>
</html>

```

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

```markdown
## Package: dw.extensions.pinterest

# Class PinterestFeedHooks

## Inheritance Hierarchy

- dw.extensions.pinterest.PinterestFeedHooks

## Description

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.

## Constants

## Properties

## Constructor Summary

## Method Summary

### transformAvailability

**Signature:** `transformAvailability(product : Product, pinterestAvailability : PinterestAvailability) : Status`

Called after default transformation of given Demandware product to Pinterest availability as part of the availability feed export.

### transformProduct

**Signature:** `transformProduct(product : Product, pinterestProduct : PinterestProduct) : Status`

Called after default transformation of given Demandware product to Pinterest product as part of the catalog feed export.

## Method Detail

## Method Details

### transformAvailability

**Signature:** `transformAvailability(product : Product, pinterestAvailability : PinterestAvailability) : Status`

**Description:** Called after default transformation of given Demandware product to Pinterest availability as part of the availability feed export.

**Parameters:**

- `product`: the Demandware product
- `pinterestAvailability`: the Pinterest representation of the product availability

**Returns:**

a non-null Status ends the hook execution

---

### transformProduct

**Signature:** `transformProduct(product : Product, pinterestProduct : PinterestProduct) : Status`

**Description:** Called after default transformation of given Demandware product to Pinterest product as part of the catalog feed export.

**Parameters:**

- `product`: the Demandware product
- `pinterestProduct`: the Pinterest representation of the product

**Returns:**

a non-null Status ends the hook execution

---
```

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

```markdown
## Package: TopLevel

# Class Uint8ClampedArray

## Inheritance Hierarchy

- Object
  - Uint8ClampedArray

## Description

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.

## Constants

### BYTES_PER_ELEMENT

**Type:** Number = 1

Number value of the element size.

## Properties

### buffer

**Type:** ArrayBuffer

The array buffer referenced by this typed array.

### byteLength

**Type:** Number

The number of bytes in the array buffer used by this typed array.

### byteOffset

**Type:** Number

The start offset for this typed array within the array buffer.

### length

**Type:** Number

The number of elements.

## Constructor Summary

Uint8ClampedArray() Creates an empty array.

Uint8ClampedArray(length : Number) Creates an array with the given element count.

Uint8ClampedArray(typedArray : Object) Creates an array as a copy of the passed typed array.

Uint8ClampedArray(array : Array) Creates an array as a copy of the passed array.

Uint8ClampedArray(buffer : ArrayBuffer, byteOffset : Number, length : Number) Creates a typed array as a view on the given ArrayBuffer.

## Method Summary

### get

**Signature:** `get(index : Number) : Number`

Returns the value at the specified index.

### set

**Signature:** `set(values : Object, offset : Number) : void`

Copies all values from the source array into this typed array.

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Uint8ClampedArray`

Returns a new array object based on the same ArrayBuffer store.

## Constructor Detail

## Method Detail

## Method Details

### get

**Signature:** `get(index : Number) : Number`

**Description:** Returns the value at the specified index. Note: This is not ECMAScript standard. Use array element access syntax for single value access.

**Parameters:**

- `index`: The index to use.

**Returns:**

The value at the specified index.

---

### set

**Signature:** `set(values : Object, offset : Number) : void`

**Description:** Copies all values from the source array into this typed array.

**Parameters:**

- `values`: The source values. Can be an array or a typed array.
- `offset`: Optional. Target offset.

---

### subarray

**Signature:** `subarray(begin : Number, end : Number) : Uint8ClampedArray`

**Description:** Returns a new array object based on the same ArrayBuffer store.

**Parameters:**

- `begin`: Optional. The first included element.
- `end`: Optional. The index of the end. This element is not included.

**Returns:**

The new array object.

---
```

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

```typescript
/**
 * WebDAV client setup and authentication management
 */

import { createClient } from 'webdav';
import type { WebDAVClient } from 'webdav';
import { Logger } from '../../utils/logger.js';
import type { WebDAVClientConfig } from './log-types.js';

export class WebDAVClientManager {
  private logger: Logger;
  private client: WebDAVClient | null = null;

  constructor(logger: Logger) {
    this.logger = logger;
  }

  /**
   * Setup and configure WebDAV client with authentication
   */
  setupClient(config: WebDAVClientConfig): WebDAVClient {
    let protocol = 'https';

    if (config.hostname.startsWith('localhost') || config.hostname.startsWith('127.0.0.1')) {
      protocol = 'http';
    }

    const webdavUrl = `${protocol}://${config.hostname}/on/demandware.servlet/webdav/Sites/Logs/`;
    this.logger.debug('Setting up WebDAV client:', { hostname: config.hostname, url: webdavUrl });

    const authConfig = this.buildAuthConfig(config);

    // Add timeout configuration for better CI compatibility
    const clientConfig = {
      ...authConfig,
      timeout: 30000, // 30 second timeout (generous for CI environments)
      maxBodyLength: 10 * 1024 * 1024, // 10MB max body length
      maxContentLength: 10 * 1024 * 1024, // 10MB max content length
    };

    this.client = createClient(webdavUrl, clientConfig);

    return this.client;
  }

  /**
   * Get the current WebDAV client instance
   */
  getClient(): WebDAVClient {
    if (!this.client) {
      throw new Error('WebDAV client not initialized. Call setupClient() first.');
    }
    return this.client;
  }

  /**
   * Build authentication configuration for WebDAV client
   */
  private buildAuthConfig(config: WebDAVClientConfig): any {
    if (config.username && config.password) {
      this.logger.debug('Using basic authentication');
      return {
        username: config.username,
        password: config.password,
      };
    }

    if (config.clientId && config.clientSecret) {
      this.logger.debug('Using OAuth authentication (client credentials as basic auth for WebDAV)');
      return {
        username: config.clientId,
        password: config.clientSecret,
      };
    }

    throw new Error('Either username/password or clientId/clientSecret must be provided');
  }

  /**
   * Test WebDAV connection
   */
  async testConnection(): Promise<boolean> {
    try {
      const client = this.getClient();
      await client.getDirectoryContents('/');
      this.logger.debug('WebDAV connection test successful');
      return true;
    } catch (error) {
      this.logger.error('WebDAV connection test failed:', error);
      return false;
    }
  }
}

```

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

```markdown
# SFRA Address Model

## Overview

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.

## Constructor

```javascript
function address(addressObject)
```

Creates an Address model instance from an address object.

### Parameters

- `addressObject` (dw.order.OrderAddress) - User's address object from the API

## Properties

### address
**Type:** Object | null

Contains the formatted address information with the following properties:

- `address1` (string) - Primary address line
- `address2` (string) - Secondary address line
- `city` (string) - City name
- `firstName` (string) - First name
- `lastName` (string) - Last name
- `ID` (string | null) - Address ID
- `addressId` (string | null) - Address identifier (same as ID)
- `phone` (string) - Phone number
- `postalCode` (string) - Postal/ZIP code
- `stateCode` (string) - State or province code
- `jobTitle` (string) - Job title
- `postBox` (string) - Post office box
- `salutation` (string) - Salutation (Mr., Mrs., etc.)
- `secondName` (string) - Second/middle name
- `companyName` (string) - Company name
- `suffix` (string) - Name suffix
- `suite` (string) - Suite number
- `title` (string) - Title
- `countryCode` (Object) - Country code object with:
  - `displayValue` (string) - Display name of country
  - `value` (string) - Country code in uppercase

## Helper Functions

### createAddressObject(addressObject)
Creates a plain object containing standardized address information.

**Parameters:**
- `addressObject` (dw.order.OrderAddress) - Address object from the API

**Returns:** Object | null - Formatted address object or null if no address provided

## Usage Example

```javascript
var AddressModel = require('*/cartridge/models/address');

// Create address model from API address object
var customerAddress = customer.addressBook.preferredAddress;
var addressModel = new AddressModel(customerAddress);

// Access address properties
console.log(addressModel.address.firstName);
console.log(addressModel.address.city);
console.log(addressModel.address.countryCode.value);
```

## Notes

- If `stateCode` is 'undefined', it will be converted to an empty string
- Country codes are automatically converted to uppercase
- The model handles both customer addresses and order addresses
- All address fields are optional and may be null or empty strings

## Related Models

- **Account Model** - Uses Address model for customer addresses
- **Checkout Models** - Use Address model for billing and shipping addresses
- **Order Models** - Use Address model for order address information

```

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

```json
{
  "_v": "23.2",
  "_type": "object_attribute_group_search_result",
  "count": 8,
  "hits": [
    {
      "_type": "object_attribute_group",
      "_resource_state": "250db50d76a5e4bf869062a6ed5aab18d77aed015a880e4f0f5b8e86cc8e071d",
      "id": "CCV",
      "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/CCV"
    },
    {
      "_type": "object_attribute_group",
      "_resource_state": "34dce900d8eb50d95d97fcc0fd74449e78720a0da5a6804e561f347d8fdb5227",
      "id": "SFRA Unified Feature Cartridge",
      "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/SFRA%20Unified%20Feature%20Cartridge"
    },
    {
      "_type": "object_attribute_group",
      "_resource_state": "0d4f2e59140361592a0e6998fdd68bacc4f06e4fb77cb25fef07142f8289fb0e",
      "id": "Storefront Configs",
      "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/Storefront%20Configs"
    },
    {
      "_type": "object_attribute_group",
      "_resource_state": "07d4d8544eb98d9036cfd6343d55206374c44f0438c1beb22a88f0ad6cc1089c",
      "id": "fastforward",
      "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/fastforward"
    },
    {
      "_type": "object_attribute_group",
      "_resource_state": "bbcd6304068fcf391c849bb37952598bebed1bd55bafbe211e2a6539b4b522a9",
      "id": "fastforward_cquotient",
      "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/fastforward_cquotient"
    },
    {
      "_type": "object_attribute_group",
      "_resource_state": "efb6bd1843b9484576c8ffaf9447bc7d0bdee5bb6b0e9231d54804dbff5a11fa",
      "id": "ffGPT",
      "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/ffGPT"
    },
    {
      "_type": "object_attribute_group",
      "_resource_state": "ed156d5f2de1fbbea7fa8350da7b2424feb7e54ac4e338d50fd6fec992df2c6f",
      "id": "google",
      "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/google"
    },
    {
      "_type": "object_attribute_group",
      "_resource_state": "ec6e9f8a42c38f4a6b003b1e93b879c62bc6cd2ee639ef482509c55a3d579959",
      "id": "managedruntime",
      "link": "https://localhost:3000/s/-/dw/data/v23_2/system_object_definitions/SitePreferences/attribute_groups/managedruntime"
    }
  ],
  "query": {
    "match_all_query": {
      "_type": "match_all_query"
    }
  },
  "start": 0,
  "total": 8
}

```

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

```typescript
/**
 * Path Service Interface and Implementation
 *
 * Provides an abstraction layer over Node.js path operations
 * to enable easier testing and better dependency injection.
 */

import * as path from 'path';

/**
 * Interface for path operations
 */
export interface IPathService {
  /**
   * Join path segments
   */
  join(...paths: string[]): string;

  /**
   * Resolve path segments to an absolute path
   */
  resolve(...paths: string[]): string;

  /**
   * Get the directory name of a path
   */
  dirname(path: string): string;

  /**
   * Get the base name of a path
   */
  basename(path: string, ext?: string): string;

  /**
   * Get the extension of a path
   */
  extname(path: string): string;

  /**
   * Normalize a path
   */
  normalize(path: string): string;

  /**
   * Check if path is absolute
   */
  isAbsolute(path: string): boolean;
}

/**
 * Production implementation of path service
 */
export class PathService implements IPathService {
  join(...paths: string[]): string {
    return path.join(...paths);
  }

  resolve(...paths: string[]): string {
    return path.resolve(...paths);
  }

  dirname(filePath: string): string {
    return path.dirname(filePath);
  }

  basename(filePath: string, ext?: string): string {
    return path.basename(filePath, ext);
  }

  extname(filePath: string): string {
    return path.extname(filePath);
  }

  normalize(filePath: string): string {
    return path.normalize(filePath);
  }

  isAbsolute(filePath: string): boolean {
    return path.isAbsolute(filePath);
  }
}

/**
 * Mock implementation for testing
 */
export class MockPathService implements IPathService {
  // For testing, we can use the real path operations or provide custom behavior
  join(...paths: string[]): string {
    return paths.join('/');
  }

  resolve(...paths: string[]): string {
    const joined = this.join(...paths);
    return joined.startsWith('/') ? joined : `/mock/root/${joined}`;
  }

  dirname(filePath: string): string {
    const parts = filePath.split('/');
    return parts.slice(0, -1).join('/') || '/';
  }

  basename(filePath: string, ext?: string): string {
    const parts = filePath.split('/');
    const base = parts[parts.length - 1];
    if (ext && base.endsWith(ext)) {
      return base.slice(0, -ext.length);
    }
    return base;
  }

  extname(filePath: string): string {
    const base = this.basename(filePath);
    const dotIndex = base.lastIndexOf('.');
    return dotIndex >= 0 ? base.slice(dotIndex) : '';
  }

  normalize(filePath: string): string {
    return filePath.replace(/\/+/g, '/');
  }

  isAbsolute(filePath: string): boolean {
    return filePath.startsWith('/');
  }
}

```
Page 3/43FirstPrevNextLast