@simpleapps-com/augur-api 0.2.3 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/README.md +100 -0
  2. package/dist/cjs/client.d.ts +181 -0
  3. package/dist/cjs/client.d.ts.map +1 -1
  4. package/dist/cjs/client.js +449 -0
  5. package/dist/cjs/client.js.map +1 -1
  6. package/dist/cjs/core/base-client.d.ts +104 -0
  7. package/dist/cjs/core/base-client.d.ts.map +1 -1
  8. package/dist/cjs/core/base-client.js +201 -0
  9. package/dist/cjs/core/base-client.js.map +1 -1
  10. package/dist/cjs/index.d.ts +2 -1
  11. package/dist/cjs/index.d.ts.map +1 -1
  12. package/dist/cjs/index.js +1 -1
  13. package/dist/cjs/index.js.map +1 -1
  14. package/dist/cjs/services/agr-site/client.d.ts +522 -2
  15. package/dist/cjs/services/agr-site/client.d.ts.map +1 -1
  16. package/dist/cjs/services/agr-site/client.js +565 -12
  17. package/dist/cjs/services/agr-site/client.js.map +1 -1
  18. package/dist/cjs/services/items/client.d.ts +2 -2
  19. package/dist/cjs/services/items/schemas/categories.d.ts +20 -20
  20. package/dist/cjs/services/joomla/client.d.ts +644 -99
  21. package/dist/cjs/services/joomla/client.d.ts.map +1 -1
  22. package/dist/cjs/services/joomla/client.js +467 -98
  23. package/dist/cjs/services/joomla/client.js.map +1 -1
  24. package/dist/cjs/services/nexus/client.d.ts +1096 -22
  25. package/dist/cjs/services/nexus/client.d.ts.map +1 -1
  26. package/dist/cjs/services/nexus/client.js +754 -22
  27. package/dist/cjs/services/nexus/client.js.map +1 -1
  28. package/dist/cjs/services/orders/client.d.ts +3 -3
  29. package/dist/cjs/services/orders/schemas/orders.d.ts +12 -12
  30. package/dist/cjs/services/orders/schemas/purchase-orders.d.ts +22 -22
  31. package/dist/cjs/services/p21-core/client.d.ts +627 -0
  32. package/dist/cjs/services/p21-core/client.d.ts.map +1 -0
  33. package/dist/cjs/services/p21-core/client.js +704 -0
  34. package/dist/cjs/services/p21-core/client.js.map +1 -0
  35. package/dist/cjs/services/p21-core/index.d.ts +3 -0
  36. package/dist/cjs/services/p21-core/index.d.ts.map +1 -0
  37. package/dist/cjs/services/p21-core/index.js +21 -0
  38. package/dist/cjs/services/p21-core/index.js.map +1 -0
  39. package/dist/cjs/services/p21-core/schemas/address.d.ts +88 -0
  40. package/dist/cjs/services/p21-core/schemas/address.d.ts.map +1 -0
  41. package/dist/cjs/services/p21-core/schemas/address.js +45 -0
  42. package/dist/cjs/services/p21-core/schemas/address.js.map +1 -0
  43. package/dist/cjs/services/p21-core/schemas/cash-drawer.d.ts +96 -0
  44. package/dist/cjs/services/p21-core/schemas/cash-drawer.d.ts.map +1 -0
  45. package/dist/cjs/services/p21-core/schemas/cash-drawer.js +39 -0
  46. package/dist/cjs/services/p21-core/schemas/cash-drawer.js.map +1 -0
  47. package/dist/cjs/services/p21-core/schemas/codes.d.ts +54 -0
  48. package/dist/cjs/services/p21-core/schemas/codes.d.ts.map +1 -0
  49. package/dist/cjs/services/p21-core/schemas/codes.js +25 -0
  50. package/dist/cjs/services/p21-core/schemas/codes.js.map +1 -0
  51. package/dist/cjs/services/p21-core/schemas/company.d.ts +80 -0
  52. package/dist/cjs/services/p21-core/schemas/company.d.ts.map +1 -0
  53. package/dist/cjs/services/p21-core/schemas/company.js +35 -0
  54. package/dist/cjs/services/p21-core/schemas/company.js.map +1 -0
  55. package/dist/cjs/services/p21-core/schemas/health.d.ts +46 -0
  56. package/dist/cjs/services/p21-core/schemas/health.d.ts.map +1 -0
  57. package/dist/cjs/services/p21-core/schemas/health.js +7 -0
  58. package/dist/cjs/services/p21-core/schemas/health.js.map +1 -0
  59. package/dist/cjs/services/p21-core/schemas/index.d.ts +8 -0
  60. package/dist/cjs/services/p21-core/schemas/index.d.ts.map +1 -0
  61. package/dist/cjs/services/p21-core/schemas/index.js +25 -0
  62. package/dist/cjs/services/p21-core/schemas/index.js.map +1 -0
  63. package/dist/cjs/services/p21-core/schemas/location.d.ts +84 -0
  64. package/dist/cjs/services/p21-core/schemas/location.d.ts.map +1 -0
  65. package/dist/cjs/services/p21-core/schemas/location.js +35 -0
  66. package/dist/cjs/services/p21-core/schemas/location.js.map +1 -0
  67. package/dist/cjs/services/p21-core/schemas/payment-types.d.ts +39 -0
  68. package/dist/cjs/services/p21-core/schemas/payment-types.d.ts.map +1 -0
  69. package/dist/cjs/services/p21-core/schemas/payment-types.js +26 -0
  70. package/dist/cjs/services/p21-core/schemas/payment-types.js.map +1 -0
  71. package/dist/cjs/services/p21-core/schemas.d.ts +2 -0
  72. package/dist/cjs/services/p21-core/schemas.d.ts.map +1 -0
  73. package/dist/cjs/services/p21-core/schemas.js +19 -0
  74. package/dist/cjs/services/p21-core/schemas.js.map +1 -0
  75. package/dist/cjs/services/vmi/schemas/inventory.d.ts +6 -6
  76. package/dist/cjs/services/vmi/schemas/products.d.ts +6 -6
  77. package/dist/cjs/services/vmi/schemas/restock.d.ts +12 -12
  78. package/dist/esm/client.d.ts +181 -0
  79. package/dist/esm/client.d.ts.map +1 -1
  80. package/dist/esm/client.js +449 -0
  81. package/dist/esm/client.js.map +1 -1
  82. package/dist/esm/core/base-client.d.ts +104 -0
  83. package/dist/esm/core/base-client.d.ts.map +1 -1
  84. package/dist/esm/core/base-client.js +201 -0
  85. package/dist/esm/core/base-client.js.map +1 -1
  86. package/dist/esm/index.d.ts +2 -1
  87. package/dist/esm/index.d.ts.map +1 -1
  88. package/dist/esm/index.js +1 -1
  89. package/dist/esm/index.js.map +1 -1
  90. package/dist/esm/services/agr-site/client.d.ts +522 -2
  91. package/dist/esm/services/agr-site/client.d.ts.map +1 -1
  92. package/dist/esm/services/agr-site/client.js +565 -12
  93. package/dist/esm/services/agr-site/client.js.map +1 -1
  94. package/dist/esm/services/items/client.d.ts +2 -2
  95. package/dist/esm/services/items/schemas/categories.d.ts +20 -20
  96. package/dist/esm/services/joomla/client.d.ts +644 -99
  97. package/dist/esm/services/joomla/client.d.ts.map +1 -1
  98. package/dist/esm/services/joomla/client.js +467 -98
  99. package/dist/esm/services/joomla/client.js.map +1 -1
  100. package/dist/esm/services/nexus/client.d.ts +1096 -22
  101. package/dist/esm/services/nexus/client.d.ts.map +1 -1
  102. package/dist/esm/services/nexus/client.js +754 -22
  103. package/dist/esm/services/nexus/client.js.map +1 -1
  104. package/dist/esm/services/orders/client.d.ts +3 -3
  105. package/dist/esm/services/orders/schemas/orders.d.ts +12 -12
  106. package/dist/esm/services/orders/schemas/purchase-orders.d.ts +22 -22
  107. package/dist/esm/services/p21-core/client.d.ts +627 -0
  108. package/dist/esm/services/p21-core/client.d.ts.map +1 -0
  109. package/dist/esm/services/p21-core/client.js +700 -0
  110. package/dist/esm/services/p21-core/client.js.map +1 -0
  111. package/dist/esm/services/p21-core/index.d.ts +3 -0
  112. package/dist/esm/services/p21-core/index.d.ts.map +1 -0
  113. package/dist/esm/services/p21-core/index.js +3 -0
  114. package/dist/esm/services/p21-core/index.js.map +1 -0
  115. package/dist/esm/services/p21-core/schemas/address.d.ts +88 -0
  116. package/dist/esm/services/p21-core/schemas/address.d.ts.map +1 -0
  117. package/dist/esm/services/p21-core/schemas/address.js +42 -0
  118. package/dist/esm/services/p21-core/schemas/address.js.map +1 -0
  119. package/dist/esm/services/p21-core/schemas/cash-drawer.d.ts +96 -0
  120. package/dist/esm/services/p21-core/schemas/cash-drawer.d.ts.map +1 -0
  121. package/dist/esm/services/p21-core/schemas/cash-drawer.js +36 -0
  122. package/dist/esm/services/p21-core/schemas/cash-drawer.js.map +1 -0
  123. package/dist/esm/services/p21-core/schemas/codes.d.ts +54 -0
  124. package/dist/esm/services/p21-core/schemas/codes.d.ts.map +1 -0
  125. package/dist/esm/services/p21-core/schemas/codes.js +22 -0
  126. package/dist/esm/services/p21-core/schemas/codes.js.map +1 -0
  127. package/dist/esm/services/p21-core/schemas/company.d.ts +80 -0
  128. package/dist/esm/services/p21-core/schemas/company.d.ts.map +1 -0
  129. package/dist/esm/services/p21-core/schemas/company.js +32 -0
  130. package/dist/esm/services/p21-core/schemas/company.js.map +1 -0
  131. package/dist/esm/services/p21-core/schemas/health.d.ts +46 -0
  132. package/dist/esm/services/p21-core/schemas/health.d.ts.map +1 -0
  133. package/dist/esm/services/p21-core/schemas/health.js +4 -0
  134. package/dist/esm/services/p21-core/schemas/health.js.map +1 -0
  135. package/dist/esm/services/p21-core/schemas/index.d.ts +8 -0
  136. package/dist/esm/services/p21-core/schemas/index.d.ts.map +1 -0
  137. package/dist/esm/services/p21-core/schemas/index.js +9 -0
  138. package/dist/esm/services/p21-core/schemas/index.js.map +1 -0
  139. package/dist/esm/services/p21-core/schemas/location.d.ts +84 -0
  140. package/dist/esm/services/p21-core/schemas/location.d.ts.map +1 -0
  141. package/dist/esm/services/p21-core/schemas/location.js +32 -0
  142. package/dist/esm/services/p21-core/schemas/location.js.map +1 -0
  143. package/dist/esm/services/p21-core/schemas/payment-types.d.ts +39 -0
  144. package/dist/esm/services/p21-core/schemas/payment-types.d.ts.map +1 -0
  145. package/dist/esm/services/p21-core/schemas/payment-types.js +23 -0
  146. package/dist/esm/services/p21-core/schemas/payment-types.js.map +1 -0
  147. package/dist/esm/services/p21-core/schemas.d.ts +2 -0
  148. package/dist/esm/services/p21-core/schemas.d.ts.map +1 -0
  149. package/dist/esm/services/p21-core/schemas.js +3 -0
  150. package/dist/esm/services/p21-core/schemas.js.map +1 -0
  151. package/dist/esm/services/vmi/schemas/inventory.d.ts +6 -6
  152. package/dist/esm/services/vmi/schemas/products.d.ts +6 -6
  153. package/dist/esm/services/vmi/schemas/restock.d.ts +12 -12
  154. package/dist/types/client.d.ts +181 -0
  155. package/dist/types/client.d.ts.map +1 -1
  156. package/dist/types/core/base-client.d.ts +104 -0
  157. package/dist/types/core/base-client.d.ts.map +1 -1
  158. package/dist/types/index.d.ts +2 -1
  159. package/dist/types/index.d.ts.map +1 -1
  160. package/dist/types/services/agr-site/client.d.ts +522 -2
  161. package/dist/types/services/agr-site/client.d.ts.map +1 -1
  162. package/dist/types/services/items/client.d.ts +2 -2
  163. package/dist/types/services/items/schemas/categories.d.ts +20 -20
  164. package/dist/types/services/joomla/client.d.ts +644 -99
  165. package/dist/types/services/joomla/client.d.ts.map +1 -1
  166. package/dist/types/services/nexus/client.d.ts +1096 -22
  167. package/dist/types/services/nexus/client.d.ts.map +1 -1
  168. package/dist/types/services/orders/client.d.ts +3 -3
  169. package/dist/types/services/orders/schemas/orders.d.ts +12 -12
  170. package/dist/types/services/orders/schemas/purchase-orders.d.ts +22 -22
  171. package/dist/types/services/p21-core/client.d.ts +627 -0
  172. package/dist/types/services/p21-core/client.d.ts.map +1 -0
  173. package/dist/types/services/p21-core/index.d.ts +3 -0
  174. package/dist/types/services/p21-core/index.d.ts.map +1 -0
  175. package/dist/types/services/p21-core/schemas/address.d.ts +88 -0
  176. package/dist/types/services/p21-core/schemas/address.d.ts.map +1 -0
  177. package/dist/types/services/p21-core/schemas/cash-drawer.d.ts +96 -0
  178. package/dist/types/services/p21-core/schemas/cash-drawer.d.ts.map +1 -0
  179. package/dist/types/services/p21-core/schemas/codes.d.ts +54 -0
  180. package/dist/types/services/p21-core/schemas/codes.d.ts.map +1 -0
  181. package/dist/types/services/p21-core/schemas/company.d.ts +80 -0
  182. package/dist/types/services/p21-core/schemas/company.d.ts.map +1 -0
  183. package/dist/types/services/p21-core/schemas/health.d.ts +46 -0
  184. package/dist/types/services/p21-core/schemas/health.d.ts.map +1 -0
  185. package/dist/types/services/p21-core/schemas/index.d.ts +8 -0
  186. package/dist/types/services/p21-core/schemas/index.d.ts.map +1 -0
  187. package/dist/types/services/p21-core/schemas/location.d.ts +84 -0
  188. package/dist/types/services/p21-core/schemas/location.d.ts.map +1 -0
  189. package/dist/types/services/p21-core/schemas/payment-types.d.ts +39 -0
  190. package/dist/types/services/p21-core/schemas/payment-types.d.ts.map +1 -0
  191. package/dist/types/services/p21-core/schemas.d.ts +2 -0
  192. package/dist/types/services/p21-core/schemas.d.ts.map +1 -0
  193. package/dist/types/services/vmi/schemas/inventory.d.ts +6 -6
  194. package/dist/types/services/vmi/schemas/products.d.ts +6 -6
  195. package/dist/types/services/vmi/schemas/restock.d.ts +12 -12
  196. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  import { AugurAPIConfig } from './core/config';
