@uptrademedia/site-kit 1.0.37 → 1.0.40

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 (72) hide show
  1. package/dist/api-BoW4FSlW.d.mts +671 -0
  2. package/dist/api-BoW4FSlW.d.ts +671 -0
  3. package/dist/{chunk-X66VOCWP.mjs → chunk-35Y3M4ZE.mjs} +6 -2
  4. package/dist/chunk-35Y3M4ZE.mjs.map +1 -0
  5. package/dist/{chunk-DRFTRTKV.js → chunk-5TTUNB63.js} +6 -2
  6. package/dist/chunk-5TTUNB63.js.map +1 -0
  7. package/dist/{chunk-KBS3KW2U.js → chunk-F6D3L676.js} +4 -4
  8. package/dist/{chunk-KBS3KW2U.js.map → chunk-F6D3L676.js.map} +1 -1
  9. package/dist/{chunk-Y4BW6XYJ.js → chunk-JRCYNWUZ.js} +6 -2
  10. package/dist/chunk-JRCYNWUZ.js.map +1 -0
  11. package/dist/chunk-K4B34K4J.mjs +306 -0
  12. package/dist/chunk-K4B34K4J.mjs.map +1 -0
  13. package/dist/{chunk-EWXFDSZP.js → chunk-MVNUEXP3.js} +7 -6
  14. package/dist/chunk-MVNUEXP3.js.map +1 -0
  15. package/dist/{chunk-6ONUXZDO.mjs → chunk-QT73LSTP.mjs} +19 -4
  16. package/dist/chunk-QT73LSTP.mjs.map +1 -0
  17. package/dist/{chunk-35ZB446O.mjs → chunk-SONJCT7Z.mjs} +7 -6
  18. package/dist/chunk-SONJCT7Z.mjs.map +1 -0
  19. package/dist/{chunk-CG53ASWX.mjs → chunk-SVSZVPP6.mjs} +36 -238
  20. package/dist/chunk-SVSZVPP6.mjs.map +1 -0
  21. package/dist/{chunk-EL5QTAA3.mjs → chunk-TEYPRKYU.mjs} +6 -2
  22. package/dist/chunk-TEYPRKYU.mjs.map +1 -0
  23. package/dist/{chunk-IT6R5VAZ.mjs → chunk-WZMRFNJK.mjs} +4 -4
  24. package/dist/{chunk-IT6R5VAZ.mjs.map → chunk-WZMRFNJK.mjs.map} +1 -1
  25. package/dist/chunk-XXAO5WVO.js +316 -0
  26. package/dist/chunk-XXAO5WVO.js.map +1 -0
  27. package/dist/{chunk-S2GXR5HY.js → chunk-ZG2AGGPZ.js} +19 -4
  28. package/dist/chunk-ZG2AGGPZ.js.map +1 -0
  29. package/dist/{chunk-VOR53RUR.js → chunk-ZVIOI47K.js} +35 -244
  30. package/dist/chunk-ZVIOI47K.js.map +1 -0
  31. package/dist/cli/index.js +3 -3
  32. package/dist/cli/index.mjs +1 -1
  33. package/dist/commerce/index.js +40 -40
  34. package/dist/commerce/index.mjs +1 -1
  35. package/dist/{generators-TYPILCWD.mjs → generators-H6YQQRR4.mjs} +3 -3
  36. package/dist/{generators-TYPILCWD.mjs.map → generators-H6YQQRR4.mjs.map} +1 -1
  37. package/dist/{generators-5EU4PTVF.js → generators-HZZLGIUB.js} +9 -9
  38. package/dist/{generators-5EU4PTVF.js.map → generators-HZZLGIUB.js.map} +1 -1
  39. package/dist/index.d.mts +1 -1
  40. package/dist/index.d.ts +1 -1
  41. package/dist/index.js +73 -72
  42. package/dist/index.js.map +1 -1
  43. package/dist/index.mjs +4 -3
  44. package/dist/index.mjs.map +1 -1
  45. package/dist/llms/index.d.mts +24 -649
  46. package/dist/llms/index.d.ts +24 -649
  47. package/dist/llms/index.js +34 -25
  48. package/dist/llms/index.mjs +2 -1
  49. package/dist/seo/register-sitemap-cli.mjs +0 -0
  50. package/dist/setup/client.js +7 -7
  51. package/dist/setup/client.mjs +2 -2
  52. package/dist/setup/index.js +9 -9
  53. package/dist/setup/index.mjs +3 -3
  54. package/dist/setup/server.js +2 -2
  55. package/dist/setup/server.mjs +1 -1
  56. package/dist/sitemap/index.d.mts +14 -2
  57. package/dist/sitemap/index.d.ts +14 -2
  58. package/dist/sitemap/index.js +30 -5
  59. package/dist/sitemap/index.js.map +1 -1
  60. package/dist/sitemap/index.mjs +30 -5
  61. package/dist/sitemap/index.mjs.map +1 -1
  62. package/package.json +9 -9
  63. package/dist/chunk-35ZB446O.mjs.map +0 -1
  64. package/dist/chunk-6ONUXZDO.mjs.map +0 -1
  65. package/dist/chunk-CG53ASWX.mjs.map +0 -1
  66. package/dist/chunk-DRFTRTKV.js.map +0 -1
  67. package/dist/chunk-EL5QTAA3.mjs.map +0 -1
  68. package/dist/chunk-EWXFDSZP.js.map +0 -1
  69. package/dist/chunk-S2GXR5HY.js.map +0 -1
  70. package/dist/chunk-VOR53RUR.js.map +0 -1
  71. package/dist/chunk-X66VOCWP.mjs.map +0 -1
  72. package/dist/chunk-Y4BW6XYJ.js.map +0 -1
@@ -1,101 +1,110 @@
1
1
  'use strict';
2
2
 
3
- var chunkVOR53RUR_js = require('../chunk-VOR53RUR.js');
3
+ var chunkZVIOI47K_js = require('../chunk-ZVIOI47K.js');
4
+ var chunkXXAO5WVO_js = require('../chunk-XXAO5WVO.js');
4
5
  require('../chunk-ZSMWDLMK.js');
5
6
 
6
7
 
7
8
 
8
9
  Object.defineProperty(exports, "AEOBlock", {
9
10
  enumerable: true,
10
- get: function () { return chunkVOR53RUR_js.AEOBlock; }
11
+ get: function () { return chunkZVIOI47K_js.AEOBlock; }
11
12
  });
12
13
  Object.defineProperty(exports, "AEOCitedContent", {
13
14
  enumerable: true,
14
- get: function () { return chunkVOR53RUR_js.AEOCitedContent; }
15
+ get: function () { return chunkZVIOI47K_js.AEOCitedContent; }
15
16
  });
16
17
  Object.defineProperty(exports, "AEOClaim", {
17
18
  enumerable: true,
18
- get: function () { return chunkVOR53RUR_js.AEOClaim; }
19
+ get: function () { return chunkZVIOI47K_js.AEOClaim; }
19
20
  });
20
21
  Object.defineProperty(exports, "AEOComparison", {
21
22
  enumerable: true,
22
- get: function () { return chunkVOR53RUR_js.AEOComparison; }
23
+ get: function () { return chunkZVIOI47K_js.AEOComparison; }
23
24
  });
24
25
  Object.defineProperty(exports, "AEODefinition", {
25
26
  enumerable: true,
26
- get: function () { return chunkVOR53RUR_js.AEODefinition; }
27
+ get: function () { return chunkZVIOI47K_js.AEODefinition; }
27
28
  });
28
29
  Object.defineProperty(exports, "AEOEntity", {
29
30
  enumerable: true,
30
- get: function () { return chunkVOR53RUR_js.AEOEntity; }
31
+ get: function () { return chunkZVIOI47K_js.AEOEntity; }
31
32
  });
32
33
  Object.defineProperty(exports, "AEOProvenanceList", {
33
34
  enumerable: true,
34
- get: function () { return chunkVOR53RUR_js.AEOProvenanceList; }
35
+ get: function () { return chunkZVIOI47K_js.AEOProvenanceList; }
35
36
  });
