@ahkohd/yagami 0.1.2
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.
- package/.beads/.beads-credential-key +1 -0
- package/.beads/README.md +81 -0
- package/.beads/config.yaml +54 -0
- package/.beads/hooks/post-checkout +24 -0
- package/.beads/hooks/post-merge +24 -0
- package/.beads/hooks/pre-commit +24 -0
- package/.beads/hooks/pre-push +24 -0
- package/.beads/hooks/prepare-commit-msg +24 -0
- package/.beads/metadata.json +7 -0
- package/.github/workflows/ci.yml +43 -0
- package/.github/workflows/release.yml +115 -0
- package/AGENTS.md +150 -0
- package/README.md +210 -0
- package/biome.json +36 -0
- package/config/mcporter.json +8 -0
- package/dist/cli/theme.js +202 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/cli.js +1883 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.js +223 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon.js +745 -0
- package/dist/daemon.js.map +1 -0
- package/dist/engine/constants.js +131 -0
- package/dist/engine/constants.js.map +1 -0
- package/dist/engine/deep-research.js +167 -0
- package/dist/engine/deep-research.js.map +1 -0
- package/dist/engine/defuddle-utils.js +57 -0
- package/dist/engine/defuddle-utils.js.map +1 -0
- package/dist/engine/github-fetch.js +232 -0
- package/dist/engine/github-fetch.js.map +1 -0
- package/dist/engine/helpers.js +372 -0
- package/dist/engine/helpers.js.map +1 -0
- package/dist/engine/limiter.js +75 -0
- package/dist/engine/limiter.js.map +1 -0
- package/dist/engine/policy.js +313 -0
- package/dist/engine/policy.js.map +1 -0
- package/dist/engine/runtime-utils.js +65 -0
- package/dist/engine/runtime-utils.js.map +1 -0
- package/dist/engine/search-discovery.js +275 -0
- package/dist/engine/search-discovery.js.map +1 -0
- package/dist/engine/url-utils.js +72 -0
- package/dist/engine/url-utils.js.map +1 -0
- package/dist/engine.js +2030 -0
- package/dist/engine.js.map +1 -0
- package/dist/mcp.js +282 -0
- package/dist/mcp.js.map +1 -0
- package/dist/types/cli.js +2 -0
- package/dist/types/cli.js.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/daemon.js +2 -0
- package/dist/types/daemon.js.map +1 -0
- package/dist/types/engine.js +2 -0
- package/dist/types/engine.js.map +1 -0
- package/package.json +66 -0
- package/packages/pi-yagami-search/README.md +39 -0
- package/packages/pi-yagami-search/extensions/yagami-search.ts +273 -0
- package/packages/pi-yagami-search/package.json +41 -0
- package/src/cli/theme.ts +260 -0
- package/src/cli.ts +2226 -0
- package/src/config.ts +250 -0
- package/src/daemon.ts +990 -0
- package/src/engine/constants.ts +147 -0
- package/src/engine/deep-research.ts +207 -0
- package/src/engine/defuddle-utils.ts +75 -0
- package/src/engine/github-fetch.ts +265 -0
- package/src/engine/helpers.ts +394 -0
- package/src/engine/limiter.ts +97 -0
- package/src/engine/policy.ts +392 -0
- package/src/engine/runtime-utils.ts +79 -0
- package/src/engine/search-discovery.ts +351 -0
- package/src/engine/url-utils.ts +86 -0
- package/src/engine.ts +2516 -0
- package/src/mcp.ts +337 -0
- package/src/shims-cli.d.ts +3 -0
- package/src/types/cli.ts +7 -0
- package/src/types/config.ts +53 -0
- package/src/types/daemon.ts +22 -0
- package/src/types/engine.ts +194 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
import { countWords, truncateText } from "./helpers.js";
|
|
5
|
+
import { normalizeUrl } from "./url-utils.js";
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
let ghCliAvailablePromise = null;
|
|
8
|
+
function asObject(value) {
|
|
9
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
10
|
+
return null;
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
function parseGitHubRepoReference(input) {
|
|
14
|
+
let normalizedInput;
|
|
15
|
+
try {
|
|
16
|
+
normalizedInput = normalizeUrl(input);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
const url = new URL(normalizedInput);
|
|
23
|
+
const host = String(url.hostname || "")
|
|
24
|
+
.trim()
|
|
25
|
+
.toLowerCase();
|
|
26
|
+
if (host !== "github.com" && host !== "www.github.com") {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const parts = url.pathname.split("/").filter(Boolean);
|
|
30
|
+
if (parts.length !== 2) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
const owner = String(parts[0] || "").trim();
|
|
34
|
+
const repo = String(parts[1] || "")
|
|
35
|
+
.replace(/\.git$/i, "")
|
|
36
|
+
.trim();
|
|
37
|
+
if (!owner || !repo)
|
|
38
|
+
return null;
|
|
39
|
+
return {
|
|
40
|
+
owner,
|
|
41
|
+
repo,
|
|
42
|
+
repoUrl: `https://github.com/${owner}/${repo}`,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function decodeBase64ToUtf8(rawValue) {
|
|
50
|
+
const encoded = String(rawValue ?? "")
|
|
51
|
+
.replace(/\s+/g, "")
|
|
52
|
+
.trim();
|
|
53
|
+
if (!encoded)
|
|
54
|
+
return "";
|
|
55
|
+
try {
|
|
56
|
+
return Buffer.from(encoded, "base64").toString("utf8");
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return "";
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async function hasGhCli() {
|
|
63
|
+
if (!ghCliAvailablePromise) {
|
|
64
|
+
ghCliAvailablePromise = execFileAsync("gh", ["--version"], {
|
|
65
|
+
timeout: 2000,
|
|
66
|
+
windowsHide: true,
|
|
67
|
+
})
|
|
68
|
+
.then(() => true)
|
|
69
|
+
.catch(() => false);
|
|
70
|
+
}
|
|
71
|
+
return await ghCliAvailablePromise;
|
|
72
|
+
}
|
|
73
|
+
async function runGhApi(endpoint, timeoutMs = 12000) {
|
|
74
|
+
const { stdout } = await execFileAsync("gh", ["api", endpoint], {
|
|
75
|
+
timeout: timeoutMs,
|
|
76
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
77
|
+
windowsHide: true,
|
|
78
|
+
});
|
|
79
|
+
const raw = String(stdout || "").trim();
|
|
80
|
+
if (!raw)
|
|
81
|
+
return null;
|
|
82
|
+
return JSON.parse(raw);
|
|
83
|
+
}
|
|
84
|
+
export async function tryFetchGitHubRepoContent(requestedUrl, maxCharacters, options = {}) {
|
|
85
|
+
const repoRef = parseGitHubRepoReference(requestedUrl);
|
|
86
|
+
if (!repoRef)
|
|
87
|
+
return null;
|
|
88
|
+
if (!(await hasGhCli())) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
const startedAt = Date.now();
|
|
92
|
+
const baseEndpoint = `repos/${encodeURIComponent(repoRef.owner)}/${encodeURIComponent(repoRef.repo)}`;
|
|
93
|
+
try {
|
|
94
|
+
const repoPayload = asObject(await runGhApi(baseEndpoint));
|
|
95
|
+
if (!repoPayload) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const repoUrl = String(repoPayload.html_url || repoRef.repoUrl).trim() || repoRef.repoUrl;
|
|
99
|
+
const repoName = String(repoPayload.full_name || `${repoRef.owner}/${repoRef.repo}`).trim();
|
|
100
|
+
const description = String(repoPayload.description || "").trim();
|
|
101
|
+
const defaultBranch = String(repoPayload.default_branch || "").trim();
|
|
102
|
+
const language = String(repoPayload.language || "").trim();
|
|
103
|
+
const homepage = String(repoPayload.homepage || "").trim();
|
|
104
|
+
const pushedAt = String(repoPayload.pushed_at || "").trim();
|
|
105
|
+
const updatedAt = String(repoPayload.updated_at || "").trim();
|
|
106
|
+
const starsRaw = Number(repoPayload.stargazers_count || 0);
|
|
107
|
+
const forksRaw = Number(repoPayload.forks_count || 0);
|
|
108
|
+
const openIssuesRaw = Number(repoPayload.open_issues_count || 0);
|
|
109
|
+
const stars = Number.isFinite(starsRaw) ? Math.max(0, Math.trunc(starsRaw)) : 0;
|
|
110
|
+
const forks = Number.isFinite(forksRaw) ? Math.max(0, Math.trunc(forksRaw)) : 0;
|
|
111
|
+
const openIssues = Number.isFinite(openIssuesRaw) ? Math.max(0, Math.trunc(openIssuesRaw)) : 0;
|
|
112
|
+
const licensePayload = asObject(repoPayload.license);
|
|
113
|
+
const license = String(licensePayload?.spdx_id || licensePayload?.name || "").trim();
|
|
114
|
+
const topics = Array.isArray(repoPayload.topics)
|
|
115
|
+
? repoPayload.topics
|
|
116
|
+
.map((value) => String(value || "").trim())
|
|
117
|
+
.filter(Boolean)
|
|
118
|
+
.slice(0, 20)
|
|
119
|
+
: [];
|
|
120
|
+
let readmeName = "";
|
|
121
|
+
let readmeContent = "";
|
|
122
|
+
try {
|
|
123
|
+
const readmePayload = asObject(await runGhApi(`${baseEndpoint}/readme`));
|
|
124
|
+
if (readmePayload) {
|
|
125
|
+
readmeName = String(readmePayload.name || "README").trim() || "README";
|
|
126
|
+
readmeContent = decodeBase64ToUtf8(readmePayload.content).trim();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// README can be missing; continue with metadata-only output.
|
|
131
|
+
}
|
|
132
|
+
let topLevelEntries = [];
|
|
133
|
+
try {
|
|
134
|
+
const contentsPayload = await runGhApi(`${baseEndpoint}/contents`);
|
|
135
|
+
if (Array.isArray(contentsPayload)) {
|
|
136
|
+
topLevelEntries = contentsPayload
|
|
137
|
+
.map((entry) => {
|
|
138
|
+
const parsed = asObject(entry);
|
|
139
|
+
if (!parsed)
|
|
140
|
+
return "";
|
|
141
|
+
const name = String(parsed.name || "").trim();
|
|
142
|
+
if (!name)
|
|
143
|
+
return "";
|
|
144
|
+
const type = String(parsed.type || "").trim();
|
|
145
|
+
if (type === "dir")
|
|
146
|
+
return `${name}/`;
|
|
147
|
+
if (type === "symlink")
|
|
148
|
+
return `${name}@`;
|
|
149
|
+
if (type === "submodule")
|
|
150
|
+
return `${name} (submodule)`;
|
|
151
|
+
return name;
|
|
152
|
+
})
|
|
153
|
+
.filter(Boolean)
|
|
154
|
+
.slice(0, 30);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Top-level listing is optional.
|
|
159
|
+
}
|
|
160
|
+
const lines = [`# ${repoName}`];
|
|
161
|
+
if (description) {
|
|
162
|
+
lines.push("", description);
|
|
163
|
+
}
|
|
164
|
+
lines.push("", `Repository: ${repoUrl}`);
|
|
165
|
+
if (requestedUrl !== repoUrl) {
|
|
166
|
+
lines.push(`Requested URL: ${requestedUrl}`);
|
|
167
|
+
}
|
|
168
|
+
if (defaultBranch) {
|
|
169
|
+
lines.push(`Default branch: ${defaultBranch}`);
|
|
170
|
+
}
|
|
171
|
+
lines.push(`Stars: ${stars}`);
|
|
172
|
+
lines.push(`Forks: ${forks}`);
|
|
173
|
+
lines.push(`Open issues: ${openIssues}`);
|
|
174
|
+
if (language) {
|
|
175
|
+
lines.push(`Primary language: ${language}`);
|
|
176
|
+
}
|
|
177
|
+
if (license) {
|
|
178
|
+
lines.push(`License: ${license}`);
|
|
179
|
+
}
|
|
180
|
+
if (homepage) {
|
|
181
|
+
lines.push(`Homepage: ${homepage}`);
|
|
182
|
+
}
|
|
183
|
+
if (updatedAt) {
|
|
184
|
+
lines.push(`Updated at: ${updatedAt}`);
|
|
185
|
+
}
|
|
186
|
+
if (pushedAt) {
|
|
187
|
+
lines.push(`Pushed at: ${pushedAt}`);
|
|
188
|
+
}
|
|
189
|
+
if (topics.length > 0) {
|
|
190
|
+
lines.push(`Topics: ${topics.join(", ")}`);
|
|
191
|
+
}
|
|
192
|
+
if (topLevelEntries.length > 0) {
|
|
193
|
+
lines.push("", "Top-level files:");
|
|
194
|
+
lines.push(...topLevelEntries.map((entry) => `- ${entry}`));
|
|
195
|
+
}
|
|
196
|
+
if (readmeContent) {
|
|
197
|
+
lines.push("", `## ${readmeName || "README"}`, "", readmeContent);
|
|
198
|
+
}
|
|
199
|
+
const rawContent = lines.join("\n").trim();
|
|
200
|
+
const content = truncateText(rawContent, maxCharacters);
|
|
201
|
+
const truncated = content.length < rawContent.length;
|
|
202
|
+
const durationMs = Date.now() - startedAt;
|
|
203
|
+
return {
|
|
204
|
+
url: repoUrl,
|
|
205
|
+
requestedUrl,
|
|
206
|
+
title: repoName,
|
|
207
|
+
author: repoRef.owner,
|
|
208
|
+
published: pushedAt || updatedAt || "Unknown",
|
|
209
|
+
wordCount: countWords(content),
|
|
210
|
+
content,
|
|
211
|
+
truncated,
|
|
212
|
+
documentId: `gh-${randomUUID()}`,
|
|
213
|
+
status: 200,
|
|
214
|
+
cache: {
|
|
215
|
+
browse: "gh",
|
|
216
|
+
present: "gh",
|
|
217
|
+
},
|
|
218
|
+
timing: {
|
|
219
|
+
totalMs: durationMs,
|
|
220
|
+
browseMs: null,
|
|
221
|
+
presentMs: null,
|
|
222
|
+
ghMs: durationMs,
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
228
|
+
options.log?.(`gh fetch failed for ${repoRef.owner}/${repoRef.repo}; falling back to browser fetch (${message.slice(0, 220)})`);
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=github-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-fetch.js","sourceRoot":"","sources":["../../src/engine/github-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
import { COMPANY_COUNTRY_ALIASES, COMPANY_COUNTRY_PROFILES, URL_REGEX } from "./constants.js";
|
|
2
|
+
import { normalizeUniqueUrls, normalizeUrl } from "./url-utils.js";
|
|
3
|
+
export function clampInteger(value, fallback, options = {}) {
|
|
4
|
+
const min = options.min ?? Number.MIN_SAFE_INTEGER;
|
|
5
|
+
const max = options.max ?? Number.MAX_SAFE_INTEGER;
|
|
6
|
+
const parsed = Number.parseInt(String(value), 10);
|
|
7
|
+
if (!Number.isFinite(parsed))
|
|
8
|
+
return fallback;
|
|
9
|
+
return Math.max(min, Math.min(max, parsed));
|
|
10
|
+
}
|
|
11
|
+
export function normalizeEnum(value, allowed, fallback) {
|
|
12
|
+
const normalized = String(value ?? "")
|
|
13
|
+
.trim()
|
|
14
|
+
.toLowerCase();
|
|
15
|
+
return allowed.includes(normalized) ? normalized : fallback;
|
|
16
|
+
}
|
|
17
|
+
export function normalizeCountryCode(value) {
|
|
18
|
+
const normalized = String(value ?? "")
|
|
19
|
+
.trim()
|
|
20
|
+
.toLowerCase();
|
|
21
|
+
if (!normalized)
|
|
22
|
+
return null;
|
|
23
|
+
return COMPANY_COUNTRY_ALIASES[normalized] ?? null;
|
|
24
|
+
}
|
|
25
|
+
export function getCompanyCountryProfile(countryCode) {
|
|
26
|
+
if (!countryCode)
|
|
27
|
+
return null;
|
|
28
|
+
return COMPANY_COUNTRY_PROFILES[countryCode] ?? null;
|
|
29
|
+
}
|
|
30
|
+
export function toArray(value) {
|
|
31
|
+
if (value === undefined || value === null)
|
|
32
|
+
return [];
|
|
33
|
+
return Array.isArray(value) ? value : [value];
|
|
34
|
+
}
|
|
35
|
+
export function parseStringList(value) {
|
|
36
|
+
const output = [];
|
|
37
|
+
for (const entry of toArray(value)) {
|
|
38
|
+
if (typeof entry !== "string")
|
|
39
|
+
continue;
|
|
40
|
+
for (const part of entry.split(",")) {
|
|
41
|
+
const item = part.trim();
|
|
42
|
+
if (item)
|
|
43
|
+
output.push(item);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return Array.from(new Set(output));
|
|
47
|
+
}
|
|
48
|
+
export function parseUrlList(value) {
|
|
49
|
+
return parseStringList(value)
|
|
50
|
+
.map((entry) => {
|
|
51
|
+
try {
|
|
52
|
+
return normalizeUrl(entry);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
})
|
|
58
|
+
.filter((entry) => Boolean(entry));
|
|
59
|
+
}
|
|
60
|
+
export function toBool(value, fallback = false) {
|
|
61
|
+
if (value === undefined || value === null || value === "")
|
|
62
|
+
return fallback;
|
|
63
|
+
if (typeof value === "boolean")
|
|
64
|
+
return value;
|
|
65
|
+
const normalized = String(value).trim().toLowerCase();
|
|
66
|
+
if (["1", "true", "yes", "y", "on"].includes(normalized))
|
|
67
|
+
return true;
|
|
68
|
+
if (["0", "false", "no", "n", "off"].includes(normalized))
|
|
69
|
+
return false;
|
|
70
|
+
return fallback;
|
|
71
|
+
}
|
|
72
|
+
export function normalizeWhitespace(value) {
|
|
73
|
+
return String(value ?? "")
|
|
74
|
+
.replace(/\s+/g, " ")
|
|
75
|
+
.trim();
|
|
76
|
+
}
|
|
77
|
+
export function decodeHtmlEntities(value) {
|
|
78
|
+
return String(value ?? "")
|
|
79
|
+
.replace(/&/g, "&")
|
|
80
|
+
.replace(/</g, "<")
|
|
81
|
+
.replace(/>/g, ">")
|
|
82
|
+
.replace(/"/g, '"')
|
|
83
|
+
.replace(/'/g, "'")
|
|
84
|
+
.replace(/ /g, " ");
|
|
85
|
+
}
|
|
86
|
+
export function stripHtml(value) {
|
|
87
|
+
return normalizeWhitespace(decodeHtmlEntities(String(value ?? "").replace(/<[^>]*>/g, " ")));
|
|
88
|
+
}
|
|
89
|
+
export function normalizeDomainFilter(value) {
|
|
90
|
+
const raw = String(value ?? "")
|
|
91
|
+
.trim()
|
|
92
|
+
.toLowerCase();
|
|
93
|
+
if (!raw)
|
|
94
|
+
return "";
|
|
95
|
+
try {
|
|
96
|
+
return new URL(raw.includes("://") ? raw : `https://${raw}`).hostname.replace(/^www\./, "");
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return (raw
|
|
100
|
+
.replace(/^https?:\/\//, "")
|
|
101
|
+
.replace(/^www\./, "")
|
|
102
|
+
.split("/")[0]
|
|
103
|
+
?.trim() ?? "");
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export function domainMatches(hostname, domains) {
|
|
107
|
+
if (!hostname)
|
|
108
|
+
return false;
|
|
109
|
+
for (const domain of domains) {
|
|
110
|
+
if (!domain)
|
|
111
|
+
continue;
|
|
112
|
+
if (hostname === domain)
|
|
113
|
+
return true;
|
|
114
|
+
if (hostname.endsWith(`.${domain}`))
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
export function isDiscoveryDomain(hostname) {
|
|
120
|
+
return domainMatches(hostname, ["duckduckgo.com", "bing.com", "google.com", "search.brave.com"]);
|
|
121
|
+
}
|
|
122
|
+
export function isValidPublicHostname(hostname) {
|
|
123
|
+
if (!hostname)
|
|
124
|
+
return false;
|
|
125
|
+
return hostname === "localhost" || hostname.includes(".");
|
|
126
|
+
}
|
|
127
|
+
export function parseIsoDate(value) {
|
|
128
|
+
if (!value)
|
|
129
|
+
return null;
|
|
130
|
+
const normalized = String(value).trim();
|
|
131
|
+
if (!normalized)
|
|
132
|
+
return null;
|
|
133
|
+
const parsed = new Date(normalized);
|
|
134
|
+
if (!Number.isFinite(parsed.getTime()))
|
|
135
|
+
return null;
|
|
136
|
+
return parsed;
|
|
137
|
+
}
|
|
138
|
+
export function isChallengeLikeContent(title, content) {
|
|
139
|
+
const haystack = `${String(title ?? "")}\n${String(content ?? "")}`.toLowerCase();
|
|
140
|
+
const tokens = [
|
|
141
|
+
"just a moment",
|
|
142
|
+
"attention required",
|
|
143
|
+
"verify you are human",
|
|
144
|
+
"checking your browser",
|
|
145
|
+
"access denied",
|
|
146
|
+
"cloudflare",
|
|
147
|
+
"cf-ray",
|
|
148
|
+
"captcha",
|
|
149
|
+
];
|
|
150
|
+
return tokens.some((token) => haystack.includes(token));
|
|
151
|
+
}
|
|
152
|
+
export function extractTopTerms(value, maxTerms = 6) {
|
|
153
|
+
const stopwords = new Set([
|
|
154
|
+
"the",
|
|
155
|
+
"and",
|
|
156
|
+
"for",
|
|
157
|
+
"with",
|
|
158
|
+
"from",
|
|
159
|
+
"that",
|
|
160
|
+
"this",
|
|
161
|
+
"your",
|
|
162
|
+
"about",
|
|
163
|
+
"into",
|
|
164
|
+
"their",
|
|
165
|
+
"have",
|
|
166
|
+
"will",
|
|
167
|
+
"not",
|
|
168
|
+
"are",
|
|
169
|
+
"you",
|
|
170
|
+
"how",
|
|
171
|
+
"what",
|
|
172
|
+
"when",
|
|
173
|
+
"where",
|
|
174
|
+
"why",
|
|
175
|
+
"who",
|
|
176
|
+
"www",
|
|
177
|
+
"http",
|
|
178
|
+
"https",
|
|
179
|
+
]);
|
|
180
|
+
const words = normalizeWhitespace(value)
|
|
181
|
+
.toLowerCase()
|
|
182
|
+
.replace(/[^a-z0-9\s-]/g, " ")
|
|
183
|
+
.split(/\s+/)
|
|
184
|
+
.filter((word) => word.length >= 4 && !stopwords.has(word));
|
|
185
|
+
const counts = new Map();
|
|
186
|
+
for (const word of words)
|
|
187
|
+
counts.set(word, (counts.get(word) ?? 0) + 1);
|
|
188
|
+
return [...counts.entries()]
|
|
189
|
+
.sort((a, b) => b[1] - a[1])
|
|
190
|
+
.slice(0, maxTerms)
|
|
191
|
+
.map(([word]) => word);
|
|
192
|
+
}
|
|
193
|
+
export function unwrapDuckDuckGoHref(rawHref) {
|
|
194
|
+
if (!rawHref)
|
|
195
|
+
return "";
|
|
196
|
+
const trimmed = String(rawHref).trim();
|
|
197
|
+
const absolute = trimmed.startsWith("//") ? `https:${trimmed}` : trimmed;
|
|
198
|
+
try {
|
|
199
|
+
const url = new URL(absolute);
|
|
200
|
+
const hostname = url.hostname.toLowerCase();
|
|
201
|
+
const pathname = url.pathname || "";
|
|
202
|
+
if (hostname.endsWith("duckduckgo.com") && pathname.startsWith("/l/")) {
|
|
203
|
+
const target = url.searchParams.get("uddg") || url.searchParams.get("rut");
|
|
204
|
+
if (target)
|
|
205
|
+
return decodeURIComponent(target);
|
|
206
|
+
}
|
|
207
|
+
if (hostname.endsWith("google.com") && pathname === "/url") {
|
|
208
|
+
const target = url.searchParams.get("q") || url.searchParams.get("url");
|
|
209
|
+
if (target)
|
|
210
|
+
return decodeURIComponent(target);
|
|
211
|
+
}
|
|
212
|
+
return url.toString();
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
return trimmed;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
export function isTrackingOrAdUrl(rawUrl) {
|
|
219
|
+
try {
|
|
220
|
+
const url = new URL(String(rawUrl));
|
|
221
|
+
const hostname = url.hostname.toLowerCase();
|
|
222
|
+
if (hostname.endsWith("duckduckgo.com"))
|
|
223
|
+
return true;
|
|
224
|
+
if ((hostname === "google.com" || hostname === "www.google.com") && url.pathname === "/url")
|
|
225
|
+
return true;
|
|
226
|
+
if (hostname === "search.brave.com")
|
|
227
|
+
return true;
|
|
228
|
+
if (hostname.endsWith("bing.com") && (url.pathname === "/aclick" || url.pathname.startsWith("/ck/")))
|
|
229
|
+
return true;
|
|
230
|
+
const adParams = ["ad_domain", "ad_provider", "ad_type", "click_metadata", "u3", "rut"];
|
|
231
|
+
if (adParams.some((param) => url.searchParams.has(param)))
|
|
232
|
+
return true;
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
const CATEGORY_PROFILES = {
|
|
240
|
+
company: {
|
|
241
|
+
queryHint: "official site products services company overview funding news",
|
|
242
|
+
includeDomains: [],
|
|
243
|
+
includeText: ["company"],
|
|
244
|
+
},
|
|
245
|
+
"research paper": {
|
|
246
|
+
queryHint: "research paper arxiv preprint",
|
|
247
|
+
includeDomains: ["arxiv.org", "openreview.net", "acm.org", "ieee.org"],
|
|
248
|
+
includeText: ["abstract"],
|
|
249
|
+
},
|
|
250
|
+
news: {
|
|
251
|
+
queryHint: "latest news",
|
|
252
|
+
includeDomains: [],
|
|
253
|
+
includeText: ["news"],
|
|
254
|
+
},
|
|
255
|
+
pdf: {
|
|
256
|
+
queryHint: "filetype:pdf pdf",
|
|
257
|
+
includeDomains: [],
|
|
258
|
+
includeText: [],
|
|
259
|
+
},
|
|
260
|
+
github: {
|
|
261
|
+
queryHint: "github repository",
|
|
262
|
+
includeDomains: ["github.com"],
|
|
263
|
+
includeText: [],
|
|
264
|
+
},
|
|
265
|
+
tweet: {
|
|
266
|
+
queryHint: "x twitter thread",
|
|
267
|
+
includeDomains: ["x.com", "twitter.com"],
|
|
268
|
+
includeText: [],
|
|
269
|
+
},
|
|
270
|
+
"personal site": {
|
|
271
|
+
queryHint: "personal blog portfolio",
|
|
272
|
+
includeDomains: [],
|
|
273
|
+
includeText: ["about"],
|
|
274
|
+
},
|
|
275
|
+
people: {
|
|
276
|
+
queryHint: "biography profile",
|
|
277
|
+
includeDomains: [],
|
|
278
|
+
includeText: [],
|
|
279
|
+
},
|
|
280
|
+
"financial report": {
|
|
281
|
+
queryHint: "annual report 10-k earnings",
|
|
282
|
+
includeDomains: ["sec.gov"],
|
|
283
|
+
includeText: ["annual report", "10-k", "earnings"],
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
export function categoryProfile(category) {
|
|
287
|
+
const value = String(category ?? "")
|
|
288
|
+
.trim()
|
|
289
|
+
.toLowerCase();
|
|
290
|
+
return CATEGORY_PROFILES[value] ?? { queryHint: "", includeDomains: [], includeText: [] };
|
|
291
|
+
}
|
|
292
|
+
export function truncateText(text, maxChars) {
|
|
293
|
+
if (typeof text !== "string")
|
|
294
|
+
return "";
|
|
295
|
+
if (text.length <= maxChars)
|
|
296
|
+
return text;
|
|
297
|
+
return `${text.slice(0, maxChars)}\n\n[Truncated to ${maxChars} characters]`;
|
|
298
|
+
}
|
|
299
|
+
export function countWords(text) {
|
|
300
|
+
if (!text)
|
|
301
|
+
return 0;
|
|
302
|
+
return String(text).trim().split(/\s+/).filter(Boolean).length;
|
|
303
|
+
}
|
|
304
|
+
export function extractAssistantText(message) {
|
|
305
|
+
if (!message)
|
|
306
|
+
return "";
|
|
307
|
+
if (typeof message.content === "string")
|
|
308
|
+
return message.content;
|
|
309
|
+
if (!Array.isArray(message.content))
|
|
310
|
+
return "";
|
|
311
|
+
return message.content
|
|
312
|
+
.filter((block) => block?.type === "text")
|
|
313
|
+
.map((block) => String(block.text ?? ""))
|
|
314
|
+
.join("\n")
|
|
315
|
+
.trim();
|
|
316
|
+
}
|
|
317
|
+
export function extractTextContent(contentBlocks) {
|
|
318
|
+
if (!Array.isArray(contentBlocks))
|
|
319
|
+
return "";
|
|
320
|
+
return contentBlocks
|
|
321
|
+
.filter((block) => block?.type === "text")
|
|
322
|
+
.map((block) => String(block.text ?? ""))
|
|
323
|
+
.join("\n")
|
|
324
|
+
.trim();
|
|
325
|
+
}
|
|
326
|
+
export function buildContext(entries, maxChars) {
|
|
327
|
+
const chunks = [];
|
|
328
|
+
for (const entry of entries) {
|
|
329
|
+
if (entry.error)
|
|
330
|
+
continue;
|
|
331
|
+
chunks.push([
|
|
332
|
+
`TITLE: ${String(entry.title ?? "Untitled")}`,
|
|
333
|
+
`URL: ${String(entry.url ?? "")}`,
|
|
334
|
+
entry.snippet ? `SNIPPET: ${String(entry.snippet)}` : "",
|
|
335
|
+
entry.content ? `CONTENT:\n${String(entry.content)}` : "",
|
|
336
|
+
]
|
|
337
|
+
.filter(Boolean)
|
|
338
|
+
.join("\n"));
|
|
339
|
+
}
|
|
340
|
+
return truncateText(chunks.join("\n\n---\n\n"), maxChars);
|
|
341
|
+
}
|
|
342
|
+
export function getHostname(url) {
|
|
343
|
+
try {
|
|
344
|
+
return new URL(String(url)).hostname.toLowerCase();
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
return "";
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
export function isHostAllowed(hostname, allowedHosts) {
|
|
351
|
+
if (!hostname)
|
|
352
|
+
return false;
|
|
353
|
+
for (const allowed of allowedHosts) {
|
|
354
|
+
if (hostname === allowed)
|
|
355
|
+
return true;
|
|
356
|
+
if (hostname.endsWith(`.${allowed}`))
|
|
357
|
+
return true;
|
|
358
|
+
}
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
export function extractSeedUrls(text) {
|
|
362
|
+
const matches = String(text ?? "").match(URL_REGEX) ?? [];
|
|
363
|
+
return normalizeUniqueUrls(matches);
|
|
364
|
+
}
|
|
365
|
+
export function extractCitationUrls(text) {
|
|
366
|
+
const matches = String(text ?? "").match(URL_REGEX) ?? [];
|
|
367
|
+
return normalizeUniqueUrls(matches);
|
|
368
|
+
}
|
|
369
|
+
export function normalizePotentialUrls(values) {
|
|
370
|
+
return normalizeUniqueUrls(values);
|
|
371
|
+
}
|
|
372
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/engine/helpers.ts"],"names":[],"mappings":"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"}
|