2
+ import { DiscoveryEndpoint as BaseDiscoveryEndpoint } from './core/base-client';
2
3
  import { JoomlaClient } from './services/joomla';
3
4
  import { CommerceClient } from './services/commerce';
4
5
  import { PricingClient } from './services/pricing';
@@ -12,6 +13,36 @@ import { CustomersClient } from './services/customers';
12
13
  import { OrdersClient } from './services/orders';
13
14
  import { P21PimClient } from './services/p21-pim';
14
15
  import { PaymentsClient } from './services/payments';
16
+ /**
17
+ * Interface for discovery endpoint information - re-export base discovery endpoint
18
+ */
19
+ export type DiscoveryEndpoint = BaseDiscoveryEndpoint;
20
+ /**
21
+ * Interface for service discovery results
22
+ */
23
+ export interface ServiceMap {
24
+ /** Service name */
25
+ serviceName: string;
26
+ /** Service description */
27
+ description: string;
28
+ /** Base URL for the service */
29
+ baseUrl: string;
30
+ /** Number of discoverable endpoints */
31
+ endpointCount: number;
32
+ /** Array of discoverable endpoints */
33
+ endpoints: DiscoveryEndpoint[];
34
+ }
35
+ /**
36
+ * Interface for endpoint search results
37
+ */
38
+ export interface EndpointSearchResult {
39
+ /** The matching endpoint */
40
+ endpoint: DiscoveryEndpoint;
41
+ /** Relevance score (0-1) */
42
+ score: number;
43
+ /** Reason why this endpoint matched */
44
+ matchReason: string;
45
+ }
15
46
  /**
16
47
  * Main client factory for accessing Augur microservices
17
48
  *
@@ -172,5 +203,155 @@ export declare class AugurAPI {
172
203
  * @param siteId New site ID
173
204
  */