36
37
  Object.defineProperty(exports, "AEOStep", {
37
38
  enumerable: true,
38
- get: function () { return chunkVOR53RUR_js.AEOStep; }
39
+ get: function () { return chunkZVIOI47K_js.AEOStep; }
39
40
  });
40
41
  Object.defineProperty(exports, "AEOSteps", {
41
42
  enumerable: true,
42
- get: function () { return chunkVOR53RUR_js.AEOSteps; }
43
+ get: function () { return chunkZVIOI47K_js.AEOSteps; }
43
44
  });
44
45
  Object.defineProperty(exports, "AEOSummary", {
45
46
  enumerable: true,
46
- get: function () { return chunkVOR53RUR_js.AEOSummary; }
47
+ get: function () { return chunkZVIOI47K_js.AEOSummary; }
47
48
  });
48
49
  Object.defineProperty(exports, "DEFAULT_SPEAKABLE_SELECTORS", {
49
50
  enumerable: true,
50
- get: function () { return chunkVOR53RUR_js.DEFAULT_SPEAKABLE_SELECTORS; }
51
+ get: function () { return chunkZVIOI47K_js.DEFAULT_SPEAKABLE_SELECTORS; }
51
52
  });
52
53
  Object.defineProperty(exports, "SpeakableSchema", {
53
54
  enumerable: true,
54
- get: function () { return chunkVOR53RUR_js.SpeakableSchema; }
55
+ get: function () { return chunkZVIOI47K_js.SpeakableSchema; }
55
56
  });
56
57
  Object.defineProperty(exports, "createLLMsFullTxtHandler", {
57
58
  enumerable: true,
58
- get: function () { return chunkVOR53RUR_js.createLLMsFullTxtHandler; }
59
+ get: function () { return chunkZVIOI47K_js.createLLMsFullTxtHandler; }
59
60
  });
60
61
  Object.defineProperty(exports, "createLLMsTxtHandler", {
61
62
  enumerable: true,
62
- get: function () { return chunkVOR53RUR_js.createLLMsTxtHandler; }
63
+ get: function () { return chunkZVIOI47K_js.createLLMsTxtHandler; }
63
64
  });
64
65
  Object.defineProperty(exports, "createSpeakableSchema", {
65
66
  enumerable: true,
66
- get: function () { return chunkVOR53RUR_js.createSpeakableSchema; }
67
+ get: function () { return chunkZVIOI47K_js.createSpeakableSchema; }
68
+ });
69
+ Object.defineProperty(exports, "getSpeakableSelectorsForPage", {
70
+ enumerable: true,
71
+ get: function () { return chunkZVIOI47K_js.getSpeakableSelectorsForPage; }
67
72
  });
68
73
  Object.defineProperty(exports, "generateLLMsFullTxt", {
69
74
  enumerable: true,
70
- get: function () { return chunkVOR53RUR_js.generateLLMsFullTxt; }
75
+ get: function () { return chunkXXAO5WVO_js.generateLLMsFullTxt; }
71
76
  });
72
77
  Object.defineProperty(exports, "generateLLMsTxt", {
73
78
  enumerable: true,
74
- get: function () { return chunkVOR53RUR_js.generateLLMsTxt; }
79
+ get: function () { return chunkXXAO5WVO_js.generateLLMsTxt; }
75
80
  });
76
81
  Object.defineProperty(exports, "getBusinessInfo", {
77
82
  enumerable: true,
78
- get: function () { return chunkVOR53RUR_js.getBusinessInfo; }
83
+ get: function () { return chunkXXAO5WVO_js.getBusinessInfo; }
79
84
  });
80
85
  Object.defineProperty(exports, "getFAQItems", {
81
86
  enumerable: true,
82
- get: function () { return chunkVOR53RUR_js.getFAQItems; }
87
+ get: function () { return chunkXXAO5WVO_js.getFAQItems; }
83
88
  });
84
89
  Object.defineProperty(exports, "getLLMsData", {
85
90
  enumerable: true,
86
- get: function () { return chunkVOR53RUR_js.getLLMsData; }
91
+ get: function () { return chunkXXAO5WVO_js.getLLMsData; }
92
+ });
93
+ Object.defineProperty(exports, "getOptimizedLLMsTxt", {
94
+ enumerable: true,
95
+ get: function () { return chunkXXAO5WVO_js.getOptimizedLLMsTxt; }
87
96
  });
88
97
  Object.defineProperty(exports, "getPageSummaries", {
89
98
  enumerable: true,
90
- get: function () { return chunkVOR53RUR_js.getPageSummaries; }
99
+ get: function () { return chunkXXAO5WVO_js.getPageSummaries; }
91
100
  });
92
101
  Object.defineProperty(exports, "getServices", {
93
102
  enumerable: true,
94
- get: function () { return chunkVOR53RUR_js.getServices; }
103
+ get: function () { return chunkXXAO5WVO_js.getServices; }
95
104
  });
