@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.
Files changed (101) hide show
  1. package/dm.exe +0 -0
  2. package/extensions/.dm-extensions.json +200 -4
  3. package/extensions/dm-context/package.json +1 -1
  4. package/extensions/dm-context/skills/context-management/SKILL.md +173 -223
  5. package/extensions/dm-context/skills/context-management/references/development-and-troubleshooting.md +75 -0
  6. package/extensions/dm-context/skills/context-management/references/interleaved-async-work.md +143 -0
  7. package/extensions/dm-context/skills/context-management/references/planning-and-execution.md +81 -0
  8. package/extensions/dm-context/skills/context-management/references/repeated-items-and-batch-work.md +69 -0
  9. package/extensions/dm-context/skills/context-management/references/retry-branch-and-pivot.md +80 -0
  10. package/extensions/dm-context/skills/context-management/references/search-research-and-reading.md +103 -0
  11. package/extensions/dm-context/skills/context-management/references/task-switching-and-cleanup.md +73 -0
  12. package/extensions/dm-context/src/context.js +3 -2
  13. package/extensions/dm-context/src/index.js +168 -84
  14. package/extensions/dm-skills-manager/THIRD_PARTY_NOTICES.md +27 -0
  15. package/extensions/dm-skills-manager/extensions/skills-manager/components.js +265 -0
  16. package/extensions/dm-skills-manager/extensions/skills-manager/constants.js +31 -0
  17. package/extensions/dm-skills-manager/extensions/skills-manager/creation-fallback.js +20 -0
  18. package/extensions/dm-skills-manager/extensions/skills-manager/creation.js +145 -0
  19. package/extensions/dm-skills-manager/extensions/skills-manager/dialog.js +738 -0
  20. package/extensions/dm-skills-manager/extensions/skills-manager/dm-ai-compat.js +15 -0
  21. package/extensions/dm-skills-manager/extensions/skills-manager/format.js +125 -0
  22. package/extensions/dm-skills-manager/extensions/skills-manager/glyphs.js +142 -0
  23. package/extensions/dm-skills-manager/extensions/skills-manager/layout.js +93 -0
  24. package/extensions/dm-skills-manager/extensions/skills-manager/paths.js +76 -0
  25. package/extensions/dm-skills-manager/extensions/skills-manager/registry.js +95 -0
  26. package/extensions/dm-skills-manager/extensions/skills-manager/settings.js +93 -0
  27. package/extensions/dm-skills-manager/extensions/skills-manager/startup.js +32 -0
  28. package/extensions/dm-skills-manager/extensions/skills-manager/toggle.js +54 -0
  29. package/extensions/dm-skills-manager/extensions/skills-manager/types.js +14 -0
  30. package/extensions/dm-skills-manager/extensions/skills-manager/ui.js +121 -0
  31. package/extensions/dm-skills-manager/extensions/skills-manager.js +111 -0
  32. package/extensions/dm-skills-manager/package.json +121 -0
  33. package/extensions/dm-web-access/SECURITY.md +5 -0
  34. package/extensions/dm-web-access/activity.js +65 -0
  35. package/extensions/dm-web-access/anysearch.js +158 -0
  36. package/extensions/dm-web-access/auth-fetch.js +131 -0
  37. package/extensions/dm-web-access/bocha.js +214 -0
  38. package/extensions/dm-web-access/brave.js +196 -0
  39. package/extensions/dm-web-access/brightdata-unlocker.js +202 -0
  40. package/extensions/dm-web-access/brightdata.js +334 -0
  41. package/extensions/dm-web-access/chrome-cookies.js +627 -0
  42. package/extensions/dm-web-access/content-find.js +114 -0
  43. package/extensions/dm-web-access/credential-source.js +150 -0
  44. package/extensions/dm-web-access/curator-page.js +3559 -0
  45. package/extensions/dm-web-access/curator-server.js +691 -0
  46. package/extensions/dm-web-access/data-uri-sanitize.js +312 -0
  47. package/extensions/dm-web-access/datalab-pdf-extract.js +346 -0
  48. package/extensions/dm-web-access/declared-web-links.js +167 -0
  49. package/extensions/dm-web-access/dm-web-fetch-demo.mp4 +0 -0
  50. package/extensions/dm-web-access/duckduckgo.js +118 -0
  51. package/extensions/dm-web-access/exa.js +401 -0
  52. package/extensions/dm-web-access/extract.js +1220 -0
  53. package/extensions/dm-web-access/feature-config.js +24 -0
  54. package/extensions/dm-web-access/fetch-params.js +81 -0
  55. package/extensions/dm-web-access/firecrawl.js +378 -0
  56. package/extensions/dm-web-access/gemini-adc.js +241 -0
  57. package/extensions/dm-web-access/gemini-api.js +258 -0
  58. package/extensions/dm-web-access/gemini-pdf-extract.js +74 -0
  59. package/extensions/dm-web-access/gemini-search.js +889 -0
  60. package/extensions/dm-web-access/gemini-url-context.js +97 -0
  61. package/extensions/dm-web-access/gemini-web-config.js +84 -0
  62. package/extensions/dm-web-access/gemini-web.js +351 -0
  63. package/extensions/dm-web-access/github-api.js +166 -0
  64. package/extensions/dm-web-access/github-extract.js +991 -0
  65. package/extensions/dm-web-access/github-issue-pr.js +750 -0
  66. package/extensions/dm-web-access/index.js +3117 -0
  67. package/extensions/dm-web-access/jina-search.js +242 -0
  68. package/extensions/dm-web-access/kagi.js +255 -0
  69. package/extensions/dm-web-access/kimi-search.js +214 -0
  70. package/extensions/dm-web-access/ollama.js +209 -0
  71. package/extensions/dm-web-access/openai-search.js +510 -0
  72. package/extensions/dm-web-access/package.json +34 -0
  73. package/extensions/dm-web-access/page-query.js +124 -0
  74. package/extensions/dm-web-access/parallel-mcp.js +223 -0
  75. package/extensions/dm-web-access/parallel.js +345 -0
  76. package/extensions/dm-web-access/pdf-extract.js +257 -0
  77. package/extensions/dm-web-access/perplexity.js +151 -0
  78. package/extensions/dm-web-access/querit.js +327 -0
  79. package/extensions/dm-web-access/query-rewrite.js +40 -0
  80. package/extensions/dm-web-access/render-search-error.js +80 -0
  81. package/extensions/dm-web-access/rsc-extract.js +347 -0
  82. package/extensions/dm-web-access/search1api.js +245 -0
  83. package/extensions/dm-web-access/searchinfinity.js +221 -0
  84. package/extensions/dm-web-access/searxng.js +223 -0
  85. package/extensions/dm-web-access/serpbase.js +205 -0
  86. package/extensions/dm-web-access/serpdive.js +238 -0
  87. package/extensions/dm-web-access/serper.js +200 -0
  88. package/extensions/dm-web-access/source-check.js +198 -0
  89. package/extensions/dm-web-access/ssrf-protection.js +436 -0
  90. package/extensions/dm-web-access/storage.js +451 -0
  91. package/extensions/dm-web-access/summary-model-scope.js +83 -0
  92. package/extensions/dm-web-access/summary-review.js +364 -0
  93. package/extensions/dm-web-access/tavily.js +199 -0
  94. package/extensions/dm-web-access/tinyfish.js +325 -0
  95. package/extensions/dm-web-access/utils.js +476 -0
  96. package/extensions/dm-web-access/valyu.js +189 -0
  97. package/extensions/dm-web-access/video-extract.js +336 -0
  98. package/extensions/dm-web-access/xai-search.js +285 -0
  99. package/extensions/dm-web-access/xcrawl.js +221 -0
  100. package/extensions/dm-web-access/youtube-extract.js +279 -0
  101. package/package.json +9 -1