174
205
  setSiteId(siteId: string): void;
206
+ /**
207
+ * Discover all available services and their capabilities
208
+ *
209
+ * Returns a complete service map showing all discoverable endpoints across
210
+ * all microservices, enabling AI agents to understand the full API topology.
211
+ *
212
+ * @returns Promise<ServiceMap[]> Array of service maps with endpoint metadata
213
+ *
214
+ * @example
215
+ * ```typescript
216
+ * const api = new AugurAPI({ siteId: 'my-site', bearerToken: 'token' });
217
+ * const services = await api.discover();
218
+ *
219
+ * // Find all user-related endpoints
220
+ * const userEndpoints = services.flatMap(s => s.endpoints)
221
+ * .filter(e => e.searchTerms.some(term => term.includes('user')));
222
+ *
223
+ * // Show service capabilities
224
+ * services.forEach(service => {
225
+ * console.log(`${service.serviceName}: ${service.endpointCount} endpoints`);
226
+ * service.endpoints.forEach(endpoint => {
227
+ * console.log(` ${endpoint.fullPath} - ${endpoint.description}`);
228
+ * });
229
+ * });
230
+ * ```
231
+ */
232
+ discover(): Promise<ServiceMap[]>;
233
+ /**
234
+ * Find endpoints by search term or functionality description
235
+ *
236
+ * Searches across all services to find endpoints that match the given search term.
237
+ * Uses intelligent matching against endpoint descriptions, search terms, domains,
238
+ * and common usage patterns.
239
+ *
240
+ * @param searchTerm The functionality or term to search for
241
+ * @param options Search options for filtering and ranking
242
+ * @returns Promise<EndpointSearchResult[]> Array of matching endpoints with relevance scores
243
+ *
244
+ * @example
245
+ * ```typescript
246
+ * const api = new AugurAPI({ siteId: 'my-site', bearerToken: 'token' });
247
+ *
248
+ * // Find user-related endpoints
249
+ * const userEndpoints = await api.findEndpoint('users');
250
+ * console.log(`Found ${userEndpoints.length} user-related endpoints`);
251
+ *
252
+ * // Find authentication endpoints
253
+ * const authEndpoints = await api.findEndpoint('authentication');
254
+ *
255
+ * // Find inventory management
256
+ * const inventoryEndpoints = await api.findEndpoint('inventory management');
257
+ *
258
+ * // Show results with scores
259
+ * userEndpoints.forEach(result => {
260
+ * console.log(`${result.endpoint.fullPath} (${result.score.toFixed(2)}) - ${result.matchReason}`);
261
+ * });
262
+ * ```
263
+ */
264
+ findEndpoint(searchTerm: string, options?: {
265
+ /** Minimum relevance score (0-1, default: 0.1) */
266
+ minScore?: number;
267
+ /** Maximum number of results (default: 10) */
268
+ maxResults?: number;
269
+ /** Filter by specific service */
270
+ service?: string;
271
+ /** Filter by business domain */
272
+ domain?: string;
273
+ /** Include only GET endpoints */
274
+ readOnly?: boolean;
275
+ }): Promise<EndpointSearchResult[]>;
276
+ /**
277
+ * Get endpoints filtered by service, domain, and method options
278
+ */
279
+ private getFilteredEndpoints;
280
+ /**
281
+ * Search and score endpoints against search term
282
+ */
283
+ private searchAndScoreEndpoints;
284
+ /**
285
+ * Check if endpoint has required fields
286
+ */
287
+ private isValidEndpoint;
288
+ /**
289
+ * Calculate final score with domain filter adjustments
290
+ */
291
+ private calculateFinalScore;
292
+ /**
293
+ * Calculate relevance score for an endpoint against a search term
294
+ */
295
+ private calculateEndpointRelevance;
296
+ /**
297
+ * Process exact matches with appropriate combining logic
298
+ */
299
+ private processExactMatches;
300
+ /**
301
+ * Check if match type should be exclusive (no combining)
302
+ */
303
+ private isExclusiveMatch;
304
+ /**
305
+ * Check if match type can be combined with partial matches
306
+ */
307
+ private isCombinableMatch;
308
+ /**
309
+ * Process fallback matches when no exact match found
310
+ */
311
+ private processFallbackMatches;
312
+ /**
313
+ * Calculate exact field matches with high scores
314
+ */
315
+ private calculateExactMatches;
316
+ /**
317
+ * Check for path substring matches
318
+ */
319
+ private checkPathSubstringMatch;
320
+ /**
321
+ * Check for description substring matches
322
+ */
323
+ private checkDescriptionSubstringMatch;
324
+ /**
325
+ * Check for other substring matches (domain, service)
326
+ */
327
+ private checkOtherSubstringMatches;
328
+ /**
329
+ * Check for exact field matches
330
+ */
331
+ private checkExactFieldMatches;
332
+ /**
333
+ * Check search terms and common patterns
334
+ */
335
+ private checkSearchTermsAndPatterns;
336
+ /**
337
+ * Calculate partial word matches with lower scores
338
+ */
339
+ private calculatePartialMatches;
340
+ /**
341
+ * Build searchable text from endpoint fields
342
+ */
343
+ private buildSearchableText;
344
+ /**
345
+ * Count matching words in text
346
+ */
347
+ private countWordMatches;
348
+ /**
349
+ * Build partial match result with score and reason
350
+ */
351
+ private buildPartialMatchResult;
352
+ /**
353
+ * Calculate multi-word matches by finding the best match for each word
354
+ */
355
+ private calculateMultiWordMatches;
175
356
  }