96
- Object.defineProperty(exports, "getSpeakableSelectorsForPage", {
105
+ Object.defineProperty(exports, "writeLLMsTxtToPublic", {
97
106
  enumerable: true,
98
- get: function () { return chunkVOR53RUR_js.getSpeakableSelectorsForPage; }
107
+ get: function () { return chunkXXAO5WVO_js.writeLLMsTxtToPublic; }
99
108
  });
100
109
  //# sourceMappingURL=index.js.map
101
110
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,5 @@
1
- export { AEOBlock, AEOCitedContent, AEOClaim, AEOComparison, AEODefinition, AEOEntity, AEOProvenanceList, AEOStep, AEOSteps, AEOSummary, DEFAULT_SPEAKABLE_SELECTORS, SpeakableSchema, createLLMsFullTxtHandler, createLLMsTxtHandler, createSpeakableSchema, generateLLMsFullTxt, generateLLMsTxt, getBusinessInfo, getFAQItems, getLLMsData, getPageSummaries, getServices, getSpeakableSelectorsForPage } from '../chunk-CG53ASWX.mjs';
1
+ export { AEOBlock, AEOCitedContent, AEOClaim, AEOComparison, AEODefinition, AEOEntity, AEOProvenanceList, AEOStep, AEOSteps, AEOSummary, DEFAULT_SPEAKABLE_SELECTORS, SpeakableSchema, createLLMsFullTxtHandler, createLLMsTxtHandler, createSpeakableSchema, getSpeakableSelectorsForPage } from '../chunk-SVSZVPP6.mjs';
2
+ export { generateLLMsFullTxt, generateLLMsTxt, getBusinessInfo, getFAQItems, getLLMsData, getOptimizedLLMsTxt, getPageSummaries, getServices, writeLLMsTxtToPublic } from '../chunk-K4B34K4J.mjs';
2
3
  import '../chunk-4XPGGLVP.mjs';
3
4
  //# sourceMappingURL=index.mjs.map
4
5
  //# sourceMappingURL=index.mjs.map
File without changes
@@ -1,31 +1,31 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkDRFTRTKV_js = require('../chunk-DRFTRTKV.js');
5
- var chunkY4BW6XYJ_js = require('../chunk-Y4BW6XYJ.js');
4
+ var chunk5TTUNB63_js = require('../chunk-5TTUNB63.js');
5
+ var chunkJRCYNWUZ_js = require('../chunk-JRCYNWUZ.js');
6
6
  require('../chunk-ZSMWDLMK.js');
7
7
 
8
8
 
9
9
 
10
10
  Object.defineProperty(exports, "IntegrationCodeView", {
11
11
  enumerable: true,
12
- get: function () { return chunkDRFTRTKV_js.IntegrationCodeView; }
12
+ get: function () { return chunk5TTUNB63_js.IntegrationCodeView; }
13
13
  });
14
14
  Object.defineProperty(exports, "generateIntegrationCode", {
15
15
  enumerable: true,
16
- get: function () { return chunkDRFTRTKV_js.generateIntegrationCode; }
16
+ get: function () { return chunk5TTUNB63_js.generateIntegrationCode; }
17
17
  });
18
18
  Object.defineProperty(exports, "getSnippetsByModule", {
19
19
  enumerable: true,
20
- get: function () { return chunkDRFTRTKV_js.getSnippetsByModule; }
20
+ get: function () { return chunk5TTUNB63_js.getSnippetsByModule; }
21
21
  });
22
22
  Object.defineProperty(exports, "SetupWizard", {
23
23
  enumerable: true,
24
- get: function () { return chunkY4BW6XYJ_js.SetupWizard; }
24
+ get: function () { return chunkJRCYNWUZ_js.SetupWizard; }
25
25
  });
26
26
  Object.defineProperty(exports, "UptradeSetup", {
27
27
  enumerable: true,
28
- get: function () { return chunkY4BW6XYJ_js.SetupWizard; }
28
+ get: function () { return chunkJRCYNWUZ_js.SetupWizard; }
29
29
  });
30
30
  //# sourceMappingURL=client.js.map
31
31
  //# sourceMappingURL=client.js.map
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- export { IntegrationCodeView, generateIntegrationCode, getSnippetsByModule } from '../chunk-EL5QTAA3.mjs';
3
- export { SetupWizard, SetupWizard as UptradeSetup } from '../chunk-X66VOCWP.mjs';
2
+ export { IntegrationCodeView, generateIntegrationCode, getSnippetsByModule } from '../chunk-TEYPRKYU.mjs';
3
+ export { SetupWizard, SetupWizard as UptradeSetup } from '../chunk-35Y3M4ZE.mjs';
4
4
  import '../chunk-4XPGGLVP.mjs';
5
5
  //# sourceMappingURL=client.mjs.map
6
6
  //# sourceMappingURL=client.mjs.map
@@ -1,35 +1,35 @@
1
1
  'use strict';
2
2
 
3
- var chunkDRFTRTKV_js = require('../chunk-DRFTRTKV.js');
4
- var chunkKBS3KW2U_js = require('../chunk-KBS3KW2U.js');
5
- var chunkY4BW6XYJ_js = require('../chunk-Y4BW6XYJ.js');
3
+ var chunk5TTUNB63_js = require('../chunk-5TTUNB63.js');
4
+ var chunkF6D3L676_js = require('../chunk-F6D3L676.js');
5
+ var chunkJRCYNWUZ_js = require('../chunk-JRCYNWUZ.js');
6
6
  require('../chunk-ZSMWDLMK.js');
7
7
 
8
8
 
9
9
 
10
10
  Object.defineProperty(exports, "IntegrationCodeView", {
11
11
  enumerable: true,
12
- get: function () { return chunkDRFTRTKV_js.IntegrationCodeView; }
12
+ get: function () { return chunk5TTUNB63_js.IntegrationCodeView; }
13
13
  });
14
14
  Object.defineProperty(exports, "generateIntegrationCode", {
15
15
  enumerable: true,
16
- get: function () { return chunkDRFTRTKV_js.generateIntegrationCode; }
16
+ get: function () { return chunk5TTUNB63_js.generateIntegrationCode; }
17
17
  });
18
18
  Object.defineProperty(exports, "getSnippetsByModule", {
19
19
  enumerable: true,
20
- get: function () { return chunkDRFTRTKV_js.getSnippetsByModule; }
20
+ get: function () { return chunk5TTUNB63_js.getSnippetsByModule; }
21
21
  });
22
22
  Object.defineProperty(exports, "handleRequest", {
23
23
  enumerable: true,
24
- get: function () { return chunkKBS3KW2U_js.handleRequest; }
24
+ get: function () { return chunkF6D3L676_js.handleRequest; }
25
25
  });
26
26
  Object.defineProperty(exports, "SetupWizard", {
27
27
  enumerable: true,
28
- get: function () { return chunkY4BW6XYJ_js.SetupWizard; }
28
+ get: function () { return chunkJRCYNWUZ_js.SetupWizard; }
29
29
  });
30
30
  Object.defineProperty(exports, "UptradeSetup", {
31
31
  enumerable: true,
32
- get: function () { return chunkY4BW6XYJ_js.SetupWizard; }
32
+ get: function () { return chunkJRCYNWUZ_js.SetupWizard; }
33
33
  });
34
34
  //# sourceMappingURL=index.js.map
35
35
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,6 @@
1
- export { IntegrationCodeView, generateIntegrationCode, getSnippetsByModule } from '../chunk-EL5QTAA3.mjs';
2
- export { handleRequest } from '../chunk-IT6R5VAZ.mjs';
3
- export { SetupWizard, SetupWizard as UptradeSetup } from '../chunk-X66VOCWP.mjs';
1
+ export { IntegrationCodeView, generateIntegrationCode, getSnippetsByModule } from '../chunk-TEYPRKYU.mjs';
2
+ export { handleRequest } from '../chunk-WZMRFNJK.mjs';
3
+ export { SetupWizard, SetupWizard as UptradeSetup } from '../chunk-35Y3M4ZE.mjs';
4
4
  import '../chunk-4XPGGLVP.mjs';
5
5
  //# sourceMappingURL=index.mjs.map
6
6
  //# sourceMappingURL=index.mjs.map
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var chunkKBS3KW2U_js = require('../chunk-KBS3KW2U.js');
3
+ var chunkF6D3L676_js = require('../chunk-F6D3L676.js');
4
4
  require('../chunk-ZSMWDLMK.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "handleRequest", {
9
9
  enumerable: true,
10
- get: function () { return chunkKBS3KW2U_js.handleRequest; }
10
+ get: function () { return chunkF6D3L676_js.handleRequest; }
11
11
  });
12
12
  //# sourceMappingURL=server.js.map
13
13
  //# sourceMappingURL=server.js.map
@@ -1,4 +1,4 @@
1
- export { handleRequest } from '../chunk-IT6R5VAZ.mjs';
1
+ export { handleRequest } from '../chunk-WZMRFNJK.mjs';
2
2
  import '../chunk-4XPGGLVP.mjs';
3
3
  //# sourceMappingURL=server.mjs.map
4
4
  //# sourceMappingURL=server.mjs.map
@@ -49,12 +49,24 @@ interface SitemapConfig {
49
49
  apiKey?: string;
50
50
  /** Disable auto-sync to Portal API */
51
51
  disableSync?: boolean;
52
+ /** When true, await meta optimization before build completes (for build-time llms.txt with managed_llm_schema) */
53
+ awaitMetaOptimization?: boolean;
54
+ /** When true, write AI-optimized llms.txt to public/llms.txt after sitemap sync */
55
+ optimizedLLMsTxt?: boolean;
56
+ /** When true with optimizedLLMsTxt, also write public/llms-full.txt */
57
+ optimizedLLMsFullTxt?: boolean;
58
+ }
59
+ interface SyncSitemapOptions {
60
+ /** Trigger Signal AI meta optimization after sync */
61
+ optimizeMeta?: boolean;
62
+ /** When true, wait for meta optimization to complete (for build-time llms.txt) */
63
+ awaitMeta?: boolean;
52
64
  }
53
65
  /**
54
66
  * Sync sitemap entries to Portal API
55
67
  * Called automatically by createSitemap at build time
56
68
  */
57
- declare function syncSitemapToPortal(entries: SitemapEntry[], apiUrl: string, apiKey: string): Promise<{
69
+ declare function syncSitemapToPortal(entries: SitemapEntry[], apiUrl: string, apiKey: string, options?: SyncSitemapOptions): Promise<{
58
70
  success: boolean;
59
71
  created: number;
60
72
  updated: number;
@@ -75,4 +87,4 @@ declare function syncSitemapToPortal(entries: SitemapEntry[], apiUrl: string, ap
75
87
  */
76
88
  declare function createSitemap(config: SitemapConfig): () => SitemapEntry[] | Promise<SitemapEntry[]>;
77
89
 
78
- export { type SitemapConfig, type SitemapEntry, createSitemap, createSitemap as default, syncSitemapToPortal };
90
+ export { type SitemapConfig, type SitemapEntry, type SyncSitemapOptions, createSitemap, createSitemap as default, syncSitemapToPortal };
@@ -49,12 +49,24 @@ interface SitemapConfig {
49
49
  apiKey?: string;
50
50
  /** Disable auto-sync to Portal API */
51
51
  disableSync?: boolean;
52
+ /** When true, await meta optimization before build completes (for build-time llms.txt with managed_llm_schema) */
53
+ awaitMetaOptimization?: boolean;
54
+ /** When true, write AI-optimized llms.txt to public/llms.txt after sitemap sync */
55
+ optimizedLLMsTxt?: boolean;
56
+ /** When true with optimizedLLMsTxt, also write public/llms-full.txt */
57
+ optimizedLLMsFullTxt?: boolean;
58
+ }
59
+ interface SyncSitemapOptions {
60
+ /** Trigger Signal AI meta optimization after sync */
61
+ optimizeMeta?: boolean;
62
+ /** When true, wait for meta optimization to complete (for build-time llms.txt) */
63
+ awaitMeta?: boolean;
52
64
  }
53
65
  /**
54
66
  * Sync sitemap entries to Portal API
55
67
  * Called automatically by createSitemap at build time
56
68
  */
57
- declare function syncSitemapToPortal(entries: SitemapEntry[], apiUrl: string, apiKey: string): Promise<{
69
+ declare function syncSitemapToPortal(entries: SitemapEntry[], apiUrl: string, apiKey: string, options?: SyncSitemapOptions): Promise<{
58
70
  success: boolean;
59
71
  created: number;
60
72
  updated: number;
@@ -75,4 +87,4 @@ declare function syncSitemapToPortal(entries: SitemapEntry[], apiUrl: string, ap
75
87
  */
76
88
  declare function createSitemap(config: SitemapConfig): () => SitemapEntry[] | Promise<SitemapEntry[]>;
77
89
 
78
- export { type SitemapConfig, type SitemapEntry, createSitemap, createSitemap as default, syncSitemapToPortal };
90
+ export { type SitemapConfig, type SitemapEntry, type SyncSitemapOptions, createSitemap, createSitemap as default, syncSitemapToPortal };
@@ -2,6 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
+ var chunkXXAO5WVO_js = require('../chunk-XXAO5WVO.js');
5
6
  require('../chunk-ZSMWDLMK.js');
6
7
  var fs = require('fs');
7
8
  var path = require('path');
@@ -96,7 +97,7 @@ function getPriority(path, config) {
96
97
  if (depth === 2) return 0.6;
97
98
  return config.defaultPriority ?? 0.5;
98
99
  }
99
- async function syncSitemapToPortal(entries, apiUrl, apiKey) {
100
+ async function syncSitemapToPortal(entries, apiUrl, apiKey, options) {
100
101
  if (!apiKey) {
101
102
  console.warn("[site-kit] No API key provided, skipping sitemap sync");
102
103
  return { success: false, created: 0, updated: 0 };
@@ -116,13 +117,16 @@ async function syncSitemapToPortal(entries, apiUrl, apiKey) {
116
117
  };
117
118
  });
118
119
  try {
120
+ const body = { entries: normalizedEntries };
121
+ if (options?.optimizeMeta !== void 0) body.optimize_meta = options.optimizeMeta;
122
+ if (options?.awaitMeta !== void 0) body.await_meta = options.awaitMeta;
119
123
  const response = await fetch(`${apiUrl}/api/public/seo/register-sitemap`, {
120
124
  method: "POST",
121
125
  headers: {
122
126
  "Content-Type": "application/json",
123
127
  "x-api-key": apiKey
124
128
  },
125
- body: JSON.stringify({ entries: normalizedEntries })
129
+ body: JSON.stringify(body)
126
130
  });
127
131
  if (!response.ok) {
128
132
  console.error("[site-kit] Sitemap sync failed:", response.status, await response.text());
@@ -189,13 +193,34 @@ function createSitemap(config) {
189
193
  const apiUrl = config.apiUrl || process.env.NEXT_PUBLIC_UPTRADE_API_URL || "https://api.uptrademedia.com";
190
194
  const apiKey = config.apiKey || process.env.UPTRADE_API_KEY || process.env.NEXT_PUBLIC_UPTRADE_API_KEY;
191
195
  if (apiKey) {
192
- syncSitemapToPortal(entries, apiUrl, apiKey).then((result) => {
196
+ try {
197
+ const syncOptions = {};
198
+ if (config.awaitMetaOptimization) {
199
+ syncOptions.optimizeMeta = true;
200
+ syncOptions.awaitMeta = true;
201
+ }
202
+ const result = await syncSitemapToPortal(entries, apiUrl, apiKey, syncOptions);
193
203
  if (result.success) {
194
204
  console.log(`[site-kit] Synced to Portal API: ${result.created} created, ${result.updated} updated`);
195
205
  }
196
- }).catch((err) => {
206
+ if (config.optimizedLLMsTxt) {
207
+ try {
208
+ const writeResult = await chunkXXAO5WVO_js.writeLLMsTxtToPublic({
209
+ apiUrl,
210
+ apiKey,
211
+ full: config.optimizedLLMsFullTxt ?? false,
212
+ fallbackToLocal: true
213
+ });
214
+ if (writeResult.success) {
215
+ console.log(`[site-kit] Wrote llms.txt (optimized=${writeResult.optimized})`);
216
+ }
217
+ } catch (err) {
218
+ console.warn("[site-kit] Failed to write llms.txt:", err.message);
219
+ }
220
+ }
221
+ } catch (err) {
197
222
  console.warn("[site-kit] Failed to sync sitemap to Portal API:", err.message);
198
- });
223
+ }
199
224
  } else {
200
225
  console.log("[site-kit] No API key found, skipping Portal API sync");
201
226
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/sitemap/index.ts"],"names":["join","existsSync","readdirSync","statSync"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @uptrade/site-kit - Sitemap Generator\n * \n * Automatically generates sitemap.xml from Next.js app directory structure.\n * Works at build time to discover all pages and sync them to Portal API.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com',\n * // Optional: exclude patterns\n * exclude: ['/admin/*', '/api/*'],\n * // Optional: additional dynamic routes\n * additionalPaths: async () => [\n * { path: '/blog/post-1', priority: 0.7 },\n * ]\n * })\n * ```\n */\n\nimport { readdirSync, statSync, existsSync } from 'fs'\nimport { join, relative } from 'path'\n\nexport interface SitemapEntry {\n url: string\n lastModified?: Date | string\n changeFrequency?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n priority?: number\n}\n\nexport interface SitemapConfig {\n /** Base URL for the site (required) */\n baseUrl: string\n /** Glob patterns to exclude (e.g., ['/admin/*', '/api/*']) */\n exclude?: string[]\n /** Default priority for pages */\n defaultPriority?: number\n /** Default change frequency */\n defaultChangeFrequency?: SitemapEntry['changeFrequency']\n /** Additional paths to include (for dynamic routes) */\n additionalPaths?: () => Promise<Array<{ path: string; priority?: number; changeFrequency?: SitemapEntry['changeFrequency'] }>>\n /** Priority overrides by path pattern */\n priorities?: Record<string, number>\n /** Portal API URL for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_URL or https://api.uptrademedia.com) */\n apiUrl?: string\n /** Portal API key for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_KEY) */\n apiKey?: string\n /** Disable auto-sync to Portal API */\n disableSync?: boolean\n}\n\n// Route groups and special folders to ignore\nconst IGNORED_FOLDERS = [\n 'api',\n 'admin',\n '_uptrade',\n '%5Fuptrade', // URL-encoded _uptrade\n 'uptrade-setup',\n 'offline',\n]\n\n// File patterns that indicate a page\nconst PAGE_FILES = ['page.tsx', 'page.jsx', 'page.js', 'page.ts']\n\n/**\n * Check if a path matches any exclude pattern\n */\nfunction isExcluded(path: string, patterns: string[]): boolean {\n return patterns.some(pattern => {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n return path.startsWith(prefix)\n }\n if (pattern.endsWith('*')) {\n const prefix = pattern.slice(0, -1)\n return path.startsWith(prefix)\n }\n return path === pattern\n })\n}\n\n/**\n * Recursively discover pages from the app directory\n */\nfunction discoverPages(\n appDir: string,\n currentPath: string = '',\n pages: string[] = []\n): string[] {\n const fullPath = join(appDir, currentPath)\n \n if (!existsSync(fullPath)) {\n return pages\n }\n\n const entries = readdirSync(fullPath)\n \n // Check if this directory has a page file\n const hasPage = entries.some(entry => PAGE_FILES.includes(entry))\n \n if (hasPage) {\n // Convert directory path to URL path\n let urlPath = '/' + currentPath\n \n // Handle route groups (parentheses) - remove them from URL\n urlPath = urlPath.replace(/\\/\\([^)]+\\)/g, '')\n \n // Clean up path\n urlPath = urlPath.replace(/\\/+/g, '/') // Remove double slashes\n if (urlPath !== '/' && urlPath.endsWith('/')) {\n urlPath = urlPath.slice(0, -1) // Remove trailing slash\n }\n \n pages.push(urlPath)\n }\n \n // Recurse into subdirectories\n for (const entry of entries) {\n const entryPath = join(fullPath, entry)\n const stat = statSync(entryPath)\n \n if (stat.isDirectory()) {\n // Skip ignored folders\n const folderName = entry.toLowerCase()\n if (IGNORED_FOLDERS.some(ignored => folderName.includes(ignored))) {\n continue\n }\n \n // Skip dynamic route segments for now (would need runtime data)\n if (entry.startsWith('[') && entry.endsWith(']')) {\n continue\n }\n \n // Skip private folders\n if (entry.startsWith('_')) {\n continue\n }\n \n discoverPages(appDir, join(currentPath, entry), pages)\n }\n }\n \n return pages\n}\n\n/**\n * Find the app directory from the current working directory\n */\nfunction findAppDir(): string {\n const cwd = process.cwd()\n \n // Try common locations\n const candidates = [\n join(cwd, 'app'),\n join(cwd, 'src', 'app'),\n ]\n \n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate\n }\n }\n \n throw new Error(\n '[site-kit] Could not find app directory. Ensure you have an \"app\" or \"src/app\" folder.'\n )\n}\n\n/**\n * Get priority for a path based on config\n */\nfunction getPriority(path: string, config: SitemapConfig): number {\n // Check priority overrides\n if (config.priorities) {\n for (const [pattern, priority] of Object.entries(config.priorities)) {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n if (path.startsWith(prefix)) return priority\n } else if (path === pattern) {\n return priority\n }\n }\n }\n \n // Home page gets highest priority\n if (path === '/') return 1.0\n \n // Shallow pages get higher priority\n const depth = path.split('/').filter(Boolean).length\n if (depth === 1) return 0.8\n if (depth === 2) return 0.6\n \n return config.defaultPriority ?? 0.5\n}\n\n/**\n * Sync sitemap entries to Portal API\n * Called automatically by createSitemap at build time\n */\nexport async function syncSitemapToPortal(\n entries: SitemapEntry[],\n apiUrl: string,\n apiKey: string\n): Promise<{ success: boolean; created: number; updated: number }> {\n if (!apiKey) {\n console.warn('[site-kit] No API key provided, skipping sitemap sync')\n return { success: false, created: 0, updated: 0 }\n }\n \n const normalizedEntries = entries.map(entry => {\n let path: string\n try {\n const url = new URL(entry.url)\n path = url.pathname\n } catch {\n path = entry.url.startsWith('/') ? entry.url : `/${entry.url}`\n }\n \n return {\n path,\n priority: entry.priority,\n changefreq: entry.changeFrequency,\n }\n })\n \n try {\n const response = await fetch(`${apiUrl}/api/public/seo/register-sitemap`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ entries: normalizedEntries }),\n })\n \n if (!response.ok) {\n console.error('[site-kit] Sitemap sync failed:', response.status, await response.text())\n return { success: false, created: 0, updated: 0 }\n }\n \n const result = await response.json()\n \n return {\n success: true,\n created: result.created || 0,\n updated: result.updated || 0,\n }\n } catch (error) {\n console.error('[site-kit] Sitemap sync error:', error)\n return { success: false, created: 0, updated: 0 }\n }\n}\n\n/**\n * Create a sitemap generator function for Next.js\n * Automatically syncs to Portal API at build time.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com'\n * })\n * ```\n */\nexport function createSitemap(config: SitemapConfig): () => SitemapEntry[] | Promise<SitemapEntry[]> {\n return async () => {\n const { baseUrl, exclude = [], defaultChangeFrequency = 'weekly' } = config\n \n // Normalize base URL\n const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl\n \n // Default exclusions\n const allExclusions = [\n '/api/*',\n '/admin/*',\n '/_uptrade/*',\n '/uptrade-setup/*',\n '/offline/*',\n ...exclude,\n ]\n \n // Discover pages from app directory\n let pages: string[] = []\n try {\n const appDir = findAppDir()\n pages = discoverPages(appDir)\n } catch (error) {\n console.warn('[site-kit] Failed to discover pages:', error)\n // Fall back to just the home page\n pages = ['/']\n }\n \n // Filter out excluded pages\n pages = pages.filter(page => !isExcluded(page, allExclusions))\n \n // Build sitemap entries\n const entries: SitemapEntry[] = pages.map(path => ({\n url: `${normalizedBaseUrl}${path}`,\n lastModified: new Date(),\n changeFrequency: defaultChangeFrequency,\n priority: getPriority(path, config),\n }))\n \n // Add additional dynamic paths if provided\n if (config.additionalPaths) {\n try {\n const additional = await config.additionalPaths()\n for (const item of additional) {\n if (!isExcluded(item.path, allExclusions)) {\n entries.push({\n url: `${normalizedBaseUrl}${item.path}`,\n lastModified: new Date(),\n changeFrequency: item.changeFrequency ?? defaultChangeFrequency,\n priority: item.priority ?? getPriority(item.path, config),\n })\n }\n }\n } catch (error) {\n console.warn('[site-kit] Failed to get additional paths:', error)\n }\n }\n \n // Sort by priority descending\n entries.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n \n console.log(`[site-kit] Generated sitemap with ${entries.length} pages`)\n \n // Auto-sync to Portal API at build time (unless disabled)\n if (!config.disableSync) {\n const apiUrl = config.apiUrl || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.uptrademedia.com'\n // Server-side operations use UPTRADE_API_KEY, not NEXT_PUBLIC_\n const apiKey = config.apiKey || process.env.UPTRADE_API_KEY || process.env.NEXT_PUBLIC_UPTRADE_API_KEY\n \n if (apiKey) {\n // Fire and forget - don't block sitemap generation\n syncSitemapToPortal(entries, apiUrl, apiKey)\n .then(result => {\n if (result.success) {\n console.log(`[site-kit] Synced to Portal API: ${result.created} created, ${result.updated} updated`)\n }\n })\n .catch(err => {\n console.warn('[site-kit] Failed to sync sitemap to Portal API:', err.message)\n })\n } else {\n console.log('[site-kit] No API key found, skipping Portal API sync')\n }\n }\n \n return entries\n }\n}\n\nexport default createSitemap\n"]}
1
+ {"version":3,"sources":["../../src/sitemap/index.ts"],"names":["join","existsSync","readdirSync","statSync","writeLLMsTxtToPublic"],"mappings":";;;;;;;;;AA8DA,IAAM,eAAA,GAAkB;AAAA,EACtB,KAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA;AAGA,IAAM,UAAA,GAAa,CAAC,UAAA,EAAY,UAAA,EAAY,WAAW,SAAS,CAAA;AAKhE,SAAS,UAAA,CAAW,MAAc,QAAA,EAA6B;AAC7D,EAAA,OAAO,QAAA,CAAS,KAAK,CAAA,OAAA,KAAW;AAC9B,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAClC,MAAA,OAAO,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACzB,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAClC,MAAA,OAAO,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,IAAA,KAAS,OAAA;AAAA,EAClB,CAAC,CAAA;AACH;AAKA,SAAS,cACP,MAAA,EACA,WAAA,GAAsB,EAAA,EACtB,KAAA,GAAkB,EAAC,EACT;AACV,EAAA,MAAM,QAAA,GAAWA,SAAA,CAAK,MAAA,EAAQ,WAAW,CAAA;AAEzC,EAAA,IAAI,CAACC,aAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAUC,eAAY,QAAQ,CAAA;AAGpC,EAAA,MAAM,UAAU,OAAA,CAAQ,IAAA,CAAK,WAAS,UAAA,CAAW,QAAA,CAAS,KAAK,CAAC,CAAA;AAEhE,EAAA,IAAI,OAAA,EAAS;AAEX,IAAA,IAAI,UAAU,GAAA,GAAM,WAAA;AAGpB,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA;AAG5C,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AACrC,IAAA,IAAI,OAAA,KAAY,GAAA,IAAO,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5C,MAAA,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,IAC/B;AAEA,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,EACpB;AAGA,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,SAAA,GAAYF,SAAA,CAAK,QAAA,EAAU,KAAK,CAAA;AACtC,IAAA,MAAM,IAAA,GAAOG,YAAS,SAAS,CAAA;AAE/B,IAAA,IAAI,IAAA,CAAK,aAAY,EAAG;AAEtB,MAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AACrC,MAAA,IAAI,gBAAgB,IAAA,CAAK,CAAA,OAAA,KAAW,WAAW,QAAA,CAAS,OAAO,CAAC,CAAA,EAAG;AACjE,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,MAAM,UAAA,CAAW,GAAG,KAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAChD,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,QAAA;AAAA,MACF;AAEA,MAAA,aAAA,CAAc,MAAA,EAAQH,SAAA,CAAK,WAAA,EAAa,KAAK,GAAG,KAAK,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,UAAA,GAAqB;AAC5B,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AAGxB,EAAA,MAAM,UAAA,GAAa;AAAA,IACjBA,SAAA,CAAK,KAAK,KAAK,CAAA;AAAA,IACfA,SAAA,CAAK,GAAA,EAAK,KAAA,EAAO,KAAK;AAAA,GACxB;AAEA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAIC,aAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GACF;AACF;AAKA,SAAS,WAAA,CAAY,MAAc,MAAA,EAA+B;AAEhE,EAAA,IAAI,OAAO,UAAA,EAAY;AACrB,IAAA,KAAA,MAAW,CAAC,SAAS,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AACnE,MAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAClC,QAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,QAAA;AAAA,MACtC,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,KAAS,KAAK,OAAO,CAAA;AAGzB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA;AAC9C,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,GAAA;AACxB,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,GAAA;AAExB,EAAA,OAAO,OAAO,eAAA,IAAmB,GAAA;AACnC;AAaA,eAAsB,mBAAA,CACpB,OAAA,EACA,MAAA,EACA,MAAA,EACA,OAAA,EACiE;AACjE,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAA,CAAQ,KAAK,uDAAuD,CAAA;AACpE,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,EAClD;AAEA,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,KAAS;AAC7C,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,IAAA,GAAO,GAAA,CAAI,QAAA;AAAA,IACb,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,GAAO,KAAA,CAAM,IAAI,UAAA,CAAW,GAAG,IAAI,KAAA,CAAM,GAAA,GAAM,CAAA,CAAA,EAAI,KAAA,CAAM,GAAG,CAAA,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,YAAY,KAAA,CAAM;AAAA,KACpB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAgC,EAAE,OAAA,EAAS,iBAAA,EAAkB;AACnE,IAAA,IAAI,OAAA,EAAS,YAAA,KAAiB,KAAA,CAAA,EAAW,IAAA,CAAK,gBAAgB,OAAA,CAAQ,YAAA;AACtE,IAAA,IAAI,OAAA,EAAS,SAAA,KAAc,KAAA,CAAA,EAAW,IAAA,CAAK,aAAa,OAAA,CAAQ,SAAA;AAEhE,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,gCAAA,CAAA,EAAoC;AAAA,MACxE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,WAAA,EAAa;AAAA,OACf;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,OAAA,CAAQ,MAAM,iCAAA,EAAmC,QAAA,CAAS,QAAQ,MAAM,QAAA,CAAS,MAAM,CAAA;AACvF,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,IAClD;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AAEnC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,OAAO,OAAA,IAAW,CAAA;AAAA,MAC3B,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,KAC7B;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,EAClD;AACF;AAgBO,SAAS,cAAc,MAAA,EAAuE;AACnG,EAAA,OAAO,YAAY;AACjB,IAAA,MAAM,EAAE,OAAA,EAAS,OAAA,GAAU,EAAC,EAAG,sBAAA,GAAyB,UAAS,GAAI,MAAA;AAGrE,IAAA,MAAM,iBAAA,GAAoB,QAAQ,QAAA,CAAS,GAAG,IAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,OAAA;AAGzE,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,QAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA,kBAAA;AAAA,MACA,YAAA;AAAA,MACA,GAAG;AAAA,KACL;AAGA,IAAA,IAAI,QAAkB,EAAC;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,MAAA,KAAA,GAAQ,cAAc,MAAM,CAAA;AAAA,IAC9B,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,wCAAwC,KAAK,CAAA;AAE1D,MAAA,KAAA,GAAQ,CAAC,GAAG,CAAA;AAAA,IACd;AAGA,IAAA,KAAA,GAAQ,MAAM,MAAA,CAAO,CAAA,IAAA,KAAQ,CAAC,UAAA,CAAW,IAAA,EAAM,aAAa,CAAC,CAAA;AAG7D,IAAA,MAAM,OAAA,GAA0B,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,MACjD,GAAA,EAAK,CAAA,EAAG,iBAAiB,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA,MAChC,YAAA,sBAAkB,IAAA,EAAK;AAAA,MACvB,eAAA,EAAiB,sBAAA;AAAA,MACjB,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,MAAM;AAAA,KACpC,CAAE,CAAA;AAGF,IAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,eAAA,EAAgB;AAChD,QAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,UAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,aAAa,CAAA,EAAG;AACzC,YAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,cACX,GAAA,EAAK,CAAA,EAAG,iBAAiB,CAAA,EAAG,KAAK,IAAI,CAAA,CAAA;AAAA,cACrC,YAAA,sBAAkB,IAAA,EAAK;AAAA,cACvB,eAAA,EAAiB,KAAK,eAAA,IAAmB,sBAAA;AAAA,cACzC,UAAU,IAAA,CAAK,QAAA,IAAY,WAAA,CAAY,IAAA,CAAK,MAAM,MAAM;AAAA,aACzD,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,8CAA8C,KAAK,CAAA;AAAA,MAClE;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,EAAE,QAAA,IAAY,CAAA,KAAM,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,CAAA;AAE5D,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kCAAA,EAAqC,OAAA,CAAQ,MAAM,CAAA,MAAA,CAAQ,CAAA;AAGvE,IAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACvB,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,OAAA,CAAQ,IAAI,2BAAA,IAA+B,8BAAA;AAE3E,MAAA,MAAM,SAAS,MAAA,CAAO,MAAA,IAAU,QAAQ,GAAA,CAAI,eAAA,IAAmB,QAAQ,GAAA,CAAI,2BAAA;AAE3E,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAI;AACF,UAAA,MAAM,cAAkC,EAAC;AACzC,UAAA,IAAI,OAAO,qBAAA,EAAuB;AAChC,YAAA,WAAA,CAAY,YAAA,GAAe,IAAA;AAC3B,YAAA,WAAA,CAAY,SAAA,GAAY,IAAA;AAAA,UAC1B;AACA,UAAA,MAAM,SAAS,MAAM,mBAAA,CAAoB,OAAA,EAAS,MAAA,EAAQ,QAAQ,WAAW,CAAA;AAC7E,UAAA,IAAI,OAAO,OAAA,EAAS;AAClB,YAAA,OAAA,CAAQ,IAAI,CAAA,iCAAA,EAAoC,MAAA,CAAO,OAAO,CAAA,UAAA,EAAa,MAAA,CAAO,OAAO,CAAA,QAAA,CAAU,CAAA;AAAA,UACrG;AAGA,UAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,YAAA,IAAI;AACF,cAAA,MAAM,WAAA,GAAc,MAAMG,qCAAA,CAAqB;AAAA,gBAC7C,MAAA;AAAA,gBACA,MAAA;AAAA,gBACA,IAAA,EAAM,OAAO,oBAAA,IAAwB,KAAA;AAAA,gBACrC,eAAA,EAAiB;AAAA,eAClB,CAAA;AACD,cAAA,IAAI,YAAY,OAAA,EAAS;AACvB,gBAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qCAAA,EAAwC,WAAA,CAAY,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,cAC9E;AAAA,YACF,SAAS,GAAA,EAAK;AACZ,cAAA,OAAA,CAAQ,IAAA,CAAK,sCAAA,EAAyC,GAAA,CAAc,OAAO,CAAA;AAAA,YAC7E;AAAA,UACF;AAAA,QACF,SAAS,GAAA,EAAK;AACZ,UAAA,OAAA,CAAQ,IAAA,CAAK,kDAAA,EAAqD,GAAA,CAAc,OAAO,CAAA;AAAA,QACzF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAI,uDAAuD,CAAA;AAAA,MACrE;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AACF;AAEA,IAAO,eAAA,GAAQ","file":"index.js","sourcesContent":["/**\n * @uptrade/site-kit - Sitemap Generator\n * \n * Automatically generates sitemap.xml from Next.js app directory structure.\n * Works at build time to discover all pages and sync them to Portal API.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com',\n * // Optional: exclude patterns\n * exclude: ['/admin/*', '/api/*'],\n * // Optional: additional dynamic routes\n * additionalPaths: async () => [\n * { path: '/blog/post-1', priority: 0.7 },\n * ]\n * })\n * ```\n */\n\nimport { readdirSync, statSync, existsSync } from 'fs'\nimport { join } from 'path'\nimport { writeLLMsTxtToPublic } from '../llms/writeLLMsTxt'\n\nexport interface SitemapEntry {\n url: string\n lastModified?: Date | string\n changeFrequency?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n priority?: number\n}\n\nexport interface SitemapConfig {\n /** Base URL for the site (required) */\n baseUrl: string\n /** Glob patterns to exclude (e.g., ['/admin/*', '/api/*']) */\n exclude?: string[]\n /** Default priority for pages */\n defaultPriority?: number\n /** Default change frequency */\n defaultChangeFrequency?: SitemapEntry['changeFrequency']\n /** Additional paths to include (for dynamic routes) */\n additionalPaths?: () => Promise<Array<{ path: string; priority?: number; changeFrequency?: SitemapEntry['changeFrequency'] }>>\n /** Priority overrides by path pattern */\n priorities?: Record<string, number>\n /** Portal API URL for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_URL or https://api.uptrademedia.com) */\n apiUrl?: string\n /** Portal API key for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_KEY) */\n apiKey?: string\n /** Disable auto-sync to Portal API */\n disableSync?: boolean\n /** When true, await meta optimization before build completes (for build-time llms.txt with managed_llm_schema) */\n awaitMetaOptimization?: boolean\n /** When true, write AI-optimized llms.txt to public/llms.txt after sitemap sync */\n optimizedLLMsTxt?: boolean\n /** When true with optimizedLLMsTxt, also write public/llms-full.txt */\n optimizedLLMsFullTxt?: boolean\n}\n\n// Route groups and special folders to ignore\nconst IGNORED_FOLDERS = [\n 'api',\n 'admin',\n '_uptrade',\n '%5Fuptrade', // URL-encoded _uptrade\n 'uptrade-setup',\n 'offline',\n]\n\n// File patterns that indicate a page\nconst PAGE_FILES = ['page.tsx', 'page.jsx', 'page.js', 'page.ts']\n\n/**\n * Check if a path matches any exclude pattern\n */\nfunction isExcluded(path: string, patterns: string[]): boolean {\n return patterns.some(pattern => {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n return path.startsWith(prefix)\n }\n if (pattern.endsWith('*')) {\n const prefix = pattern.slice(0, -1)\n return path.startsWith(prefix)\n }\n return path === pattern\n })\n}\n\n/**\n * Recursively discover pages from the app directory\n */\nfunction discoverPages(\n appDir: string,\n currentPath: string = '',\n pages: string[] = []\n): string[] {\n const fullPath = join(appDir, currentPath)\n \n if (!existsSync(fullPath)) {\n return pages\n }\n\n const entries = readdirSync(fullPath)\n \n // Check if this directory has a page file\n const hasPage = entries.some(entry => PAGE_FILES.includes(entry))\n \n if (hasPage) {\n // Convert directory path to URL path\n let urlPath = '/' + currentPath\n \n // Handle route groups (parentheses) - remove them from URL\n urlPath = urlPath.replace(/\\/\\([^)]+\\)/g, '')\n \n // Clean up path\n urlPath = urlPath.replace(/\\/+/g, '/') // Remove double slashes\n if (urlPath !== '/' && urlPath.endsWith('/')) {\n urlPath = urlPath.slice(0, -1) // Remove trailing slash\n }\n \n pages.push(urlPath)\n }\n \n // Recurse into subdirectories\n for (const entry of entries) {\n const entryPath = join(fullPath, entry)\n const stat = statSync(entryPath)\n \n if (stat.isDirectory()) {\n // Skip ignored folders\n const folderName = entry.toLowerCase()\n if (IGNORED_FOLDERS.some(ignored => folderName.includes(ignored))) {\n continue\n }\n \n // Skip dynamic route segments for now (would need runtime data)\n if (entry.startsWith('[') && entry.endsWith(']')) {\n continue\n }\n \n // Skip private folders\n if (entry.startsWith('_')) {\n continue\n }\n \n discoverPages(appDir, join(currentPath, entry), pages)\n }\n }\n \n return pages\n}\n\n/**\n * Find the app directory from the current working directory\n */\nfunction findAppDir(): string {\n const cwd = process.cwd()\n \n // Try common locations\n const candidates = [\n join(cwd, 'app'),\n join(cwd, 'src', 'app'),\n ]\n \n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate\n }\n }\n \n throw new Error(\n '[site-kit] Could not find app directory. Ensure you have an \"app\" or \"src/app\" folder.'\n )\n}\n\n/**\n * Get priority for a path based on config\n */\nfunction getPriority(path: string, config: SitemapConfig): number {\n // Check priority overrides\n if (config.priorities) {\n for (const [pattern, priority] of Object.entries(config.priorities)) {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n if (path.startsWith(prefix)) return priority\n } else if (path === pattern) {\n return priority\n }\n }\n }\n \n // Home page gets highest priority\n if (path === '/') return 1.0\n \n // Shallow pages get higher priority\n const depth = path.split('/').filter(Boolean).length\n if (depth === 1) return 0.8\n if (depth === 2) return 0.6\n \n return config.defaultPriority ?? 0.5\n}\n\nexport interface SyncSitemapOptions {\n /** Trigger Signal AI meta optimization after sync */\n optimizeMeta?: boolean\n /** When true, wait for meta optimization to complete (for build-time llms.txt) */\n awaitMeta?: boolean\n}\n\n/**\n * Sync sitemap entries to Portal API\n * Called automatically by createSitemap at build time\n */\nexport async function syncSitemapToPortal(\n entries: SitemapEntry[],\n apiUrl: string,\n apiKey: string,\n options?: SyncSitemapOptions\n): Promise<{ success: boolean; created: number; updated: number }> {\n if (!apiKey) {\n console.warn('[site-kit] No API key provided, skipping sitemap sync')\n return { success: false, created: 0, updated: 0 }\n }\n \n const normalizedEntries = entries.map(entry => {\n let path: string\n try {\n const url = new URL(entry.url)\n path = url.pathname\n } catch {\n path = entry.url.startsWith('/') ? entry.url : `/${entry.url}`\n }\n \n return {\n path,\n priority: entry.priority,\n changefreq: entry.changeFrequency,\n }\n })\n \n try {\n const body: Record<string, unknown> = { entries: normalizedEntries }\n if (options?.optimizeMeta !== undefined) body.optimize_meta = options.optimizeMeta\n if (options?.awaitMeta !== undefined) body.await_meta = options.awaitMeta\n\n const response = await fetch(`${apiUrl}/api/public/seo/register-sitemap`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify(body),\n })\n \n if (!response.ok) {\n console.error('[site-kit] Sitemap sync failed:', response.status, await response.text())\n return { success: false, created: 0, updated: 0 }\n }\n \n const result = await response.json()\n \n return {\n success: true,\n created: result.created || 0,\n updated: result.updated || 0,\n }\n } catch (error) {\n console.error('[site-kit] Sitemap sync error:', error)\n return { success: false, created: 0, updated: 0 }\n }\n}\n\n/**\n * Create a sitemap generator function for Next.js\n * Automatically syncs to Portal API at build time.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com'\n * })\n * ```\n */\nexport function createSitemap(config: SitemapConfig): () => SitemapEntry[] | Promise<SitemapEntry[]> {\n return async () => {\n const { baseUrl, exclude = [], defaultChangeFrequency = 'weekly' } = config\n \n // Normalize base URL\n const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl\n \n // Default exclusions\n const allExclusions = [\n '/api/*',\n '/admin/*',\n '/_uptrade/*',\n '/uptrade-setup/*',\n '/offline/*',\n ...exclude,\n ]\n \n // Discover pages from app directory\n let pages: string[] = []\n try {\n const appDir = findAppDir()\n pages = discoverPages(appDir)\n } catch (error) {\n console.warn('[site-kit] Failed to discover pages:', error)\n // Fall back to just the home page\n pages = ['/']\n }\n \n // Filter out excluded pages\n pages = pages.filter(page => !isExcluded(page, allExclusions))\n \n // Build sitemap entries\n const entries: SitemapEntry[] = pages.map(path => ({\n url: `${normalizedBaseUrl}${path}`,\n lastModified: new Date(),\n changeFrequency: defaultChangeFrequency,\n priority: getPriority(path, config),\n }))\n \n // Add additional dynamic paths if provided\n if (config.additionalPaths) {\n try {\n const additional = await config.additionalPaths()\n for (const item of additional) {\n if (!isExcluded(item.path, allExclusions)) {\n entries.push({\n url: `${normalizedBaseUrl}${item.path}`,\n lastModified: new Date(),\n changeFrequency: item.changeFrequency ?? defaultChangeFrequency,\n priority: item.priority ?? getPriority(item.path, config),\n })\n }\n }\n } catch (error) {\n console.warn('[site-kit] Failed to get additional paths:', error)\n }\n }\n \n // Sort by priority descending\n entries.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n \n console.log(`[site-kit] Generated sitemap with ${entries.length} pages`)\n \n // Auto-sync to Portal API at build time (unless disabled)\n if (!config.disableSync) {\n const apiUrl = config.apiUrl || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.uptrademedia.com'\n // Server-side operations use UPTRADE_API_KEY, not NEXT_PUBLIC_\n const apiKey = config.apiKey || process.env.UPTRADE_API_KEY || process.env.NEXT_PUBLIC_UPTRADE_API_KEY\n \n if (apiKey) {\n try {\n const syncOptions: SyncSitemapOptions = {}\n if (config.awaitMetaOptimization) {\n syncOptions.optimizeMeta = true\n syncOptions.awaitMeta = true\n }\n const result = await syncSitemapToPortal(entries, apiUrl, apiKey, syncOptions)\n if (result.success) {\n console.log(`[site-kit] Synced to Portal API: ${result.created} created, ${result.updated} updated`)\n }\n\n // Write AI-optimized llms.txt after sync (when enabled)\n if (config.optimizedLLMsTxt) {\n try {\n const writeResult = await writeLLMsTxtToPublic({\n apiUrl,\n apiKey,\n full: config.optimizedLLMsFullTxt ?? false,\n fallbackToLocal: true,\n })\n if (writeResult.success) {\n console.log(`[site-kit] Wrote llms.txt (optimized=${writeResult.optimized})`)\n }\n } catch (err) {\n console.warn('[site-kit] Failed to write llms.txt:', (err as Error).message)\n }\n }\n } catch (err) {\n console.warn('[site-kit] Failed to sync sitemap to Portal API:', (err as Error).message)\n }\n } else {\n console.log('[site-kit] No API key found, skipping Portal API sync')\n }\n }\n \n return entries\n }\n}\n\nexport default createSitemap\n"]}
@@ -1,3 +1,4 @@
1
+ import { writeLLMsTxtToPublic } from '../chunk-K4B34K4J.mjs';
1
2
  import '../chunk-4XPGGLVP.mjs';
2
3
  import { existsSync, readdirSync, statSync } from 'fs';
3
4
  import { join } from 'path';
@@ -92,7 +93,7 @@ function getPriority(path, config) {
92
93
  if (depth === 2) return 0.6;
93
94
  return config.defaultPriority ?? 0.5;
94
95
  }
95
- async function syncSitemapToPortal(entries, apiUrl, apiKey) {
96
+ async function syncSitemapToPortal(entries, apiUrl, apiKey, options) {
96
97
  if (!apiKey) {
97
98
  console.warn("[site-kit] No API key provided, skipping sitemap sync");
98
99
  return { success: false, created: 0, updated: 0 };
@@ -112,13 +113,16 @@ async function syncSitemapToPortal(entries, apiUrl, apiKey) {
112
113
  };
113
114
  });
114
115
  try {
116
+ const body = { entries: normalizedEntries };
117
+ if (options?.optimizeMeta !== void 0) body.optimize_meta = options.optimizeMeta;
118
+ if (options?.awaitMeta !== void 0) body.await_meta = options.awaitMeta;
115
119
  const response = await fetch(`${apiUrl}/api/public/seo/register-sitemap`, {
116
120
  method: "POST",
117
121
  headers: {
118
122
  "Content-Type": "application/json",
119
123
  "x-api-key": apiKey
120
124
  },
121
- body: JSON.stringify({ entries: normalizedEntries })
125
+ body: JSON.stringify(body)
122
126
  });
123
127
  if (!response.ok) {
124
128
  console.error("[site-kit] Sitemap sync failed:", response.status, await response.text());
@@ -185,13 +189,34 @@ function createSitemap(config) {
185
189
  const apiUrl = config.apiUrl || process.env.NEXT_PUBLIC_UPTRADE_API_URL || "https://api.uptrademedia.com";
186
190
  const apiKey = config.apiKey || process.env.UPTRADE_API_KEY || process.env.NEXT_PUBLIC_UPTRADE_API_KEY;
187
191
  if (apiKey) {
188
- syncSitemapToPortal(entries, apiUrl, apiKey).then((result) => {
192
+ try {
193
+ const syncOptions = {};
194
+ if (config.awaitMetaOptimization) {
195
+ syncOptions.optimizeMeta = true;
196
+ syncOptions.awaitMeta = true;
197
+ }
198
+ const result = await syncSitemapToPortal(entries, apiUrl, apiKey, syncOptions);
189
199
  if (result.success) {
190
200
  console.log(`[site-kit] Synced to Portal API: ${result.created} created, ${result.updated} updated`);
191
201
  }
192
- }).catch((err) => {
202
+ if (config.optimizedLLMsTxt) {
203
+ try {
204
+ const writeResult = await writeLLMsTxtToPublic({
205
+ apiUrl,
206
+ apiKey,
207
+ full: config.optimizedLLMsFullTxt ?? false,
208
+ fallbackToLocal: true
209
+ });
210
+ if (writeResult.success) {
211
+ console.log(`[site-kit] Wrote llms.txt (optimized=${writeResult.optimized})`);
212
+ }
213
+ } catch (err) {
214
+ console.warn("[site-kit] Failed to write llms.txt:", err.message);
215
+ }
216
+ }
217
+ } catch (err) {
193
218
  console.warn("[site-kit] Failed to sync sitemap to Portal API:", err.message);
194
- });
219
+ }
195
220
  } else {
196
221
  console.log("[site-kit] No API key found, skipping Portal API sync");
197
222
  }