{"locator":"npm:@open-mercato/search","path":"@open-mercato/search","npm":"@open-mercato/search","github":null,"repoPath":"open-mercato/open-mercato#main/packages/search","kind":"module","type":"official","enterprise":false,"title":"Search","summary":"Hybrid search that fuses fulltext (Meilisearch), vector and token strategies with Reciprocal Rank Fusion.","whenToUse":"Use when users need global search across records and AI agents need a search tool. New apps already enable it.","whenNotToUse":null,"category":"search-analytics","tags":["search","fulltext","vector"],"providers":[{"name":"meilisearch","label":"Meilisearch"}],"moduleIds":["search"],"requires":[],"replaces":[],"slotConflicts":[],"renamedFrom":[],"supersededBy":null,"alternatives":[],"status":"active","listed":true,"featured":false,"license":{"spdx":"MIT","kind":"osi","mismatch":false},"version":{"latest":"0.9.0","preview":null,"publishedAt":"2026-10-09","integrity":"sha512-8hX4T9mkGgTY9pCCYU6igYrLbFc9h4gN0ddkb6ULCeso/z08C7a98XG59WWiLQXWYcyI8FUf3tcjJi/dZyEfdg==","installableFrom":"2026-10-09","gitRef":null,"recommended":{"0.9":null,"0.8":null,"next":null}},"identity":{"builtFrom":"verified","claimed":false,"source":"npm"},"compat":{"builtFor":{"range":"0.9.0","kind":"exact-pin","lines":["0.8","0.9"],"ranges":{"0.9":"0.9.0","0.8":"0.8.0"}},"lines":{},"verifiedOn":[],"inPresets":["0.8","0.9","next"],"ships":{"0.9":"0.9.0","0.8":"0.8.0","next":"0.10.1-develop.7701.1.87b1ad4224"},"inEmptyPreset":["0.8","0.9","next"]},"anatomy":{"version":"0.9.0","coverage":"full","counts":{"entities":0,"tables":0,"migrations":0,"routes":15,"publicRoutes":0,"aclFeatures":6,"eventsEmitted":1,"eventsConsumed":4,"backendPages":1,"frontendPages":0,"widgets":0,"workers":2,"cli":8,"aiTools":6,"aiAgents":0,"extends":9},"lists":{"aclFeatures":["search.view","search.manage","search.reindex","search.embeddings.view","search.embeddings.manage","search.global"],"eventsEmitted":["search.index_record"],"eventsConsumed":["search.index_record","query_index.delete_one","query_index.vectorize_purge","query_index.vectorize_one"],"env":["OPENAI_API_KEY","MEILISEARCH_HOST","MEILISEARCH_API_KEY","MEILISEARCH_INDEX_PREFIX","SEARCH_EXCLUDE_ENCRYPTED_FIELDS","GOOGLE_GENERATIVE_AI_API_KEY","MISTRAL_API_KEY","COHERE_API_KEY","AWS_ACCESS_KEY_ID","OLLAMA_BASE_URL","OM_SEARCH_ENABLED","DATABASE_URL","QDRANT_URL","QDRANT_API_KEY","CHROMA_URL","OM_INDEXER_VERBOSE","QUEUE_STRATEGY","SEARCH_DISABLE_SINGLETON_CACHE","AWS_SECRET_ACCESS_KEY","WORKERS_FULLTEXT_INDEXING_CONCURRENCY"],"hosts":[],"tables":[],"publicRoutes":[],"credentials":[],"sdks":["@ai-sdk/amazon-bedrock","@ai-sdk/cohere","@ai-sdk/google","@ai-sdk/mistral","@ai-sdk/openai","meilisearch"],"backendPages":["/backend/config/search"]},"callout":"ADDS 15 ROUTES (0 PUBLIC) · 6 PERMISSIONS · EMITS 1 EVENT","diff":{"from":"0.8.0","added":{"tables":0,"routes":0,"publicRoutes":0,"aclFeatures":0,"env":[],"hosts":[]},"removed":{"tables":0,"routes":0,"aclFeatures":0}}},"signals":{"receipt":{"0.9":"untested","0.8":"untested","next":"untested"},"fit":{"0.9":"ok","0.8":"drift","next":"unknown"},"anatomy":"full","supplyChain":{"status":"ok","reasons":[]},"hygiene":{"status":"warn","failing":["peer-exact-pin"]},"maintenance":{"status":"current","lastRelease":"2026-10-09","catchUpDays":null},"declaredVsObserved":{"status":"mismatch","notes":["Built for 0.8, 0.9; verified on no line."]}},"tier":"listed","quality":null,"agentPolicy":{"0.9":{"decision":"ask","reasons":[{"code":"NOT_VERIFIED","text":"Not yet tested in a new app on 0.9."},{"code":"IN_PRESET","text":"Nothing to install: a new app already registers search in src/modules.ts."}]},"0.8":{"decision":"ask","reasons":[{"code":"NOT_VERIFIED","text":"Not yet tested in a new app on 0.8."},{"code":"IN_PRESET","text":"Nothing to install: a new app already registers search in src/modules.ts."}]},"next":{"decision":"ask","reasons":[{"code":"NOT_VERIFIED","text":"Not yet tested in a new app on next."},{"code":"IN_PRESET","text":"Nothing to install: a new app already registers search in src/modules.ts."}]}},"install":{"cli":"yarn add @open-mercato/search@0.9.0","cmm":"npx create-mercato-module install @open-mercato/search@0.9.0","needsAllowThirdParty":false,"moduleFlag":null},"stats":{"downloads30d":43683,"stars":null},"sigil":{"glyph":"0312322","phase":75,"publicRoutes":false},"links":{"page":"https://modules.openmercato.com/m/@open-mercato/search","md":"https://modules.openmercato.com/m/@open-mercato/search.md","json":"https://modules.openmercato.com/m/@open-mercato/search.json","facts":"https://modules.openmercato.com/m/@open-mercato/search/v/0.9.0/facts.json","npm":"https://www.npmjs.com/package/@open-mercato/search","repo":"https://github.com/open-mercato/open-mercato","docs":"https://docs.openmercato.com/framework/database/hybrid-search"},"addedAt":"2026-10-23","updatedAt":"2026-10-29T13:11:45Z","_meta":{"com.openmercato.modules/installable":{"0.9":"0.9.0","0.8":"0.8.0","next":"0.9.0"}},"screenshots":[{"src":"/shots/@open-mercato/search-1.webp","alt":"Search settings with the fulltext, vector and token strategies and the fulltext driver status."}],"facts":{"factsVersion":1,"extractor":{"engine":"@open-mercato/cli@0.9.0 extractModuleFacts","factsContractVersion":2,"catalog":"om-modules rentgen 1","durationMs":412},"package":{"locator":"npm:@open-mercato/search","name":"@open-mercato/search","version":"0.9.0","integrity":"sha512-8hX4T9mkGgTY9pCCYU6igYrLbFc9h4gN0ddkb6ULCeso/z08C7a98XG59WWiLQXWYcyI8FUf3tcjJi/dZyEfdg==","source":"npm-tarball","gitRef":null},"gate":{"installable":true,"needsModuleFlag":false,"reason":null,"modules":[{"id":"search","src":true,"dist":true}]},"kind":"module","license":{"value":"MIT","kind":"osi","mismatch":false,"sources":{"packageJson":"MIT","licenseFile":null,"moduleInfo":null,"integrationTs":null}},"omPeers":{"@open-mercato/core":"0.9.0","@open-mercato/queue":"0.9.0","@open-mercato/shared":"0.9.0"},"dependencies":{"@ai-sdk/amazon-bedrock":"^5.0.2","@ai-sdk/cohere":"^4.0.14","@ai-sdk/google":"^4.0.56","@ai-sdk/mistral":"^4.0.16","@ai-sdk/openai":"^4.0.50","ai":"^7.0.83","ai-sdk-ollama":"4.1.0","meilisearch":"^0.60.0","pg":"8.23.0","zod":"^4.4.3"},"agentsMd":true,"readmeExcerpt":"# @open-mercato/search 🔎\n\nHybrid search for Open Mercato: fulltext, vector, and token-based search in one module.\n\n`@open-mercato/search` delivers indexing pipelines, strategy orchestration, global search UI integration, and reindex tooling.\n\n## Why this package ✨\n\n- 🧠 Semantic + keyword search strategies\n- ⚡ Strategy fusion with configurable fallbacks\n- 🧩 Module-level search config (`search.ts`) support\n- 🛠 Reindex commands, diagnostics, and operational APIs\n\n## Install\n\n```bash\nyarn add @open-mercato/search\n```\n\n## Learn more\n\n- GitHub (package): https://github.com/open-mercato/open-mercato/tree/main/packages/search\n- GitHub (project): https://github.com/open-mercato/open-mercato\n- Docs: https://docs.openmercato.com\n\n## License\n\nMIT\n","modules":[{"id":"search","title":"Search","description":"Unified search module with pluggable strategies (Meilisearch, Vector, Tokens).","requires":[],"ejectable":null,"data":{"entities":[],"migrations":{"count":0,"first":null,"last":null},"customEntities":0},"http":{"routes":[{"method":"GET","path":"/api/search/embeddings","requireAuth":true,"requireFeatures":["search.embeddings.view"],"hasOpenApi":true,"src":{"file":"src/modules/search/api/embeddings/route.ts","line":126}},{"method":"POST","path":"/api/search/embeddings","requireAuth":true,"requireFeatures":["search.embeddings.manage"],"hasOpenApi":true,"src":{"file":"src/modules/search/api/embeddings/route.ts","line":187}},{"method":"POST","path":"/api/search/embeddings/reindex","requireAuth":true,"requireFeatures":["search.embeddings.manage"],"hasOpenApi":true,"src":{"file":"src/modules/search/api/embeddings/reindex/route.ts","line":27}},{"method":"POST","path":"/api/search/embeddings/reindex/cancel","requireAuth":true,"requireFeatures":["search.embeddings.manage"],"hasOpenApi":true,"src":{"file":"src/modules/search/api/embeddings/reindex/cancel/route.ts","line":30}},{"method":"GET","path":"/api/search/index","requireAuth":true,"requireFeatures":["search.view"],"hasOpenApi":true,"src":{"file":"src/modules/search/api/index/route.ts","line":34}},{"method":"DELETE","path":"/api/search/index","requireAuth":true,"requireFeatures":["search.embeddings.manage"],"hasOpenApi":true,"src":{"file":"src/modules/search/api/index/route.ts","line":115}},{"method":"POST","path":"/api/search/reindex","requireAuth":true,"requireFeatures":["search.reindex"],"hasOpenApi":true,"src":{"file":"src/modules/search/api/reindex/route.ts","line":67}},{"method":"POST","path":"/api/search/reindex/cancel","requireAuth":true,"requireFeatures":["search.reindex"],"hasOpenApi":true,"src":{"file":"src/modules/search/api/reindex/cancel/route.ts","line":30}},{"method":"GET","path":"/api/search/search","requireAuth":true,"requireFeatures":["search.view"],"hasOpenApi":true,"src":{"file":"src/modules/search/api/search/route.ts","line":54}},{"method":"GET","path":"/api/search/search/global","requireAuth":true,"requireFeatures":["search.global"],"hasOpenApi":true,"src":{"file":"src/modules/search/api/search/global/route.ts","line":55}},{"method":"GET","path":"/api/search/settings","requireAuth":true,"requireFeatures":["search.view"],"hasOpenApi":true,"src":{"file":"src/modules/search/api/settings/route.ts","line":63}},{"method":"GET","path":"/api/search/settings/fulltext","requireAuth":true,"requireFeatures":["search.view"],"hasOpenApi":true,"src":{"file":"src/modules/search/api/settings/fulltext/route.ts","line":40}},{"method":"GET","path":"/api/search/settings/global-search","requireAuth":true,"requireFeatures":["search.view"],"hasOpenApi":true,"src":{"file":"src/modules/search/api/settings/global-search/route.ts","line":36}},{"method":"POST","path":"/api/search/settings/global-search","requireAuth":true,"requireFeatures":["search.manage"],"hasOpenApi":true,"src":{"file":"src/modules/search/api/settings/global-search/route.ts","line":56}},{"method":"GET","path":"/api/search/settings/vector-store","requireAuth":true,"requireFeatures":["search.view"],"hasOpenApi":true,"src":{"file":"src/modules/search/api/settings/vector-store/route.ts","line":57}}],"legacyRouteFiles":0,"authResolved":1},"security":{"aclFeatures":["search.view","search.manage","search.reindex","search.embeddings.view","search.embeddings.manage","search.global"],"setupDefaultRoleFeatures":true},"events":{"emits":[{"id":"search.index_record","src":{"file":"src/modules/search/events.ts","line":4}}],"subscribes":[{"event":"search.index_record","src":{"file":"src/modules/search/subscribers/fulltext_upsert.ts","line":7}},{"event":"query_index.delete_one","src":{"file":"src/modules/search/subscribers/vector_delete.ts","line":7}},{"event":"query_index.vectorize_purge","src":{"file":"src/modules/search/subscribers/vector_purge.ts","line":10}},{"event":"query_index.vectorize_one","src":{"file":"src/modules/search/subscribers/vector_upsert.ts","line":7}}]},"ui":{"backendPages":[{"path":"/backend/config/search","requireFeatures":["search.view"]}],"frontendPages":[],"widgets":0,"extensionHosts":1},"background":{"workers":[{"queue":"fulltext-indexing"},{"queue":"vector-indexing"}],"cli":["query","status","index","reindex","reindex-help","test-meilisearch","worker","help"]},"ai":{"tools":["search_aggregate","search_get","search_query","search_reindex","search_schema","search_status"],"agents":[]},"config":{"credentials":[],"env":[{"name":"OPENAI_API_KEY","src":{"file":"src/modules/search/api/embeddings/route.ts","line":62}},{"name":"MEILISEARCH_HOST","src":{"file":"src/modules/search/api/settings/fulltext/route.ts","line":44}},{"name":"MEILISEARCH_API_KEY","src":{"file":"src/modules/search/api/settings/fulltext/route.ts","line":45}},{"name":"MEILISEARCH_INDEX_PREFIX","src":{"file":"src/modules/search/api/settings/fulltext/route.ts","line":48}},{"name":"SEARCH_EXCLUDE_ENCRYPTED_FIELDS","src":{"file":"src/modules/search/api/settings/fulltext/route.ts","line":50}},{"name":"GOOGLE_GENERATIVE_AI_API_KEY","src":{"file":"src/modules/search/api/settings/route.ts","line":121}},{"name":"MISTRAL_API_KEY","src":{"file":"src/modules/search/api/settings/route.ts","line":122}},{"name":"COHERE_API_KEY","src":{"file":"src/modules/search/api/settings/route.ts","line":123}},{"name":"AWS_ACCESS_KEY_ID","src":{"file":"src/modules/search/api/settings/route.ts","line":124}},{"name":"OLLAMA_BASE_URL","src":{"file":"src/modules/search/api/settings/route.ts","line":125}},{"name":"OM_SEARCH_ENABLED","src":{"file":"src/modules/search/api/settings/route.ts","line":128}},{"name":"DATABASE_URL","src":{"file":"src/modules/search/api/settings/vector-store/route.ts","line":62}},{"name":"QDRANT_URL","src":{"file":"src/modules/search/api/settings/vector-store/route.ts","line":65}},{"name":"QDRANT_API_KEY","src":{"file":"src/modules/search/api/settings/vector-store/route.ts","line":66}},{"name":"CHROMA_URL","src":{"file":"src/modules/search/api/settings/vector-store/route.ts","line":69}},{"name":"OM_INDEXER_VERBOSE","src":{"file":"src/modules/search/cli.ts","line":28}},{"name":"QUEUE_STRATEGY","src":{"file":"src/modules/search/cli.ts","line":800}},{"name":"SEARCH_DISABLE_SINGLETON_CACHE","src":{"file":"src/modules/search/di.ts","line":36}},{"name":"AWS_SECRET_ACCESS_KEY","src":{"file":"src/modules/search/lib/embedding-config.ts","line":97}},{"name":"WORKERS_FULLTEXT_INDEXING_CONCURRENCY","src":{"file":"src/modules/search/workers/fulltext-index.worker.ts","line":18}},{"name":"WORKERS_VECTOR_INDEXING_CONCURRENCY","src":{"file":"src/modules/search/workers/vector-index.worker.ts","line":21}},{"name":"MEILISEARCH_REQUEST_TIMEOUT_MS","src":{"file":"src/fulltext/drivers/meilisearch/index.ts","line":31}},{"name":"OM_SEARCH_DEBUG","src":{"file":"src/lib/debug.ts","line":26}},{"name":"OM_SEARCH_OLLAMA_BASE_URL_ALLOWLIST","src":{"file":"src/vector/lib/ollama-url-safety.ts","line":27}},{"name":"OM_SEARCH_OLLAMA_ALLOW_PRIVATE","src":{"file":"src/vector/lib/ollama-url-safety.ts","line":37}},{"name":"VECTOR_EMBEDDING_TIMEOUT_MS","src":{"file":"src/vector/services/embedding.ts","line":41}},{"name":"AWS_REGION","src":{"file":"src/vector/services/embedding.ts","line":168}}]},"network":{"hosts":[],"undeclared":[]},"extends":[{"kind":"specialized-registry","target":"ai:search_aggregate"},{"kind":"specialized-registry","target":"ai:search_get"},{"kind":"specialized-registry","target":"ai:search_query"},{"kind":"specialized-registry","target":"ai:search_reindex"},{"kind":"specialized-registry","target":"ai:search_schema"},{"kind":"specialized-registry","target":"ai:search_status"},{"kind":"subscriber","target":"query_index.delete_one"},{"kind":"subscriber","target":"query_index.vectorize_purge"},{"kind":"subscriber","target":"query_index.vectorize_one"}],"omImports":{"@open-mercato/cache":{".":["CacheStrategy"]},"@open-mercato/core":{"modules/configs/lib/module-config-service":["ConfigScope","ModuleConfigService"],"modules/directory/constants":["isAllOrganizationsSelection"],"modules/directory/utils/organizationScope":["resolveOrganizationScopeForRequest"],"modules/directory/utils/organizationScopeFilter":["resolveOrganizationScopeFilter"],"modules/directory/utils/scopeCookies":["parseSelectedOrganizationCookie"],"modules/progress/data/entities":["ProgressJob"],"modules/progress/lib/progressService":["ProgressService"],"modules/query_index/lib/coverage":["refreshCoverageSnapshot","writeCoverageCounts"],"modules/query_index/lib/jobs":["JobScope","finalizeJob","prepareJob"],"modules/query_index/lib/reindexer":["DEFAULT_REINDEX_PARTITIONS","reindexEntity"],"modules/query_index/lib/search-entity-policy":["(dynamic)"],"modules/query_index/lib/search-tokens":["(dynamic)"]},"@open-mercato/queue":{".":["JobContext","Queue","QueuedJob","WorkerMeta","createQueue"],"worker":["(dynamic)"]},"@open-mercato/search":{".":["SearchService"],"indexer":["SearchIndexer"],"strategies":["FullTextSearchStrategy"]},"@open-mercato/shared":{"lib/auth/server":["getAuthFromRequest"],"lib/boolean":["parseBooleanToken","parseBooleanWithDefault"],"lib/cli/progress":["createProgressBar"],"lib/custom-fields/kinds":["CustomFieldKindMapResolver","buildCustomFieldKindIndex","createCustomFieldKindMapResolver"],"lib/di/container":["AppContainer","createRequestContainer"],"lib/encryption/indexDoc":["decryptIndexDocForSearch"],"lib/encryption/tenantDataEncryptionService":["TenantDataEncryptionService","parseDecryptedFieldValue"],"lib/frontend/organizationEvents":["getCurrentOrganizationScope","subscribeOrganizationScopeChanged"],"lib/http/fetchWithTimeout":["resolveTimeoutMs"],"lib/i18n/context":["TranslateFn","useT"],"lib/i18n/server":["resolveTranslations"],"lib/indexers/error-log":["recordIndexerError"],"lib/indexers/status-log":["recordIndexerLog"],"lib/logger":["Logger","createLogger"],"lib/openapi":["OpenApiRouteDoc"],"lib/query/engine":["resolveEntityTableName"],"lib/query/types":["QueryEngine"],"lib/redis/connection":["getRedisUrlOrThrow"],"lib/search/auto-indexing":["SEARCH_AUTO_INDEX_CONFIG_KEY","SEARCH_AUTO_INDEX_CONFIG_MODULE","envDisablesAutoIndexing"],"lib/search/config":["(dynamic)","resolveSearchMinTokenLength"],"lib/search/entityAccess":["*"],"lib/search/tokenize":["(dynamic)"],"lib/url-safety":["HostLookup","SafeOutboundFetchOptions","UrlSafetyReason","assertStaticallySafeOutboundUrl","safeOutboundFetch"],"lib/utils":["cn"],"modules/encryption":["ModuleEncryptionMap"],"modules/entities":["EntityId"],"modules/events":["createModuleEvents"],"modules/registry":["ModuleCli","ModuleInfo"],"modules/search":["IndexableRecord","PresenterEnricherFn","ResultMergeConfig","SearchBuildContext","SearchDeletePayload","SearchEntityConfig","SearchFieldPolicy","SearchIndexPayload","SearchIndexSource","SearchModuleConfig","SearchOptions","SearchResult","SearchResultLink","SearchResultPresenter","SearchServiceOptions","SearchStrategy","SearchStrategyId"],"modules/setup":["ModuleSetupConfig"],"modules/vector":["VectorDriverId","VectorEntityConfig","VectorIndexEntry","VectorIndexSource","VectorLinkDescriptor","VectorModuleConfig","VectorQueryRequest","VectorResultPresenter","VectorSearchHit"],"security/featurePolicy":["authorizeFeatures"]},"@open-mercato/ui":{"backend/DataTable":["DataTable"],"backend/FlashMessages":["flash"],"backend/Page":["Page","PageBody"],"backend/RowActions":["RowActions"],"backend/injection/useAppEvent":["useAppEvent"],"backend/utils/api":["ForbiddenError"],"backend/utils/apiCall":["readApiResultOrThrow"],"primitives/button":["Button"],"primitives/dialog":["Dialog","DialogContent","DialogTitle"],"primitives/icon-button":["IconButton"],"primitives/input":["Input"],"primitives/label":["Label"],"primitives/select":["Select","SelectContent","SelectItem","SelectTrigger","SelectValue"],"primitives/spinner":["Spinner"],"primitives/tabs":["Tabs","TabsContent","TabsList","TabsTrigger"]}},"collisionKeys":{"moduleId":"search","tables":[],"aclFeatures":["search.view","search.manage","search.reindex","search.embeddings.view","search.embeddings.manage","search.global"],"eventIds":["search.index_record"],"backendRoutes":["/backend/config/search"]},"publicRoutes":0,"glyph":"0312322","lint":[{"code":"peer-exact-pin","severity":"warn","message":"Peer dependencies pin Open Mercato exactly (@open-mercato/core 0.9.0 and 2 more). Use a range.","anchor":"i2 §1.4","src":null},{"code":"ships-tests","severity":"info","message":"The tarball ships test files.","anchor":null,"src":null},{"code":"version-drift","severity":"info","message":"ModuleInfo says 0.1.0, package.json says 0.9.0.","anchor":null,"src":{"file":"src/modules/search/index.ts","line":3}}]}],"coverage":{"routesAuthResolved":1,"integrationTs":"absent"},"diagnostics":[]},"receipts":[],"rules":[{"id":"LST-1","pass":true,"detail":"Descriptor is valid."},{"id":"LST-2","pass":true,"detail":"Stable version exists and is not deprecated."},{"id":"LST-3","pass":true,"detail":"src/modules and dist/modules pair found."},{"id":"LST-4","pass":true,"detail":"License: MIT."},{"id":"LST-5","pass":true,"detail":"No known malware or open critical advisory."},{"id":"LST-6","pass":true,"detail":"Name reviewed at merge."},{"id":"VER-1","pass":false,"detail":"Not yet tested in a new app on 0.9."},{"id":"VER-2","pass":true,"detail":"Fits statically on 0.9: ok."},{"id":"VER-3","pass":true,"detail":"Supply chain: ok."},{"id":"VER-4","pass":true,"detail":"No lint errors."},{"id":"VER-5","pass":true,"detail":"No repository in the descriptor to compare."}],"maintainers":["pat-lewczuk","patryk.andrzejewski","piotrkarwatka"]}