@@ -0,0 +1,31 @@
1
+ export const PACKAGE_ID = "@vanillagreen/dm-skills-manager";
2
+ export const INSTALL_SYMBOL = Symbol.for("kendex.dm-skills-manager.installed");
3
+ export const STARTUP_PATCH_SYMBOL = Symbol.for("kendex.dm-skills-manager.startup-patch");
4
+ export const STARTUP_HIDE_ENABLED_SYMBOL = Symbol.for("kendex.dm-skills-manager.hide-startup-skills");
5
+ export const KENDEX_MODAL_LOCK_SYMBOL = Symbol.for("kendex.dm.modal-lock");
6
+ export const DEFAULT_POPUP_WIDTH = "82%";
7
+ export const DEFAULT_POPUP_MAX_HEIGHT = "86%";
8
+ export const DEFAULT_LIST_ROWS = 14;
9
+ const ANSI_GREEN_FG = "\x1B[32m";
10
+ const ANSI_YELLOW_FG = "\x1B[33m";
11
+ const ANSI_FG_RESET = "\x1B[39m";
12
+ export function ansiGreen(text) {
13
+ return `${ANSI_GREEN_FG}${text}${ANSI_FG_RESET}`;
14
+ }
15
+ export function ansiYellow(text) {
16
+ return `${ANSI_YELLOW_FG}${text}${ANSI_FG_RESET}`;
17
+ }
18
+ export const GENERATE_SKILL_SYSTEM_PROMPT = `You create production-ready DM Agent skills.
19
+
20
+ Return only a complete SKILL.md file. Do not wrap it in fences. Do not add commentary.
21
+
22
+ Rules:
23
+ - Start with YAML frontmatter containing name and description.
24
+ - The frontmatter name must exactly match the provided skill_slug.
25
+ - The description is the trigger surface: state what the skill does and when DM should use it.
26
+ - Include allowed-tools only if provided, as one space-delimited string.
27
+ - Keep the body concise, operational, and reusable.
28
+ - Prefer workflows, decision rules, output expectations, constraints, edge cases, and final checks.
29
+ - Do not add placeholders, TODOs, fake files, or ungrounded scripts/references.
30
+ - Use relative paths only if the user explicitly grounded extra files.
31
+ - Do not mention skill-authoring infrastructure, package managers, or this generation process.`;
@@ -0,0 +1,20 @@
1
+ export function isAbortError(error) {
2
+ if (!error || typeof error !== "object")
3
+ return false;
4
+ const name = "name" in error ? String(error.name) : "";
5
+ const message = "message" in error ? String(error.message) : "";
6
+ return name === "AbortError" || message.toLowerCase().includes("aborted");
7
+ }
8
+ export async function resolveSkillDraft(generate, fallback, signal, onFallback) {
9
+ if (signal?.aborted)
10
+ return null;
11
+ try {
12
+ const draft = await generate();
13
+ return signal?.aborted ? null : draft;
14
+ } catch (error) {
15
+ if (signal?.aborted || isAbortError(error))
16
+ return null;
17
+ onFallback(error);
18
+ return fallback();
19
+ }
20
+ }
@@ -0,0 +1,145 @@
1
+ import { existsSync, readFileSync, renameSync, writeFileSync } from "node:fs";
2
+ import { mkdir, writeFile } from "node:fs/promises";
3
+ import { basename, dirname, extname, join } from "node:path";
4
+ import { GENERATE_SKILL_SYSTEM_PROMPT } from "./constants.js";
5
+ import { frontmatterToRaw, getTargetDir, normalizeSkillName, parseSkillDocument } from "./format.js";
6
+ import { isDeletableSkill } from "./registry.js";
7
+ import { settingBoolean } from "./settings.js";
8
+ import { completeSimple, retrySkillGenerationCompat } from "./dm-ai-compat.js";
9
+ import { resolveSkillDraft } from "./creation-fallback.js";
10
+ function buildFallbackSkill(answers) {
11
+ const frontmatter = { name: answers.name, description: answers.description };
12
+ if (answers.allowedTools.length > 0)
13
+ frontmatter["allowed-tools"] = answers.allowedTools.join(" ");
14
+ const sections = [
15
+ frontmatterToRaw(frontmatter, "").trim(),
16
+ `# ${answers.name}`,
17
+ "## Core workflow",
18
+ "- Confirm the request matches the skill description and the user's current goal.",
19
+ "- Inspect relevant inputs before acting; do not assume project-specific conventions without evidence.",
20
+ "- Apply the most direct workflow for the task and keep outputs concrete.",
21
+ "- Call out important edge cases, constraints, and verification steps before finishing."
22
+ ];
23
+ if (answers.exampleRequests?.trim())
24
+ sections.push("## Example requests", answers.exampleRequests.trim());
25
+ if (answers.domainContext?.trim())
26
+ sections.push("## Domain context", answers.domainContext.trim());
27
+ return `${sections.join(`
28
+
29
+ `).trim()}
30
+ `;
31
+ }
32
+ function getEffectiveReasoningLevel(ctx, thinkingLevel) {
33
+ if (!ctx.model?.reasoning || !thinkingLevel || thinkingLevel === "off")
34
+ return;
35
+ return thinkingLevel;
36
+ }
37
+ export async function generateSkillDraft(ctx, answers, options, deps = {}) {
38
+ if (options?.signal?.aborted)
39
+ throw new Error("Generation aborted");
40
+ if (!settingBoolean("aiGenerationEnabled", true, ctx.cwd) || !ctx.model)
41
+ return buildFallbackSkill(answers);
42
+ const auth = await ctx.modelRegistry.getApiKeyAndHeaders(ctx.model);
43
+ if (!auth.ok)
44
+ return buildFallbackSkill(answers);
45
+ const userMessage = {
46
+ role: "user",
47
+ content: [{
48
+ type: "text",
49
+ text: [
50
+ "Create a DM skill SKILL.md.",
51
+ "",
52
+ "Inputs:",
53
+ `- skill_slug: ${answers.name}`,
54
+ `- requested_description: ${answers.description}`,
55
+ `- save_location: ${answers.location}`,
56
+ answers.allowedTools.length > 0 ? `- allowed_tools: ${answers.allowedTools.join(" ")}` : "- allowed_tools: (none)",
57
+ `- example_requests: ${answers.exampleRequests?.trim() || "(none)"}`,
58
+ `- domain_context: ${answers.domainContext?.trim() || "(none)"}`,
59
+ "",
60
+ "Make the description specific enough for DM's skill trigger list. Keep the body compact and execution-oriented."
61
+ ].join(`
62
+ `)
63
+ }],
64
+ timestamp: Date.now()
65
+ };
66
+ const reasoning = getEffectiveReasoningLevel(ctx, options?.thinkingLevel);
67
+ const response = await (deps.retrySkillGeneration ?? retrySkillGenerationCompat)(() => (deps.completeSimple ?? completeSimple)(ctx.model, { systemPrompt: GENERATE_SKILL_SYSTEM_PROMPT, messages: [userMessage] }, { apiKey: auth.apiKey, env: auth.env, headers: auth.headers, ...reasoning ? { reasoning } : {}, ...options?.signal ? { signal: options.signal } : {} }), options?.signal, (attempt, maxAttempts, delayMs, errorMessage) => {
68
+ ctx.ui.notify(`Skill generation retry ${attempt}/${maxAttempts} in ${Math.ceil(delayMs / 1000)}s: ${errorMessage}`, "warning");
69
+ });
70
+ if (options?.signal?.aborted)
71
+ throw new Error("Generation aborted");
72
+ if (response.stopReason === "error" || response.stopReason === "aborted")
73
+ throw new Error(response.errorMessage || `Generation stopped: ${response.stopReason}`);
74
+ const generated = response.content.filter((c) => typeof c === "object" && c !== null && c.type === "text").map((c) => c.text).join(`
75
+ `).trim();
76
+ if (!generated)
77
+ throw new Error("Skill generation returned no text");
78
+ parseSkillDocument(generated, answers.name);
79
+ return generated;
80
+ }
81
+ async function saveCreatedSkill(ctx, answers, draft) {
82
+ let parsed;
83
+ try {
84
+ parsed = parseSkillDocument(draft, answers.name);
85
+ } catch (error) {
86
+ ctx.ui.notify(error instanceof Error ? error.message : "Invalid generated SKILL.md", "error");
87
+ return null;
88
+ }
89
+ const targetDir = getTargetDir(ctx, answers.location, answers.name);
90
+ const targetPath = join(targetDir, "SKILL.md");
91
+ await mkdir(targetDir, { recursive: true });
92
+ await writeFile(targetPath, parsed.raw, "utf8");
93
+ ctx.ui.notify(`Created skill: ${targetPath}`, "info");
94
+ return {
95
+ name: parsed.name,
96
+ description: parsed.description,
97
+ path: targetPath,
98
+ content: parsed.content,
99
+ frontmatter: parsed.frontmatter,
100
+ scope: answers.location === "global" ? "user" : "project",
101
+ origin: "top-level",
102
+ source: "auto",
103
+ baseDir: targetDir,
104
+ enabled: true
105
+ };
106
+ }
107
+ export async function createSkillFromAnswers(ctx, answers, options, deps = {}) {
108
+ const targetPath = join(getTargetDir(ctx, answers.location, answers.name), "SKILL.md");
109
+ if (existsSync(targetPath)) {
110
+ ctx.ui.notify(`Skill already exists: ${targetPath}`, "error");
111
+ return null;
112
+ }
113
+ const draft = await resolveSkillDraft(() => generateSkillDraft(ctx, answers, options, deps), () => buildFallbackSkill(answers), options?.signal, (error) => ctx.ui.notify(`AI skill generation failed; using fallback template: ${error instanceof Error ? error.message : String(error)}`, "warning"));
114
+ if (draft === null)
115
+ return null;
116
+ return await saveCreatedSkill(ctx, answers, draft);
117
+ }
118
+ export async function renameSkillEntry(ctx, skill, entered) {
119
+ if (!isDeletableSkill(skill)) {
120
+ ctx.ui.notify("Only your own project and global skills can be renamed", "warning");
121
+ return null;
122
+ }
123
+ const normalizedName = normalizeSkillName(entered);
124
+ if (!normalizedName)
125
+ throw new Error("Name must contain letters, numbers, or hyphens");
126
+ if (normalizedName === skill.name) {
127
+ ctx.ui.notify("Skill name unchanged", "info");
128
+ return skill;
129
+ }
130
+ const isDirectorySkill = basename(skill.path).toLowerCase() === "skill.md";
131
+ const currentTarget = isDirectorySkill ? dirname(skill.path) : skill.path;
132
+ const parentDir = dirname(currentTarget);
133
+ const targetPath = isDirectorySkill ? join(parentDir, normalizedName, "SKILL.md") : join(parentDir, `${normalizedName}${extname(skill.path) || ".md"}`);
134
+ const targetTarget = isDirectorySkill ? dirname(targetPath) : targetPath;
135
+ if (existsSync(targetTarget) || existsSync(targetPath))
136
+ throw new Error(`Skill already exists: ${normalizedName}`);
137
+ const parsed = parseSkillDocument(readFileSync(skill.path, "utf8"), skill.name);
138
+ const renamedFrontmatter = { ...parsed.frontmatter, name: normalizedName };
139
+ const updatedRaw = frontmatterToRaw(renamedFrontmatter, parsed.content);
140
+ renameSync(currentTarget, targetTarget);
141
+ writeFileSync(targetPath, updatedRaw, "utf8");
142
+ const renamed = { ...skill, name: normalizedName, path: targetPath, frontmatter: renamedFrontmatter, baseDir: isDirectorySkill ? dirname(targetPath) : dirname(targetPath) };
143
+ ctx.ui.notify(`Renamed skill: ${skill.name} → ${normalizedName}`, "info");
144
+ return renamed;
145
+ }