176
357
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiFG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAC,CAAe;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAiB;IACnC,OAAO,CAAC,QAAQ,CAAC,CAAgB;IACjC,OAAO,CAAC,IAAI,CAAC,CAAY;IACzB,OAAO,CAAC,WAAW,CAAC,CAAmB;IACvC,OAAO,CAAC,MAAM,CAAC,CAAc;IAC7B,OAAO,CAAC,OAAO,CAAC,CAAe;IAC/B,OAAO,CAAC,MAAM,CAAC,CAAc;IAC7B,OAAO,CAAC,QAAQ,CAAC,CAAgB;IACjC,OAAO,CAAC,UAAU,CAAC,CAAkB;IACrC,OAAO,CAAC,OAAO,CAAC,CAAe;IAC/B,OAAO,CAAC,OAAO,CAAC,CAAe;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAiB;gBAEvB,MAAM,EAAE,cAAc;IAIlC;;OAEG;IACH,IAAI,MAAM,IAAI,YAAY,CAMzB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,cAAc,CAM7B;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,aAAa,CAM3B;IAED;;OAEG;IACH,IAAI,GAAG,IAAI,SAAS,CAMnB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,gBAAgB,CAMjC;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,WAAW,CAMvB;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,YAAY,CAMzB;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,WAAW,CAMvB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,aAAa,CAM3B;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,eAAe,CAM/B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,YAAY,CAMzB;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,YAAY,CAMzB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,cAAc,CAM7B;IAED;;;OAGG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAkBvC;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAiBhC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -270,5 +270,454 @@ export class AugurAPI {
270
270
  this._p21Pim = undefined;
271
271
  this._payments = undefined;
272
272
  }
