gauss-ai 4.0.0

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 (232) hide show
  1. package/CHANGELOG.md +489 -0
  2. package/LICENSE +21 -0
  3. package/README.md +269 -0
  4. package/dist/a2a/index.cjs +7 -0
  5. package/dist/a2a/index.cjs.map +1 -0
  6. package/dist/a2a/index.d.cts +30 -0
  7. package/dist/a2a/index.d.ts +30 -0
  8. package/dist/a2a/index.js +7 -0
  9. package/dist/a2a/index.js.map +1 -0
  10. package/dist/agent-UIQDSYCE.js +16 -0
  11. package/dist/agent-UIQDSYCE.js.map +1 -0
  12. package/dist/agent-builder-8W3mBR-N.d.ts +1075 -0
  13. package/dist/agent-builder-GEMYdb1p.d.cts +1075 -0
  14. package/dist/agent-graph-AMQYAWNF.js +1422 -0
  15. package/dist/agent-graph-AMQYAWNF.js.map +1 -0
  16. package/dist/ai-sdk-mcp.adapter-SEN6KHNU.js +124 -0
  17. package/dist/ai-sdk-mcp.adapter-SEN6KHNU.js.map +1 -0
  18. package/dist/browser/index.js +10 -0
  19. package/dist/browser/index.js.map +1 -0
  20. package/dist/bun-runtime.adapter-MQDAJLQM.js +8 -0
  21. package/dist/bun-runtime.adapter-MQDAJLQM.js.map +1 -0
  22. package/dist/bun-runtime.adapter-XKOUXVAK.cjs +8 -0
  23. package/dist/bun-runtime.adapter-XKOUXVAK.cjs.map +1 -0
  24. package/dist/chat-A3XMRPJL.js +129 -0
  25. package/dist/chat-A3XMRPJL.js.map +1 -0
  26. package/dist/chunk-2ZRU47NC.js +91 -0
  27. package/dist/chunk-2ZRU47NC.js.map +1 -0
  28. package/dist/chunk-3LD3JTH4.cjs +18 -0
  29. package/dist/chunk-3LD3JTH4.cjs.map +1 -0
  30. package/dist/chunk-5FE5TG2W.cjs +16 -0
  31. package/dist/chunk-5FE5TG2W.cjs.map +1 -0
  32. package/dist/chunk-6XF673YC.cjs +436 -0
  33. package/dist/chunk-6XF673YC.cjs.map +1 -0
  34. package/dist/chunk-7CKWZJNS.js +230 -0
  35. package/dist/chunk-7CKWZJNS.js.map +1 -0
  36. package/dist/chunk-BI2G665F.js +4588 -0
  37. package/dist/chunk-BI2G665F.js.map +1 -0
  38. package/dist/chunk-C5NLWJS2.js +139 -0
  39. package/dist/chunk-C5NLWJS2.js.map +1 -0
  40. package/dist/chunk-CJZ66SU3.cjs +4321 -0
  41. package/dist/chunk-CJZ66SU3.cjs.map +1 -0
  42. package/dist/chunk-DAMT2CXW.cjs +91 -0
  43. package/dist/chunk-DAMT2CXW.cjs.map +1 -0
  44. package/dist/chunk-E7WG3MO5.js +18 -0
  45. package/dist/chunk-E7WG3MO5.js.map +1 -0
  46. package/dist/chunk-EFDM6R4J.js +99 -0
  47. package/dist/chunk-EFDM6R4J.js.map +1 -0
  48. package/dist/chunk-F7WIPPEO.js +256 -0
  49. package/dist/chunk-F7WIPPEO.js.map +1 -0
  50. package/dist/chunk-FAYDE67N.js +6927 -0
  51. package/dist/chunk-FAYDE67N.js.map +1 -0
  52. package/dist/chunk-GAE2KKCM.js +21 -0
  53. package/dist/chunk-GAE2KKCM.js.map +1 -0
  54. package/dist/chunk-INLNGRXM.cjs +130 -0
  55. package/dist/chunk-INLNGRXM.cjs.map +1 -0
  56. package/dist/chunk-JKXKXB5O.js +130 -0
  57. package/dist/chunk-JKXKXB5O.js.map +1 -0
  58. package/dist/chunk-K6SAETGP.js +375 -0
  59. package/dist/chunk-K6SAETGP.js.map +1 -0
  60. package/dist/chunk-KEASLAYR.js +157 -0
  61. package/dist/chunk-KEASLAYR.js.map +1 -0
  62. package/dist/chunk-KKJVNM6O.js +436 -0
  63. package/dist/chunk-KKJVNM6O.js.map +1 -0
  64. package/dist/chunk-KYIMVRIM.js +16 -0
  65. package/dist/chunk-KYIMVRIM.js.map +1 -0
  66. package/dist/chunk-MB7NXIZD.js +4321 -0
  67. package/dist/chunk-MB7NXIZD.js.map +1 -0
  68. package/dist/chunk-MHHDXPGE.js +209 -0
  69. package/dist/chunk-MHHDXPGE.js.map +1 -0
  70. package/dist/chunk-NE6JJA5W.js +401 -0
  71. package/dist/chunk-NE6JJA5W.js.map +1 -0
  72. package/dist/chunk-PF46XZBF.cjs +6927 -0
  73. package/dist/chunk-PF46XZBF.cjs.map +1 -0
  74. package/dist/chunk-PSJIAGDE.cjs +375 -0
  75. package/dist/chunk-PSJIAGDE.cjs.map +1 -0
  76. package/dist/chunk-PWOQDXNQ.js +16 -0
  77. package/dist/chunk-PWOQDXNQ.js.map +1 -0
  78. package/dist/chunk-QYOMQBBZ.cjs +230 -0
  79. package/dist/chunk-QYOMQBBZ.cjs.map +1 -0
  80. package/dist/chunk-UDFXLC4J.cjs +16 -0
  81. package/dist/chunk-UDFXLC4J.cjs.map +1 -0
  82. package/dist/chunk-UO4NGXRT.cjs +259 -0
  83. package/dist/chunk-UO4NGXRT.cjs.map +1 -0
  84. package/dist/chunk-UPFDFLEW.js +40 -0
  85. package/dist/chunk-UPFDFLEW.js.map +1 -0
  86. package/dist/chunk-V55JSQS7.cjs +16 -0
  87. package/dist/chunk-V55JSQS7.cjs.map +1 -0
  88. package/dist/chunk-VJADHXZL.cjs +16 -0
  89. package/dist/chunk-VJADHXZL.cjs.map +1 -0
  90. package/dist/chunk-VRWD7LCI.js +59 -0
  91. package/dist/chunk-VRWD7LCI.js.map +1 -0
  92. package/dist/chunk-WKKQ443C.js +487 -0
  93. package/dist/chunk-WKKQ443C.js.map +1 -0
  94. package/dist/chunk-X2GHUHAF.js +436 -0
  95. package/dist/chunk-X2GHUHAF.js.map +1 -0
  96. package/dist/chunk-XLGW3XNI.cjs +256 -0
  97. package/dist/chunk-XLGW3XNI.cjs.map +1 -0
  98. package/dist/chunk-ZFJKX4DP.js +16 -0
  99. package/dist/chunk-ZFJKX4DP.js.map +1 -0
  100. package/dist/chunk-ZM2OEWM2.js +259 -0
  101. package/dist/chunk-ZM2OEWM2.js.map +1 -0
  102. package/dist/chunk-ZNAIP2XV.js +16 -0
  103. package/dist/chunk-ZNAIP2XV.js.map +1 -0
  104. package/dist/chunk-ZYFAZYSL.js +42 -0
  105. package/dist/chunk-ZYFAZYSL.js.map +1 -0
  106. package/dist/cli/index.js +421 -0
  107. package/dist/cli/index.js.map +1 -0
  108. package/dist/config-4MHT6TQW.js +153 -0
  109. package/dist/config-4MHT6TQW.js.map +1 -0
  110. package/dist/config-REERQFK4.cjs +153 -0
  111. package/dist/config-REERQFK4.cjs.map +1 -0
  112. package/dist/cost-tracker-JLOU7IZJ.js +7 -0
  113. package/dist/cost-tracker-JLOU7IZJ.js.map +1 -0
  114. package/dist/demo-C52GMSYH.js +188 -0
  115. package/dist/demo-C52GMSYH.js.map +1 -0
  116. package/dist/deno/index.js +306 -0
  117. package/dist/deno/index.js.map +1 -0
  118. package/dist/deno-runtime.adapter-F744HY7K.js +8 -0
  119. package/dist/deno-runtime.adapter-F744HY7K.js.map +1 -0
  120. package/dist/deno-runtime.adapter-RFEVNSCV.cjs +8 -0
  121. package/dist/deno-runtime.adapter-RFEVNSCV.cjs.map +1 -0
  122. package/dist/dev-D7DDVDA4.js +218 -0
  123. package/dist/dev-D7DDVDA4.js.map +1 -0
  124. package/dist/edge/index.js +10 -0
  125. package/dist/edge/index.js.map +1 -0
  126. package/dist/edge-runtime.adapter-UQCW2F7X.js +8 -0
  127. package/dist/edge-runtime.adapter-UQCW2F7X.js.map +1 -0
  128. package/dist/edge-runtime.adapter-YED6F3AY.cjs +8 -0
  129. package/dist/edge-runtime.adapter-YED6F3AY.cjs.map +1 -0
  130. package/dist/graph-MGFAQZ5W.js +50 -0
  131. package/dist/graph-MGFAQZ5W.js.map +1 -0
  132. package/dist/graph-visualization-HBSVQXJK.js +9 -0
  133. package/dist/graph-visualization-HBSVQXJK.js.map +1 -0
  134. package/dist/index-BRgqNnh3.d.cts +982 -0
  135. package/dist/index-CZxpYUxZ.d.ts +982 -0
  136. package/dist/index.cjs +14789 -0
  137. package/dist/index.cjs.map +1 -0
  138. package/dist/index.d.cts +10275 -0
  139. package/dist/index.d.ts +10275 -0
  140. package/dist/index.js +14789 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/init-CFWXTQ35.js +133 -0
  143. package/dist/init-CFWXTQ35.js.map +1 -0
  144. package/dist/llm-VWO4MC7J.cjs +17 -0
  145. package/dist/llm-VWO4MC7J.cjs.map +1 -0
  146. package/dist/llm-XLXVSPBI.js +17 -0
  147. package/dist/llm-XLXVSPBI.js.map +1 -0
  148. package/dist/logging-WRAK5ZXT.js +33 -0
  149. package/dist/logging-WRAK5ZXT.js.map +1 -0
  150. package/dist/metrics-FAHZVVD4.js +47 -0
  151. package/dist/metrics-FAHZVVD4.js.map +1 -0
  152. package/dist/node/index.cjs +280 -0
  153. package/dist/node/index.cjs.map +1 -0
  154. package/dist/node/index.d.cts +51 -0
  155. package/dist/node/index.d.ts +51 -0
  156. package/dist/node/index.js +280 -0
  157. package/dist/node/index.js.map +1 -0
  158. package/dist/node-runtime.adapter-5L7PJ6W2.js +8 -0
  159. package/dist/node-runtime.adapter-5L7PJ6W2.js.map +1 -0
  160. package/dist/node-runtime.adapter-CCRZVGHB.cjs +8 -0
  161. package/dist/node-runtime.adapter-CCRZVGHB.cjs.map +1 -0
  162. package/dist/persist-usage-WTBTCWEF.js +7 -0
  163. package/dist/persist-usage-WTBTCWEF.js.map +1 -0
  164. package/dist/plugin-RCPBWUUA.js +207 -0
  165. package/dist/plugin-RCPBWUUA.js.map +1 -0
  166. package/dist/plugins/index.cjs +75 -0
  167. package/dist/plugins/index.cjs.map +1 -0
  168. package/dist/plugins/index.d.cts +8 -0
  169. package/dist/plugins/index.d.ts +8 -0
  170. package/dist/plugins/index.js +75 -0
  171. package/dist/plugins/index.js.map +1 -0
  172. package/dist/plugins-L4ING3CX.js +4625 -0
  173. package/dist/plugins-L4ING3CX.js.map +1 -0
  174. package/dist/providers/index.cjs +189 -0
  175. package/dist/providers/index.cjs.map +1 -0
  176. package/dist/providers/index.d.cts +168 -0
  177. package/dist/providers/index.d.ts +168 -0
  178. package/dist/providers/index.js +189 -0
  179. package/dist/providers/index.js.map +1 -0
  180. package/dist/providers-3RNQ5CKZ.js +59 -0
  181. package/dist/providers-3RNQ5CKZ.js.map +1 -0
  182. package/dist/providers-66GPXUGQ.cjs +59 -0
  183. package/dist/providers-66GPXUGQ.cjs.map +1 -0
  184. package/dist/repl-K6QN4I2S.js +678 -0
  185. package/dist/repl-K6QN4I2S.js.map +1 -0
  186. package/dist/rest/index.cjs +17 -0
  187. package/dist/rest/index.cjs.map +1 -0
  188. package/dist/rest/index.d.cts +102 -0
  189. package/dist/rest/index.d.ts +102 -0
  190. package/dist/rest/index.js +17 -0
  191. package/dist/rest/index.js.map +1 -0
  192. package/dist/runtime-deno.js +15 -0
  193. package/dist/runtime-deno.js.map +1 -0
  194. package/dist/runtime-edge.js +15 -0
  195. package/dist/runtime-edge.js.map +1 -0
  196. package/dist/runtime-node.js +15 -0
  197. package/dist/runtime-node.js.map +1 -0
  198. package/dist/scraping/index.cjs +11 -0
  199. package/dist/scraping/index.cjs.map +1 -0
  200. package/dist/scraping/index.d.cts +17 -0
  201. package/dist/scraping/index.d.ts +17 -0
  202. package/dist/scraping/index.js +11 -0
  203. package/dist/scraping/index.js.map +1 -0
  204. package/dist/semantic-scraping.port-CZWUea88.d.cts +54 -0
  205. package/dist/semantic-scraping.port-CZWUea88.d.ts +54 -0
  206. package/dist/server/index.js +166 -0
  207. package/dist/server/index.js.map +1 -0
  208. package/dist/testing/index.cjs +25 -0
  209. package/dist/testing/index.cjs.map +1 -0
  210. package/dist/testing/index.d.cts +63 -0
  211. package/dist/testing/index.d.ts +63 -0
  212. package/dist/testing/index.js +25 -0
  213. package/dist/testing/index.js.map +1 -0
  214. package/dist/token-counter.port-CRgxZZGe.d.ts +334 -0
  215. package/dist/token-counter.port-D7BHMCRR.d.cts +334 -0
  216. package/dist/tools-BZM33OBZ.js +10 -0
  217. package/dist/tools-BZM33OBZ.js.map +1 -0
  218. package/dist/tracing-XA3TEWP4.js +48 -0
  219. package/dist/tracing-XA3TEWP4.js.map +1 -0
  220. package/dist/types-CVsP7gFI.d.cts +235 -0
  221. package/dist/types-CVsP7gFI.d.ts +235 -0
  222. package/dist/virtual-fs.adapter-BBLS-3AY.d.ts +26 -0
  223. package/dist/virtual-fs.adapter-nb0CTYOj.d.cts +26 -0
  224. package/dist/workflow/index.cjs +9 -0
  225. package/dist/workflow/index.cjs.map +1 -0
  226. package/dist/workflow/index.d.cts +62 -0
  227. package/dist/workflow/index.d.ts +62 -0
  228. package/dist/workflow/index.js +9 -0
  229. package/dist/workflow/index.js.map +1 -0
  230. package/dist/workflow.port-BaCttxrw.d.cts +153 -0
  231. package/dist/workflow.port-BaCttxrw.d.ts +153 -0
  232. package/package.json +230 -0
