@duckmind/dm-windows-x64 0.63.0 → 0.63.6
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/dm.exe +0 -0
- package/extensions/.dm-extensions.json +200 -4
- package/extensions/dm-context/package.json +1 -1
- package/extensions/dm-context/skills/context-management/SKILL.md +173 -223
- package/extensions/dm-context/skills/context-management/references/development-and-troubleshooting.md +75 -0
- package/extensions/dm-context/skills/context-management/references/interleaved-async-work.md +143 -0
- package/extensions/dm-context/skills/context-management/references/planning-and-execution.md +81 -0
- package/extensions/dm-context/skills/context-management/references/repeated-items-and-batch-work.md +69 -0
- package/extensions/dm-context/skills/context-management/references/retry-branch-and-pivot.md +80 -0
- package/extensions/dm-context/skills/context-management/references/search-research-and-reading.md +103 -0
- package/extensions/dm-context/skills/context-management/references/task-switching-and-cleanup.md +73 -0
- package/extensions/dm-context/src/context.js +3 -2
- package/extensions/dm-context/src/index.js +168 -84
- package/extensions/dm-skills-manager/THIRD_PARTY_NOTICES.md +27 -0
- package/extensions/dm-skills-manager/extensions/skills-manager/components.js +265 -0
- package/extensions/dm-skills-manager/extensions/skills-manager/constants.js +31 -0
- package/extensions/dm-skills-manager/extensions/skills-manager/creation-fallback.js +20 -0
- package/extensions/dm-skills-manager/extensions/skills-manager/creation.js +145 -0
- package/extensions/dm-skills-manager/extensions/skills-manager/dialog.js +738 -0
- package/extensions/dm-skills-manager/extensions/skills-manager/dm-ai-compat.js +15 -0
- package/extensions/dm-skills-manager/extensions/skills-manager/format.js +125 -0
- package/extensions/dm-skills-manager/extensions/skills-manager/glyphs.js +142 -0
- package/extensions/dm-skills-manager/extensions/skills-manager/layout.js +93 -0
- package/extensions/dm-skills-manager/extensions/skills-manager/paths.js +76 -0
- package/extensions/dm-skills-manager/extensions/skills-manager/registry.js +95 -0
- package/extensions/dm-skills-manager/extensions/skills-manager/settings.js +93 -0
- package/extensions/dm-skills-manager/extensions/skills-manager/startup.js +32 -0
- package/extensions/dm-skills-manager/extensions/skills-manager/toggle.js +54 -0
- package/extensions/dm-skills-manager/extensions/skills-manager/types.js +14 -0
- package/extensions/dm-skills-manager/extensions/skills-manager/ui.js +121 -0
- package/extensions/dm-skills-manager/extensions/skills-manager.js +111 -0
- package/extensions/dm-skills-manager/package.json +121 -0
- package/extensions/dm-web-access/SECURITY.md +5 -0
- package/extensions/dm-web-access/activity.js +65 -0
- package/extensions/dm-web-access/anysearch.js +158 -0
- package/extensions/dm-web-access/auth-fetch.js +131 -0
- package/extensions/dm-web-access/bocha.js +214 -0
- package/extensions/dm-web-access/brave.js +196 -0
- package/extensions/dm-web-access/brightdata-unlocker.js +202 -0
- package/extensions/dm-web-access/brightdata.js +334 -0
- package/extensions/dm-web-access/chrome-cookies.js +627 -0
- package/extensions/dm-web-access/content-find.js +114 -0
- package/extensions/dm-web-access/credential-source.js +150 -0
- package/extensions/dm-web-access/curator-page.js +3559 -0
- package/extensions/dm-web-access/curator-server.js +691 -0
- package/extensions/dm-web-access/data-uri-sanitize.js +312 -0
- package/extensions/dm-web-access/datalab-pdf-extract.js +346 -0
- package/extensions/dm-web-access/declared-web-links.js +167 -0
- package/extensions/dm-web-access/dm-web-fetch-demo.mp4 +0 -0
- package/extensions/dm-web-access/duckduckgo.js +118 -0
- package/extensions/dm-web-access/exa.js +401 -0
- package/extensions/dm-web-access/extract.js +1220 -0
- package/extensions/dm-web-access/feature-config.js +24 -0
- package/extensions/dm-web-access/fetch-params.js +81 -0
- package/extensions/dm-web-access/firecrawl.js +378 -0
- package/extensions/dm-web-access/gemini-adc.js +241 -0
- package/extensions/dm-web-access/gemini-api.js +258 -0
- package/extensions/dm-web-access/gemini-pdf-extract.js +74 -0
- package/extensions/dm-web-access/gemini-search.js +889 -0
- package/extensions/dm-web-access/gemini-url-context.js +97 -0
- package/extensions/dm-web-access/gemini-web-config.js +84 -0
- package/extensions/dm-web-access/gemini-web.js +351 -0
- package/extensions/dm-web-access/github-api.js +166 -0
- package/extensions/dm-web-access/github-extract.js +991 -0
- package/extensions/dm-web-access/github-issue-pr.js +750 -0
- package/extensions/dm-web-access/index.js +3117 -0
- package/extensions/dm-web-access/jina-search.js +242 -0
- package/extensions/dm-web-access/kagi.js +255 -0
- package/extensions/dm-web-access/kimi-search.js +214 -0
- package/extensions/dm-web-access/ollama.js +209 -0
- package/extensions/dm-web-access/openai-search.js +510 -0
- package/extensions/dm-web-access/package.json +34 -0
- package/extensions/dm-web-access/page-query.js +124 -0
- package/extensions/dm-web-access/parallel-mcp.js +223 -0
- package/extensions/dm-web-access/parallel.js +345 -0
- package/extensions/dm-web-access/pdf-extract.js +257 -0
- package/extensions/dm-web-access/perplexity.js +151 -0
- package/extensions/dm-web-access/querit.js +327 -0
- package/extensions/dm-web-access/query-rewrite.js +40 -0
- package/extensions/dm-web-access/render-search-error.js +80 -0
- package/extensions/dm-web-access/rsc-extract.js +347 -0
- package/extensions/dm-web-access/search1api.js +245 -0
- package/extensions/dm-web-access/searchinfinity.js +221 -0
- package/extensions/dm-web-access/searxng.js +223 -0
- package/extensions/dm-web-access/serpbase.js +205 -0
- package/extensions/dm-web-access/serpdive.js +238 -0
- package/extensions/dm-web-access/serper.js +200 -0
- package/extensions/dm-web-access/source-check.js +198 -0
- package/extensions/dm-web-access/ssrf-protection.js +436 -0
- package/extensions/dm-web-access/storage.js +451 -0
- package/extensions/dm-web-access/summary-model-scope.js +83 -0
- package/extensions/dm-web-access/summary-review.js +364 -0
- package/extensions/dm-web-access/tavily.js +199 -0
- package/extensions/dm-web-access/tinyfish.js +325 -0
- package/extensions/dm-web-access/utils.js +476 -0
- package/extensions/dm-web-access/valyu.js +189 -0
- package/extensions/dm-web-access/video-extract.js +336 -0
- package/extensions/dm-web-access/xai-search.js +285 -0
- package/extensions/dm-web-access/xcrawl.js +221 -0
- package/extensions/dm-web-access/youtube-extract.js +279 -0
- package/package.json +9 -1
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
const CONTEXT_CHARS = 400;
|
|
2
|
+
const MAX_OUTPUT_CHARS = 20000;
|
|
3
|
+
function normalize(value) {
|
|
4
|
+
return value.normalize("NFD").replace(/\p{Diacritic}/gu, "").toLocaleLowerCase();
|
|
5
|
+
}
|
|
6
|
+
function editDistanceWithin(left, right, maximum) {
|
|
7
|
+
if (Math.abs(left.length - right.length) > maximum)
|
|
8
|
+
return false;
|
|
9
|
+
let previous = Array.from({ length: right.length + 1 }, (_, index) => index);
|
|
10
|
+
for (let i = 1;i <= left.length; i++) {
|
|
11
|
+
const current = [i];
|
|
12
|
+
let rowMinimum = i;
|
|
13
|
+
for (let j = 1;j <= right.length; j++) {
|
|
14
|
+
const value = Math.min((previous[j] ?? 0) + 1, (current[j - 1] ?? 0) + 1, (previous[j - 1] ?? 0) + (left[i - 1] === right[j - 1] ? 0 : 1));
|
|
15
|
+
current[j] = value;
|
|
16
|
+
rowMinimum = Math.min(rowMinimum, value);
|
|
17
|
+
}
|
|
18
|
+
if (rowMinimum > maximum)
|
|
19
|
+
return false;
|
|
20
|
+
previous = current;
|
|
21
|
+
}
|
|
22
|
+
return (previous[right.length] ?? maximum + 1) <= maximum;
|
|
23
|
+
}
|
|
24
|
+
function literalMatches(text, query, caseInsensitive) {
|
|
25
|
+
const haystack = caseInsensitive ? text.toLocaleLowerCase() : text;
|
|
26
|
+
const needle = caseInsensitive ? query.toLocaleLowerCase() : query;
|
|
27
|
+
const matches = [];
|
|
28
|
+
for (let start = haystack.indexOf(needle);start >= 0; start = haystack.indexOf(needle, start + Math.max(needle.length, 1))) {
|
|
29
|
+
matches.push({ query, start, end: start + query.length });
|
|
30
|
+
}
|
|
31
|
+
return matches;
|
|
32
|
+
}
|
|
33
|
+
function fuzzyMatches(text, query) {
|
|
34
|
+
const queryTokens = normalize(query).match(/[\p{L}\p{N}]+/gu) ?? [];
|
|
35
|
+
if (queryTokens.length === 0)
|
|
36
|
+
return [];
|
|
37
|
+
const matches = [];
|
|
38
|
+
const paragraphs = /[^\n]+(?:\n(?!\n)[^\n]+)*/g;
|
|
39
|
+
for (const paragraph of text.matchAll(paragraphs)) {
|
|
40
|
+
const paragraphText = paragraph[0];
|
|
41
|
+
if (paragraphText.trim().length === 0 || paragraph.index === undefined)
|
|
42
|
+
continue;
|
|
43
|
+
const tokens = [...paragraphText.matchAll(/[\p{L}\p{N}]+/gu)];
|
|
44
|
+
const matched = queryTokens.filter((queryToken) => tokens.some((token) => {
|
|
45
|
+
const candidate = normalize(token[0]);
|
|
46
|
+
const maximum = queryToken.length >= 9 ? 2 : queryToken.length >= 5 ? 1 : 0;
|
|
47
|
+
return editDistanceWithin(queryToken, candidate, maximum);
|
|
48
|
+
}));
|
|
49
|
+
const required = queryTokens.length === 1 ? 1 : Math.ceil(queryTokens.length * 0.6);
|
|
50
|
+
if (matched.length < required)
|
|
51
|
+
continue;
|
|
52
|
+
const first = tokens.find((token) => matched.some((queryToken) => {
|
|
53
|
+
const maximum = queryToken.length >= 9 ? 2 : queryToken.length >= 5 ? 1 : 0;
|
|
54
|
+
return editDistanceWithin(queryToken, normalize(token[0]), maximum);
|
|
55
|
+
}));
|
|
56
|
+
const start = paragraph.index + (first?.index ?? 0);
|
|
57
|
+
matches.push({ query, start, end: start + (first?.[0].length ?? query.length) });
|
|
58
|
+
}
|
|
59
|
+
return matches;
|
|
60
|
+
}
|
|
61
|
+
function mergeRanges(textLength, matches) {
|
|
62
|
+
const ranges = [];
|
|
63
|
+
for (const match of [...matches].sort((left, right) => left.start - right.start)) {
|
|
64
|
+
const start = Math.max(0, match.start - CONTEXT_CHARS);
|
|
65
|
+
const end = Math.min(textLength, match.end + CONTEXT_CHARS);
|
|
66
|
+
const previous = ranges.at(-1);
|
|
67
|
+
if (previous && start <= previous.end) {
|
|
68
|
+
previous.end = Math.max(previous.end, end);
|
|
69
|
+
previous.matches.push(match);
|
|
70
|
+
} else {
|
|
71
|
+
ranges.push({ start, end, matches: [match] });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return ranges;
|
|
75
|
+
}
|
|
76
|
+
export function findContent(text, queries, mode) {
|
|
77
|
+
const normalizedQueries = [...new Set(queries.map((query) => query.trim()).filter(Boolean))];
|
|
78
|
+
const matches = normalizedQueries.flatMap((query) => mode === "fuzzy" ? fuzzyMatches(text, query) : literalMatches(text, query, mode === "case-insensitive"));
|
|
79
|
+
const queryResults = normalizedQueries.map((query) => ({
|
|
80
|
+
query,
|
|
81
|
+
matchCount: matches.filter((match) => match.query === query).length
|
|
82
|
+
}));
|
|
83
|
+
const heading = matches.length > 0 ? `Text matches (${mode})` : `Text matches (${mode}): no matches`;
|
|
84
|
+
const sections = [heading];
|
|
85
|
+
let formattedLength = heading.length;
|
|
86
|
+
let returnedMatches = 0;
|
|
87
|
+
for (const range of mergeRanges(text.length, matches)) {
|
|
88
|
+
const prefix = range.start > 0 ? "…" : "";
|
|
89
|
+
const suffix = range.end < text.length ? "…" : "";
|
|
90
|
+
const snippet = `${prefix}${text.slice(range.start, range.end).replace(/\s+/g, " ").trim()}${suffix}`;
|
|
91
|
+
const counts = [...new Set(range.matches.map((match) => match.query))].map((query) => `"${query}" ×${range.matches.filter((match) => match.query === query).length}`).join(", ");
|
|
92
|
+
const section = `${sections.length}. ${counts}
|
|
93
|
+
${snippet}`;
|
|
94
|
+
if (formattedLength + 2 + section.length > MAX_OUTPUT_CHARS)
|
|
95
|
+
break;
|
|
96
|
+
sections.push(section);
|
|
97
|
+
formattedLength += 2 + section.length;
|
|
98
|
+
returnedMatches += range.matches.length;
|
|
99
|
+
}
|
|
100
|
+
const missing = queryResults.filter((result) => result.matchCount === 0).map((result) => `"${result.query}"`);
|
|
101
|
+
const footer = [
|
|
102
|
+
...missing.length > 0 ? [`No matches: ${missing.join(", ")}`] : [],
|
|
103
|
+
...returnedMatches < matches.length ? [`Showing ${returnedMatches} of ${matches.length} matches.`] : []
|
|
104
|
+
];
|
|
105
|
+
for (const section of footer) {
|
|
106
|
+
if (formattedLength + 2 + section.length > MAX_OUTPUT_CHARS)
|
|
107
|
+
break;
|
|
108
|
+
sections.push(section);
|
|
109
|
+
formattedLength += 2 + section.length;
|
|
110
|
+
}
|
|
111
|
+
return { text: sections.join(`
|
|
112
|
+
|
|
113
|
+
`), matchCount: matches.length, returnedMatches, queryResults };
|
|
114
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execAsync = promisify(exec);
|
|
4
|
+
const COMMAND_TIMEOUT_MS = 5000;
|
|
5
|
+
const MAX_CREDENTIAL_BYTES = 16384;
|
|
6
|
+
const ENV_SOURCE = /^\$(?:([A-Za-z_][A-Za-z0-9_]*)|\{([A-Za-z_][A-Za-z0-9_]*)\})$/;
|
|
7
|
+
const OP_SESSION_NAME = /^OP_SESSION_[A-Za-z0-9_]+$/;
|
|
8
|
+
const COMMAND_ENVIRONMENT_NAMES = [
|
|
9
|
+
"HOME",
|
|
10
|
+
"USER",
|
|
11
|
+
"LOGNAME",
|
|
12
|
+
"PATH",
|
|
13
|
+
"LANG",
|
|
14
|
+
"LC_ALL",
|
|
15
|
+
"LC_CTYPE",
|
|
16
|
+
"TERM",
|
|
17
|
+
"TMPDIR",
|
|
18
|
+
"XDG_CONFIG_HOME",
|
|
19
|
+
"XDG_RUNTIME_DIR",
|
|
20
|
+
"DBUS_SESSION_BUS_ADDRESS",
|
|
21
|
+
"SSH_AUTH_SOCK",
|
|
22
|
+
"WSL_DISTRO_NAME",
|
|
23
|
+
"WSL_INTEROP"
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
export class CredentialResolutionError extends Error {
|
|
27
|
+
provider;
|
|
28
|
+
category;
|
|
29
|
+
constructor(provider, category) {
|
|
30
|
+
const suffix = category === "command-aborted" ? "aborted" : category === "oauth-credential-rejected" ? "OAuth token exchange rejected the credentials" : category;
|
|
31
|
+
super(`${provider} credential resolution failed: ${suffix}`);
|
|
32
|
+
this.name = "CredentialResolutionError";
|
|
33
|
+
this.provider = provider;
|
|
34
|
+
this.category = category;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function redactCredential(text, credential) {
|
|
38
|
+
return credential ? text.split(credential).join("[redacted]") : text;
|
|
39
|
+
}
|
|
40
|
+
function normalize(value) {
|
|
41
|
+
if (typeof value !== "string")
|
|
42
|
+
return null;
|
|
43
|
+
const normalized = value.trim();
|
|
44
|
+
return normalized.length > 0 ? normalized : null;
|
|
45
|
+
}
|
|
46
|
+
function commandEnvironment(source) {
|
|
47
|
+
const environment = {};
|
|
48
|
+
for (const name of COMMAND_ENVIRONMENT_NAMES) {
|
|
49
|
+
const value = source[name];
|
|
50
|
+
if (value !== undefined)
|
|
51
|
+
environment[name] = value;
|
|
52
|
+
}
|
|
53
|
+
for (const [name, value] of Object.entries(source)) {
|
|
54
|
+
if (value !== undefined && OP_SESSION_NAME.test(name))
|
|
55
|
+
environment[name] = value;
|
|
56
|
+
}
|
|
57
|
+
return environment;
|
|
58
|
+
}
|
|
59
|
+
function configuredSource(options) {
|
|
60
|
+
return normalize(options.configuredValue);
|
|
61
|
+
}
|
|
62
|
+
function explicitEnvironmentName(source) {
|
|
63
|
+
const match = source.match(ENV_SOURCE);
|
|
64
|
+
return match ? match[1] ?? match[2] : null;
|
|
65
|
+
}
|
|
66
|
+
function escapedSource(source) {
|
|
67
|
+
if (source.startsWith("$$") || source.startsWith("$!"))
|
|
68
|
+
return source.slice(1);
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
function isMalformedExplicitSource(source) {
|
|
72
|
+
return source.startsWith("$") && escapedSource(source) === null && explicitEnvironmentName(source) === null;
|
|
73
|
+
}
|
|
74
|
+
async function defaultRunCommand(command, options) {
|
|
75
|
+
const result = await execAsync(command, {
|
|
76
|
+
encoding: "utf8",
|
|
77
|
+
env: options.environment,
|
|
78
|
+
maxBuffer: options.maxOutputBytes + 1,
|
|
79
|
+
signal: options.signal,
|
|
80
|
+
timeout: options.timeoutMs,
|
|
81
|
+
windowsHide: true
|
|
82
|
+
});
|
|
83
|
+
return { stdout: result.stdout };
|
|
84
|
+
}
|
|
85
|
+
function commandFailureCategory(error, signal) {
|
|
86
|
+
if (signal?.aborted)
|
|
87
|
+
return "command-aborted";
|
|
88
|
+
if (error && typeof error === "object") {
|
|
89
|
+
const code = error.code;
|
|
90
|
+
if (code === "ERR_CHILD_PROCESS_STDIO_MAXBUFFER")
|
|
91
|
+
return "command-output-too-large";
|
|
92
|
+
if (error.killed || code === "ETIMEDOUT")
|
|
93
|
+
return "command-timeout";
|
|
94
|
+
}
|
|
95
|
+
return "command-failed";
|
|
96
|
+
}
|
|
97
|
+
export function hasCredentialSource(options) {
|
|
98
|
+
const source = configuredSource(options);
|
|
99
|
+
if (source?.startsWith("!"))
|
|
100
|
+
return true;
|
|
101
|
+
if (source?.startsWith("$"))
|
|
102
|
+
return true;
|
|
103
|
+
return normalize(options.environmentValue) !== null || source !== null;
|
|
104
|
+
}
|
|
105
|
+
export async function resolveCredential(options) {
|
|
106
|
+
const source = configuredSource(options);
|
|
107
|
+
const escaped = source ? escapedSource(source) : null;
|
|
108
|
+
if (escaped !== null)
|
|
109
|
+
return escaped;
|
|
110
|
+
if (source?.startsWith("!")) {
|
|
111
|
+
const command = source.slice(1).trim();
|
|
112
|
+
if (!command)
|
|
113
|
+
throw new CredentialResolutionError(options.provider, "invalid-source");
|
|
114
|
+
let result;
|
|
115
|
+
try {
|
|
116
|
+
result = await (options.runCommand ?? defaultRunCommand)(command, {
|
|
117
|
+
signal: options.signal,
|
|
118
|
+
timeoutMs: COMMAND_TIMEOUT_MS,
|
|
119
|
+
maxOutputBytes: MAX_CREDENTIAL_BYTES,
|
|
120
|
+
environment: commandEnvironment(options.environment ?? process.env)
|
|
121
|
+
});
|
|
122
|
+
} catch (error) {
|
|
123
|
+
throw new CredentialResolutionError(options.provider, commandFailureCategory(error, options.signal));
|
|
124
|
+
}
|
|
125
|
+
const stdout = Buffer.isBuffer(result.stdout) ? result.stdout.toString("utf8") : result.stdout;
|
|
126
|
+
if (Buffer.byteLength(stdout, "utf8") > MAX_CREDENTIAL_BYTES) {
|
|
127
|
+
throw new CredentialResolutionError(options.provider, "command-output-too-large");
|
|
128
|
+
}
|
|
129
|
+
const value = stdout.trim();
|
|
130
|
+
if (!value)
|
|
131
|
+
throw new CredentialResolutionError(options.provider, "command-empty");
|
|
132
|
+
if (/[\0-\x1f\x7f]/.test(value)) {
|
|
133
|
+
throw new CredentialResolutionError(options.provider, "command-invalid-output");
|
|
134
|
+
}
|
|
135
|
+
return value;
|
|
136
|
+
}
|
|
137
|
+
if (source && isMalformedExplicitSource(source)) {
|
|
138
|
+
throw new CredentialResolutionError(options.provider, "invalid-source");
|
|
139
|
+
}
|
|
140
|
+
if (source?.startsWith("$")) {
|
|
141
|
+
const name = explicitEnvironmentName(source);
|
|
142
|
+
if (!name)
|
|
143
|
+
throw new CredentialResolutionError(options.provider, "invalid-source");
|
|
144
|
+
const value = normalize((options.environment ?? process.env)[name]);
|
|
145
|
+
if (!value)
|
|
146
|
+
throw new CredentialResolutionError(options.provider, "environment-empty");
|
|
147
|
+
return value;
|
|
148
|
+
}
|
|
149
|
+
return normalize(options.environmentValue) ?? source;
|
|
150
|
+
}
|