273
+ /**
274
+ * Discover all available services and their capabilities
275
+ *
276
+ * Returns a complete service map showing all discoverable endpoints across
277
+ * all microservices, enabling AI agents to understand the full API topology.
278
+ *
279
+ * @returns Promise<ServiceMap[]> Array of service maps with endpoint metadata
280
+ *
281
+ * @example
282
+ * ```typescript
283
+ * const api = new AugurAPI({ siteId: 'my-site', bearerToken: 'token' });
284
+ * const services = await api.discover();
285
+ *
286
+ * // Find all user-related endpoints
287
+ * const userEndpoints = services.flatMap(s => s.endpoints)
288
+ * .filter(e => e.searchTerms.some(term => term.includes('user')));
289
+ *
290
+ * // Show service capabilities
291
+ * services.forEach(service => {
292
+ * console.log(`${service.serviceName}: ${service.endpointCount} endpoints`);
293
+ * service.endpoints.forEach(endpoint => {
294
+ * console.log(` ${endpoint.fullPath} - ${endpoint.description}`);
295
+ * });
296
+ * });
297
+ * ```
298
+ */
299
+ async discover() {
300
+ const services = [];
301
+ // Get all available service clients
302
+ const serviceClients = [
303
+ { name: 'joomla', client: this.joomla },
304
+ { name: 'commerce', client: this.commerce },
305
+ { name: 'pricing', client: this.pricing },
306
+ { name: 'vmi', client: this.vmi },
307
+ { name: 'opensearch', client: this.opensearch },
308
+ { name: 'items', client: this.items },
309
+ { name: 'legacy', client: this.legacy },
310
+ { name: 'nexus', client: this.nexus },
311
+ { name: 'agrSite', client: this.agrSite },
312
+ { name: 'customers', client: this.customers },
313
+ { name: 'orders', client: this.orders },
314
+ { name: 'p21Pim', client: this.p21Pim },
315
+ { name: 'payments', client: this.payments },
316
+ ];
317
+ for (const { client } of serviceClients) {
318
+ try {
319
+ // Get discovery metadata from each service client
320
+ const metadata = client.getDiscoveryMetadata();
321
+ services.push({
322
+ serviceName: metadata.serviceName,
323
+ description: metadata.description,
324
+ baseUrl: metadata.baseUrl,
325
+ endpointCount: metadata.endpoints.length,
326
+ endpoints: metadata.endpoints,
327
+ });
328
+ }
329
+ catch {
330
+ // Silently skip services that don't support discovery
331
+ continue;
332
+ }
333
+ }
334
+ return services;
335
+ }
336
+ /**
337
+ * Find endpoints by search term or functionality description
338
+ *
339
+ * Searches across all services to find endpoints that match the given search term.
340
+ * Uses intelligent matching against endpoint descriptions, search terms, domains,
341
+ * and common usage patterns.
342
+ *
343
+ * @param searchTerm The functionality or term to search for
344
+ * @param options Search options for filtering and ranking
345
+ * @returns Promise<EndpointSearchResult[]> Array of matching endpoints with relevance scores
346
+ *
347
+ * @example
348
+ * ```typescript
349
+ * const api = new AugurAPI({ siteId: 'my-site', bearerToken: 'token' });
350
+ *
351
+ * // Find user-related endpoints
352
+ * const userEndpoints = await api.findEndpoint('users');
353
+ * console.log(`Found ${userEndpoints.length} user-related endpoints`);
354
+ *
355
+ * // Find authentication endpoints
356
+ * const authEndpoints = await api.findEndpoint('authentication');
357
+ *
358
+ * // Find inventory management
359
+ * const inventoryEndpoints = await api.findEndpoint('inventory management');
360
+ *
361
+ * // Show results with scores
362
+ * userEndpoints.forEach(result => {
363
+ * console.log(`${result.endpoint.fullPath} (${result.score.toFixed(2)}) - ${result.matchReason}`);
364
+ * });
365
+ * ```
366
+ */
367
+ async findEndpoint(searchTerm, options = {}) {
368
+ const { minScore = 0.1, maxResults = 10, service, domain, readOnly = false } = options;
369
+ // Handle empty search term
370
+ if (!searchTerm.trim()) {
371
+ return [];
372
+ }
373
+ // Get filtered endpoints
374
+ const filteredEndpoints = await this.getFilteredEndpoints({ service, domain, readOnly });
375
+ // Search and score endpoints
376
+ const results = this.searchAndScoreEndpoints(filteredEndpoints, searchTerm, {
377
+ domain,
378
+ minScore,
379
+ });
380
+ // Sort by relevance score (highest first) and limit results
381
+ return results.sort((a, b) => b.score - a.score).slice(0, maxResults);
382
+ }
383
+ /**
384
+ * Get endpoints filtered by service, domain, and method options
385
+ */
386
+ async getFilteredEndpoints(filters) {
387
+ const { service, domain, readOnly } = filters;
388
+ const services = await this.discover();
389
+ let filteredEndpoints = services.flatMap(s => s.endpoints);
390
+ if (service) {
391
+ filteredEndpoints = filteredEndpoints.filter(e => e.service === service);
392
+ }
393
+ if (domain) {
394
+ filteredEndpoints = filteredEndpoints.filter(e => e.domain === domain);
395
+ }
396
+ if (readOnly) {
397
+ filteredEndpoints = filteredEndpoints.filter(e => e.method === 'GET');
398
+ }
399
+ return filteredEndpoints;
400
+ }
401
+ /**
402
+ * Search and score endpoints against search term
403
+ */
404
+ searchAndScoreEndpoints(endpoints, searchTerm, options) {
405
+ const { domain, minScore } = options;
406
+ const results = [];
407
+ const searchTermLower = searchTerm.toLowerCase();
408
+ for (const endpoint of endpoints) {
409
+ // Skip malformed endpoints
410
+ if (!this.isValidEndpoint(endpoint)) {
411
+ continue;
412
+ }
413
+ const { finalScore, finalMatchReason } = this.calculateFinalScore(endpoint, searchTermLower, domain);
414
+ if (finalScore >= minScore) {
415
+ results.push({
416
+ endpoint,
417
+ score: finalScore,
418
+ matchReason: finalMatchReason,
419
+ });
420
+ }
421
+ }
422
+ return results;
423
+ }
424
+ /**
425
+ * Check if endpoint has required fields
426
+ */
427
+ isValidEndpoint(endpoint) {
428
+ return !!(endpoint.domain && endpoint.description && endpoint.method);
429
+ }
430
+ /**
431
+ * Calculate final score with domain filter adjustments
432
+ */
433
+ calculateFinalScore(endpoint, searchTermLower, domain) {
434
+ const { score, matchReason } = this.calculateEndpointRelevance(endpoint, searchTermLower);
435
+ // If domain filter is applied and search score is 0, give minimal score
436
+ if (domain && score === 0) {
437
+ return {
438
+ finalScore: 0.1,
439
+ finalMatchReason: 'Domain filter match',
440
+ };
441
+ }
442
+ return {
443
+ finalScore: score,
444
+ finalMatchReason: matchReason,
445
+ };
446
+ }
447
+ /**
448
+ * Calculate relevance score for an endpoint against a search term
449
+ */
450
+ calculateEndpointRelevance(endpoint, searchTermLower) {
451
+ const exactMatches = this.calculateExactMatches(endpoint, searchTermLower);
452
+ const partialMatches = this.calculatePartialMatches(endpoint, searchTermLower);
453
+ // Process exact matches if found
454
+ if (exactMatches.score > 0) {
455
+ return this.processExactMatches(exactMatches, partialMatches);
456
+ }
457
+ // Fallback to multi-word or partial matches
458
+ return this.processFallbackMatches(endpoint, searchTermLower, partialMatches);
459
+ }
460
+ /**
461
+ * Process exact matches with appropriate combining logic
462
+ */
463
+ processExactMatches(exactMatches, partialMatches) {
464
+ // Service and search term matches are exclusive
465
+ if (this.isExclusiveMatch(exactMatches.reason)) {
466
+ return {
467
+ score: exactMatches.score,
468
+ matchReason: exactMatches.reason,
469
+ };
470
+ }
471
+ // Combinable matches get partial score boost
472
+ if (this.isCombinableMatch(exactMatches.reason)) {
473
+ const totalScore = Math.min(exactMatches.score + partialMatches.score, 1.0);
474
+ return {
475
+ score: totalScore,
476
+ matchReason: exactMatches.reason,
477
+ };
478
+ }
479
+ // Default to exact match
480
+ return {
481
+ score: exactMatches.score,
482
+ matchReason: exactMatches.reason,
483
+ };
484
+ }
485
+ /**
486
+ * Check if match type should be exclusive (no combining)
487
+ */
488
+ isExclusiveMatch(reason) {
489
+ return reason === 'Service match' || reason.startsWith('Search term match');
490
+ }
491
+ /**
492
+ * Check if match type can be combined with partial matches
493
+ */
494
+ isCombinableMatch(reason) {
495
+ const combinableReasons = [
496
+ 'Description match',
497
+ 'Full path match',
498
+ 'Path substring match',
499
+ 'Domain match',
500
+ 'Usage pattern match',
501
+ ];
502
+ return combinableReasons.includes(reason);
503
+ }
504
+ /**
505
+ * Process fallback matches when no exact match found
506
+ */
507
+ processFallbackMatches(endpoint, searchTermLower, partialMatches) {
508
+ const multiWordMatches = this.calculateMultiWordMatches(endpoint, searchTermLower);
509
+ if (multiWordMatches.score > partialMatches.score) {
510
+ return {
511
+ score: multiWordMatches.score,
512
+ matchReason: multiWordMatches.reason,
513
+ };
514
+ }
515
+ return {
516
+ score: partialMatches.score,
517
+ matchReason: partialMatches.reason || 'Low relevance match',
518
+ };
519
+ }
520
+ /**
521
+ * Calculate exact field matches with high scores
522
+ */
523
+ calculateExactMatches(endpoint, searchTermLower) {
524
+ // Check matches in priority order (not just highest score)
525
+ // Priority 1: Exact field matches (domain, service, exact path, exact description)
526
+ const exactMatch = this.checkExactFieldMatches(endpoint, searchTermLower);
527
+ if (exactMatch.score > 0) {
528
+ return exactMatch;
529
+ }
530
+ // Priority 2: Path and description substring matches (higher business value)
531
+ const pathMatch = this.checkPathSubstringMatch(endpoint, searchTermLower);
532
+ if (pathMatch.score > 0) {
533
+ return pathMatch;
534
+ }
535
+ const descSubstringMatch = this.checkDescriptionSubstringMatch(endpoint, searchTermLower);
536
+ if (descSubstringMatch.score > 0) {
537
+ return descSubstringMatch;
538
+ }
539
+ // Priority 3: Search terms and patterns
540
+ const termMatch = this.checkSearchTermsAndPatterns(endpoint, searchTermLower);
541
+ if (termMatch.score > 0) {
542
+ return termMatch;
543
+ }
544
+ // Priority 4: Other substring matches (domain, service)
545
+ const otherSubstringMatch = this.checkOtherSubstringMatches(endpoint, searchTermLower);
546
+ if (otherSubstringMatch.score > 0) {
547
+ return otherSubstringMatch;
548
+ }
549
+ return { score: 0, reason: '' };
550
+ }
551
+ /**
552
+ * Check for path substring matches
553
+ */
554
+ checkPathSubstringMatch(endpoint, searchTermLower) {
555
+ if (endpoint.fullPath &&
556
+ (endpoint.fullPath.toLowerCase().includes(searchTermLower) ||
557
+ searchTermLower.includes(endpoint.fullPath.toLowerCase()))) {
558
+ return { score: 0.9, reason: 'Path substring match' };
559
+ }
560
+ return { score: 0, reason: '' };
561
+ }
562
+ /**
563
+ * Check for description substring matches
564
+ */
565
+ checkDescriptionSubstringMatch(endpoint, searchTermLower) {
566
+ if (endpoint.description && endpoint.description.toLowerCase().includes(searchTermLower)) {
567
+ return { score: 0.65, reason: 'Description substring match' };
568
+ }
569
+ return { score: 0, reason: '' };
570
+ }
571
+ /**
572
+ * Check for other substring matches (domain, service)
573
+ */
574
+ checkOtherSubstringMatches(endpoint, searchTermLower) {
575
+ if (endpoint.domain && endpoint.domain.toLowerCase().includes(searchTermLower)) {
576
+ return { score: 0.5, reason: 'Domain match' };
577
+ }
578
+ if (endpoint.service && endpoint.service.toLowerCase().includes(searchTermLower)) {
579
+ return { score: 0.3, reason: 'Service match' };
580
+ }
581
+ return { score: 0, reason: '' };
582
+ }
583
+ /**
584
+ * Check for exact field matches
585
+ */
586
+ checkExactFieldMatches(endpoint, searchTermLower) {
587
+ if (endpoint.domain && endpoint.domain.toLowerCase() === searchTermLower) {
588
+ return { score: 0.6, reason: 'Domain match' };
589
+ }
590
+ if (endpoint.service && endpoint.service.toLowerCase() === searchTermLower) {
591
+ return { score: 0.3, reason: 'Service match' };
592
+ }
593
+ if (endpoint.fullPath && endpoint.fullPath.toLowerCase() === searchTermLower) {
594
+ return { score: 1.0, reason: 'Full path match' };
595
+ }
596
+ if (endpoint.description && endpoint.description.toLowerCase() === searchTermLower) {
597
+ return { score: 0.8, reason: 'Description match' };
598
+ }
599
+ return { score: 0, reason: '' };
600
+ }
601
+ /**
602
+ * Check search terms and common patterns
603
+ */
604
+ checkSearchTermsAndPatterns(endpoint, searchTermLower) {
605
+ if (Array.isArray(endpoint.searchTerms)) {
606
+ const searchTermMatches = endpoint.searchTerms.filter(term => term && typeof term === 'string' && term.toLowerCase().includes(searchTermLower));
607
+ if (searchTermMatches.length > 0) {
608
+ return { score: 0.7, reason: `Search term match: ${searchTermMatches[0]}` };
609
+ }
610
+ }
611
+ if (Array.isArray(endpoint.commonPatterns)) {
612
+ const patternMatches = endpoint.commonPatterns.filter(pattern => {
613
+ if (!pattern || typeof pattern !== 'string')
614
+ return false;
615
+ const patternLower = pattern.toLowerCase();
616
+ return patternLower.includes(searchTermLower);
617
+ });
618
+ if (patternMatches.length > 0) {
619
+ return { score: 0.5, reason: 'Usage pattern match' };
620
+ }
621
+ }
622
+ return { score: 0, reason: '' };
623
+ }
624
+ /**
625
+ * Calculate partial word matches with lower scores
626
+ */
627
+ calculatePartialMatches(endpoint, searchTermLower) {
628
+ const allText = this.buildSearchableText(endpoint);
629
+ const wordMatches = this.countWordMatches(searchTermLower, allText);
630
+ return this.buildPartialMatchResult(wordMatches, searchTermLower);
631
+ }
632
+ /**
633
+ * Build searchable text from endpoint fields
634
+ */
635
+ buildSearchableText(endpoint) {
636
+ const searchTerms = Array.isArray(endpoint.searchTerms) ? endpoint.searchTerms : [];
637
+ const commonPatterns = Array.isArray(endpoint.commonPatterns) ? endpoint.commonPatterns : [];
638
+ return [
639
+ endpoint.fullPath || '',
640
+ endpoint.description || '',
641
+ endpoint.domain || '',
642
+ endpoint.service || '',
643
+ ...searchTerms,
644
+ ...commonPatterns,
645
+ ]
646
+ .filter(text => typeof text === 'string')
647
+ .join(' ')
648
+ .toLowerCase();
649
+ }
650
+ /**
651
+ * Count matching words in text
652
+ */
653
+ countWordMatches(searchTermLower, allText) {
654
+ const searchWords = searchTermLower.split(/\s+/).filter(word => word.length > 0);
655
+ let wordMatches = 0;
656
+ for (const word of searchWords) {
657
+ if (word.length > 2 && allText.includes(word)) {
658
+ wordMatches++;
659
+ }
660
+ }
661
+ return wordMatches;
662
+ }
663
+ /**
664
+ * Build partial match result with score and reason
665
+ */
666
+ buildPartialMatchResult(wordMatches, searchTermLower) {
667
+ if (wordMatches > 0) {
668
+ const searchWords = searchTermLower.split(/\s+/).filter(word => word.length > 0);
669
+ const partialScore = (wordMatches / searchWords.length) * 0.2;
670
+ const reasonText = `Partial word match (${wordMatches}/${searchWords.length})`;
671
+ return {
672
+ score: partialScore,
673
+ reason: reasonText,
674
+ matchReason: reasonText,
675
+ };
676
+ }
677
+ return { score: 0, reason: '', matchReason: '' };
678
+ }
679
+ /**
680
+ * Calculate multi-word matches by finding the best match for each word
681
+ */
682
+ calculateMultiWordMatches(endpoint, searchTermLower) {
683
+ const searchWords = searchTermLower.split(/\s+/).filter(word => word.length > 0);
684
+ // If only one word, fall back to exact matching
685
+ if (searchWords.length <= 1) {
686
+ return { score: 0, reason: '' };
687
+ }
688
+ let bestScore = 0;
689
+ let bestReason = '';
690
+ const matchedWords = [];
691
+ // Check each word against the endpoint fields
692
+ for (const word of searchWords) {
693
+ const wordMatch = this.calculateExactMatches(endpoint, word);
694
+ if (wordMatch.score > 0) {
695
+ // Keep track of the highest scoring match
696
+ if (wordMatch.score > bestScore) {
697
+ bestScore = wordMatch.score;
698
+ bestReason = wordMatch.reason;
699
+ }
700
+ matchedWords.push(word);
701
+ }
702
+ }
703
+ // If we matched multiple words, boost the score
704
+ if (matchedWords.length > 1) {
705
+ // Base score is the best individual match, with bonus for additional matches
706
+ const bonusScore = Math.min((matchedWords.length - 1) * 0.1, 0.3);
707
+ const finalScore = Math.min(bestScore + bonusScore, 1.0);
708
+ return {
709
+ score: finalScore,
710
+ reason: `Multi-word match (${matchedWords.length}/${searchWords.length} words): ${bestReason}`,
711
+ };
712
+ }
713
+ // Single word match - return as-is
714
+ if (bestScore > 0) {
715
+ return {
716
+ score: bestScore,
717
+ reason: bestReason,
718
+ };
719
+ }
720
+ return { score: 0, reason: '' };
721
+ }
273
722
  }
274
723
  //# sourceMappingURL=client.js.map