@@ -0,0 +1,230 @@
1
+ // src/adapters/semantic-scraping/semantic-scraping.adapter.ts
2
+ function urlToPattern(url) {
3
+ try {
4
+ const u = new URL(url);
5
+ const path = u.pathname.replace(/\/+$/, "") || "/";
6
+ if (!u.search) return path;
7
+ const params = new URLSearchParams(u.search);
8
+ const wildcarded = [...params.keys()].sort().map((k) => `${k}=*`);
9
+ return `${path}?${wildcarded.join("&")}`;
10
+ } catch {
11
+ return url;
12
+ }
13
+ }
14
+ function hashTools(tools) {
15
+ const keys = tools.map(
16
+ (t) => `${t.name}:${t.description ?? ""}:${JSON.stringify(t.inputSchema ?? {})}`
17
+ ).sort();
18
+ let h = 0;
19
+ const s = keys.join("|");
20
+ for (let i = 0; i < s.length; i++) {
21
+ h = (h << 5) - h + s.charCodeAt(i) | 0;
22
+ }
23
+ return h.toString(36);
24
+ }
25
+ function parseSchema(schema) {
26
+ if (typeof schema === "string") {
27
+ try {
28
+ return JSON.parse(schema);
29
+ } catch {
30
+ return { type: "object", properties: {} };
31
+ }
32
+ }
33
+ return schema;
34
+ }
35
+ function toManifestTool(tool, pattern) {
36
+ const schema = parseSchema(tool.inputSchema);
37
+ const annotations = tool.annotations ? { ...tool.annotations } : void 0;
38
+ return {
39
+ name: tool.name,
40
+ description: tool.description,
41
+ inputSchema: schema,
42
+ category: tool.category,
43
+ annotations,
44
+ pagePatterns: [pattern]
45
+ };
46
+ }
47
+ function rebuildTools(pages, toolsByName) {
48
+ const consolidated = /* @__PURE__ */ new Map();
49
+ for (const [, entry] of toolsByName) {
50
+ const existing = consolidated.get(entry.tool.name);
51
+ if (existing) {
52
+ for (const p of entry.patterns) existing.patterns.add(p);
53
+ } else {
54
+ consolidated.set(entry.tool.name, {
55
+ tool: entry.tool,
56
+ patterns: new Set(entry.patterns)
57
+ });
58
+ }
59
+ }
60
+ const activeToolNames = /* @__PURE__ */ new Set();
61
+ for (const page of Object.values(pages)) {
62
+ for (const name of page.tools) activeToolNames.add(name);
63
+ }
64
+ const result = [];
65
+ for (const [name, entry] of consolidated) {
66
+ if (!activeToolNames.has(name)) continue;
67
+ result.push({
68
+ ...entry.tool,
69
+ pagePatterns: [...entry.patterns].sort()
70
+ });
71
+ }
72
+ return result.sort((a, b) => a.name.localeCompare(b.name));
73
+ }
74
+ var SemanticScrapingAdapter = class {
75
+ manifests = /* @__PURE__ */ new Map();
76
+ getManifest(origin) {
77
+ return this.manifests.get(origin)?.manifest ?? null;
78
+ }
79
+ updatePage(origin, url, tools) {
80
+ const pattern = urlToPattern(url);
81
+ const hash = hashTools(
82
+ tools.map((t) => ({
83
+ ...t,
84
+ inputSchema: parseSchema(t.inputSchema)
85
+ }))
86
+ );
87
+ const now = Date.now();
88
+ const existing = this.manifests.get(origin);
89
+ const toolIndex = existing?.toolIndex ?? /* @__PURE__ */ new Map();
90
+ const oldPages = existing?.manifest.pages ?? {};
91
+ const oldPage = oldPages[pattern];
92
+ if (oldPage) {
93
+ for (const toolName of oldPage.tools) {
94
+ const entry = toolIndex.get(toolName);
95
+ if (entry) {
96
+ entry.patterns.delete(pattern);
97
+ if (entry.patterns.size === 0) toolIndex.delete(toolName);
98
+ }
99
+ }
100
+ }
101
+ const toolNames = [];
102
+ for (const tool of tools) {
103
+ toolNames.push(tool.name);
104
+ const entry = toolIndex.get(tool.name);
105
+ if (entry) {
106
+ entry.patterns.add(pattern);
107
+ entry.tool = toManifestTool(tool, pattern);
108
+ } else {
109
+ toolIndex.set(tool.name, {
110
+ tool: toManifestTool(tool, pattern),
111
+ patterns: /* @__PURE__ */ new Set([pattern])
112
+ });
113
+ }
114
+ }
115
+ const pageToolSet = {
116
+ urlPattern: pattern,
117
+ tools: toolNames,
118
+ lastScanned: now,
119
+ hash
120
+ };
121
+ const pages = {
122
+ ...oldPages,
123
+ [pattern]: pageToolSet
124
+ };
125
+ const deduped = rebuildTools(pages, toolIndex);
126
+ const manifest = {
127
+ origin,
128
+ version: (existing?.manifest.version ?? 0) + 1,
129
+ generatedAt: now,
130
+ pages,
131
+ tools: deduped
132
+ };
133
+ this.manifests.set(origin, { manifest, toolIndex });
134
+ return manifest;
135
+ }
136
+ applyDiff(origin, url, added, removed) {
137
+ const pattern = urlToPattern(url);
138
+ const now = Date.now();
139
+ const existing = this.manifests.get(origin);
140
+ const toolIndex = existing?.toolIndex ?? /* @__PURE__ */ new Map();
141
+ const oldPages = existing?.manifest.pages ?? {};
142
+ const oldPage = oldPages[pattern];
143
+ const currentTools = new Set(oldPage?.tools ?? []);
144
+ for (const name of removed) {
145
+ currentTools.delete(name);
146
+ const entry = toolIndex.get(name);
147
+ if (entry) {
148
+ entry.patterns.delete(pattern);
149
+ if (entry.patterns.size === 0) toolIndex.delete(name);
150
+ }
151
+ }
152
+ for (const tool of added) {
153
+ currentTools.add(tool.name);
154
+ const entry = toolIndex.get(tool.name);
155
+ if (entry) {
156
+ entry.patterns.add(pattern);
157
+ entry.tool = toManifestTool(tool, pattern);
158
+ } else {
159
+ toolIndex.set(tool.name, {
160
+ tool: toManifestTool(tool, pattern),
161
+ patterns: /* @__PURE__ */ new Set([pattern])
162
+ });
163
+ }
164
+ }
165
+ const toolNames = [...currentTools];
166
+ const hash = hashTools(
167
+ toolNames.map((n) => toolIndex.get(n)?.tool).filter(Boolean).map((t) => ({
168
+ name: t.name,
169
+ description: t.description,
170
+ inputSchema: t.inputSchema
171
+ }))
172
+ );
173
+ const pageToolSet = {
174
+ urlPattern: pattern,
175
+ tools: toolNames,
176
+ lastScanned: now,
177
+ hash
178
+ };
179
+ const pages = {
180
+ ...oldPages,
181
+ [pattern]: pageToolSet
182
+ };
183
+ const deduped = rebuildTools(pages, toolIndex);
184
+ const manifest = {
185
+ origin,
186
+ version: (existing?.manifest.version ?? 0) + 1,
187
+ generatedAt: now,
188
+ pages,
189
+ tools: deduped
190
+ };
191
+ this.manifests.set(origin, { manifest, toolIndex });
192
+ return manifest;
193
+ }
194
+ toMCPJson(origin) {
195
+ const manifest = this.getManifest(origin);
196
+ if (!manifest) return JSON.stringify({ tools: [] });
197
+ const mcpTools = manifest.tools.map((t) => ({
198
+ name: t.name,
199
+ description: t.description,
200
+ inputSchema: t.inputSchema,
201
+ ...t.annotations ? { annotations: t.annotations } : {}
202
+ }));
203
+ return JSON.stringify({
204
+ tools: mcpTools,
205
+ _meta: {
206
+ origin: manifest.origin,
207
+ version: manifest.version,
208
+ generatedAt: manifest.generatedAt,
209
+ pageCount: Object.keys(manifest.pages).length,
210
+ toolCount: manifest.tools.length
211
+ }
212
+ });
213
+ }
214
+ getToolsForUrl(origin, url) {
215
+ const manifest = this.getManifest(origin);
216
+ if (!manifest) return [];
217
+ const pattern = urlToPattern(url);
218
+ const page = manifest.pages[pattern];
219
+ if (!page) return [];
220
+ const toolNames = new Set(page.tools);
221
+ return manifest.tools.filter((t) => toolNames.has(t.name));
222
+ }
223
+ };
224
+
225
+ export {
226
+ urlToPattern,
227
+ hashTools,
228
+ SemanticScrapingAdapter
229
+ };
230
+ //# sourceMappingURL=chunk-7CKWZJNS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/semantic-scraping/semantic-scraping.adapter.ts"],"sourcesContent":["// =============================================================================\n// SemanticScrapingAdapter — In-memory ISemanticScrapingPort implementation\n//\n// Maintains per-site MCP tool manifests with:\n// - URL pattern normalization (query values → wildcards)\n// - Cross-page tool deduplication\n// - Incremental diff-based updates\n// - MCP-compatible JSON export\n// =============================================================================\n\nimport type {\n ISemanticScrapingPort,\n SiteToolManifest,\n PageToolSet,\n ManifestTool,\n SemanticTool,\n} from \"../../ports/semantic-scraping.port.js\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Convert a concrete URL to a pattern for grouping (strips query values). */\nexport function urlToPattern(url: string): string {\n try {\n const u = new URL(url);\n const path = u.pathname.replace(/\\/+$/, \"\") || \"/\";\n if (!u.search) return path;\n const params = new URLSearchParams(u.search);\n const wildcarded = [...params.keys()].sort().map((k) => `${k}=*`);\n return `${path}?${wildcarded.join(\"&\")}`;\n } catch {\n return url;\n }\n}\n\n/** Deterministic hash for a set of tools (DJB2-like). */\nexport function hashTools(\n tools: readonly Pick<SemanticTool, \"name\" | \"description\" | \"inputSchema\">[],\n): string {\n const keys = tools\n .map(\n (t) =>\n `${t.name}:${t.description ?? \"\"}:${JSON.stringify(t.inputSchema ?? {})}`,\n )\n .sort();\n let h = 0;\n const s = keys.join(\"|\");\n for (let i = 0; i < s.length; i++) {\n h = ((h << 5) - h + s.charCodeAt(i)) | 0;\n }\n return h.toString(36);\n}\n\n/** Parse a potentially stringified inputSchema into an object. */\nfunction parseSchema(\n schema: string | Record<string, unknown> | object,\n): Record<string, unknown> {\n if (typeof schema === \"string\") {\n try {\n return JSON.parse(schema) as Record<string, unknown>;\n } catch {\n return { type: \"object\", properties: {} };\n }\n }\n return schema as Record<string, unknown>;\n}\n\n/** Convert a SemanticTool to a ManifestTool with a single page pattern. */\nfunction toManifestTool(tool: SemanticTool, pattern: string): ManifestTool {\n const schema = parseSchema(tool.inputSchema);\n const annotations: Record<string, boolean> | undefined = tool.annotations\n ? { ...tool.annotations }\n : undefined;\n\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: schema,\n category: tool.category,\n annotations,\n pagePatterns: [pattern],\n };\n}\n\n/** Rebuild the deduplicated tools array from all page tool sets. */\nfunction rebuildTools(\n pages: Record<string, PageToolSet>,\n toolsByName: Map<string, { tool: ManifestTool; patterns: Set<string> }>,\n): readonly ManifestTool[] {\n const consolidated = new Map<\n string,\n { tool: ManifestTool; patterns: Set<string> }\n >();\n\n for (const [, entry] of toolsByName) {\n const existing = consolidated.get(entry.tool.name);\n if (existing) {\n for (const p of entry.patterns) existing.patterns.add(p);\n } else {\n consolidated.set(entry.tool.name, {\n tool: entry.tool,\n patterns: new Set(entry.patterns),\n });\n }\n }\n\n // Drop tools that no longer appear on any page\n const activeToolNames = new Set<string>();\n for (const page of Object.values(pages)) {\n for (const name of page.tools) activeToolNames.add(name);\n }\n\n const result: ManifestTool[] = [];\n for (const [name, entry] of consolidated) {\n if (!activeToolNames.has(name)) continue;\n result.push({\n ...entry.tool,\n pagePatterns: [...entry.patterns].sort(),\n });\n }\n\n return result.sort((a, b) => a.name.localeCompare(b.name));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class SemanticScrapingAdapter implements ISemanticScrapingPort {\n private readonly manifests = new Map<\n string,\n {\n manifest: SiteToolManifest;\n toolIndex: Map<string, { tool: ManifestTool; patterns: Set<string> }>;\n }\n >();\n\n getManifest(origin: string): SiteToolManifest | null {\n return this.manifests.get(origin)?.manifest ?? null;\n }\n\n updatePage(\n origin: string,\n url: string,\n tools: SemanticTool[],\n ): SiteToolManifest {\n const pattern = urlToPattern(url);\n const hash = hashTools(\n tools.map((t) => ({\n ...t,\n inputSchema: parseSchema(t.inputSchema),\n })),\n );\n const now = Date.now();\n\n const existing = this.manifests.get(origin);\n const toolIndex = existing?.toolIndex ?? new Map();\n const oldPages = existing?.manifest.pages ?? {};\n\n // Remove old tool entries for this pattern from the index\n const oldPage = oldPages[pattern];\n if (oldPage) {\n for (const toolName of oldPage.tools) {\n const entry = toolIndex.get(toolName);\n if (entry) {\n entry.patterns.delete(pattern);\n if (entry.patterns.size === 0) toolIndex.delete(toolName);\n }\n }\n }\n\n // Add new tools to the index\n const toolNames: string[] = [];\n for (const tool of tools) {\n toolNames.push(tool.name);\n const entry = toolIndex.get(tool.name);\n if (entry) {\n entry.patterns.add(pattern);\n entry.tool = toManifestTool(tool, pattern);\n } else {\n toolIndex.set(tool.name, {\n tool: toManifestTool(tool, pattern),\n patterns: new Set([pattern]),\n });\n }\n }\n\n const pageToolSet: PageToolSet = {\n urlPattern: pattern,\n tools: toolNames,\n lastScanned: now,\n hash,\n };\n\n const pages: Record<string, PageToolSet> = {\n ...oldPages,\n [pattern]: pageToolSet,\n };\n const deduped = rebuildTools(pages, toolIndex);\n\n const manifest: SiteToolManifest = {\n origin,\n version: (existing?.manifest.version ?? 0) + 1,\n generatedAt: now,\n pages,\n tools: deduped,\n };\n\n this.manifests.set(origin, { manifest, toolIndex });\n return manifest;\n }\n\n applyDiff(\n origin: string,\n url: string,\n added: SemanticTool[],\n removed: string[],\n ): SiteToolManifest {\n const pattern = urlToPattern(url);\n const now = Date.now();\n\n const existing = this.manifests.get(origin);\n const toolIndex = existing?.toolIndex ?? new Map();\n const oldPages = existing?.manifest.pages ?? {};\n const oldPage = oldPages[pattern];\n const currentTools = new Set(oldPage?.tools ?? []);\n\n // Remove tools\n for (const name of removed) {\n currentTools.delete(name);\n const entry = toolIndex.get(name);\n if (entry) {\n entry.patterns.delete(pattern);\n if (entry.patterns.size === 0) toolIndex.delete(name);\n }\n }\n\n // Add tools\n for (const tool of added) {\n currentTools.add(tool.name);\n const entry = toolIndex.get(tool.name);\n if (entry) {\n entry.patterns.add(pattern);\n entry.tool = toManifestTool(tool, pattern);\n } else {\n toolIndex.set(tool.name, {\n tool: toManifestTool(tool, pattern),\n patterns: new Set([pattern]),\n });\n }\n }\n\n const toolNames = [...currentTools];\n const hash = hashTools(\n toolNames\n .map((n) => toolIndex.get(n)?.tool)\n .filter(Boolean)\n .map((t) => ({\n name: t!.name,\n description: t!.description,\n inputSchema: t!.inputSchema,\n })),\n );\n\n const pageToolSet: PageToolSet = {\n urlPattern: pattern,\n tools: toolNames,\n lastScanned: now,\n hash,\n };\n\n const pages: Record<string, PageToolSet> = {\n ...oldPages,\n [pattern]: pageToolSet,\n };\n const deduped = rebuildTools(pages, toolIndex);\n\n const manifest: SiteToolManifest = {\n origin,\n version: (existing?.manifest.version ?? 0) + 1,\n generatedAt: now,\n pages,\n tools: deduped,\n };\n\n this.manifests.set(origin, { manifest, toolIndex });\n return manifest;\n }\n\n toMCPJson(origin: string): string {\n const manifest = this.getManifest(origin);\n if (!manifest) return JSON.stringify({ tools: [] });\n\n const mcpTools = manifest.tools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n ...(t.annotations ? { annotations: t.annotations } : {}),\n }));\n\n return JSON.stringify({\n tools: mcpTools,\n _meta: {\n origin: manifest.origin,\n version: manifest.version,\n generatedAt: manifest.generatedAt,\n pageCount: Object.keys(manifest.pages).length,\n toolCount: manifest.tools.length,\n },\n });\n }\n\n getToolsForUrl(origin: string, url: string): ManifestTool[] {\n const manifest = this.getManifest(origin);\n if (!manifest) return [];\n\n const pattern = urlToPattern(url);\n const page = manifest.pages[pattern];\n if (!page) return [];\n\n const toolNames = new Set(page.tools);\n return manifest.tools.filter((t) => toolNames.has(t.name));\n }\n}\n"],"mappings":"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","names":[]}