@duckmind/dm-windows-x64 0.63.4 → 0.63.9
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 +236 -13
- 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-mcp-adapter/OAUTH.md +3 -0
- package/extensions/dm-mcp-adapter/THIRD_PARTY_NOTICES.md +4 -0
- package/extensions/dm-mcp-adapter/abort.js +35 -0
- package/extensions/dm-mcp-adapter/agent-dir.js +45 -0
- package/extensions/dm-mcp-adapter/agent-plugin-loader.js +349 -0
- package/extensions/dm-mcp-adapter/app-bridge.bundle.js +5843 -0
- package/extensions/dm-mcp-adapter/cli.js +354 -0
- package/extensions/dm-mcp-adapter/commands.js +619 -0
- package/extensions/dm-mcp-adapter/config.js +1060 -0
- package/extensions/dm-mcp-adapter/consent-manager.js +60 -0
- package/extensions/dm-mcp-adapter/direct-tools.js +544 -0
- package/extensions/dm-mcp-adapter/dist/agent-dir.js +45 -0
- package/extensions/dm-mcp-adapter/dist/agent-plugin-loader.js +349 -0
- package/extensions/dm-mcp-adapter/dist/config.js +1060 -0
- package/extensions/dm-mcp-adapter/dist/mcp-bearer-store.js +311 -0
- package/extensions/dm-mcp-adapter/dist/metadata-cache.js +285 -0
- package/extensions/dm-mcp-adapter/dist/package-mcp-loader.js +144 -0
- package/extensions/dm-mcp-adapter/dist/resource-tools.js +7 -0
- package/extensions/dm-mcp-adapter/dist/types.js +247 -0
- package/extensions/dm-mcp-adapter/dist/ui-app-bridge-helpers.js +36 -0
- package/extensions/dm-mcp-adapter/dist/ui-stream-types.js +58 -0
- package/extensions/dm-mcp-adapter/dist/ui-tool-visibility.js +26 -0
- package/extensions/dm-mcp-adapter/dist/utils.js +307 -0
- package/extensions/dm-mcp-adapter/elicitation-handler.js +306 -0
- package/extensions/dm-mcp-adapter/error-signal.js +16 -0
- package/extensions/dm-mcp-adapter/errors.js +225 -0
- package/extensions/dm-mcp-adapter/failure-backoff.js +19 -0
- package/extensions/dm-mcp-adapter/glimpse-ui.js +61 -0
- package/extensions/dm-mcp-adapter/host-html-template.js +464 -0
- package/extensions/dm-mcp-adapter/index.js +1079 -0
- package/extensions/dm-mcp-adapter/init.js +624 -0
- package/extensions/dm-mcp-adapter/json-schema-validator.js +53 -0
- package/extensions/dm-mcp-adapter/lifecycle.js +385 -0
- package/extensions/dm-mcp-adapter/logger.js +115 -0
- package/extensions/dm-mcp-adapter/mcp-auth-flow.js +824 -0
- package/extensions/dm-mcp-adapter/mcp-auth.js +732 -0
- package/extensions/dm-mcp-adapter/mcp-bearer-store.js +311 -0
- package/extensions/dm-mcp-adapter/mcp-callback-server.js +388 -0
- package/extensions/dm-mcp-adapter/mcp-code.js +291 -0
- package/extensions/dm-mcp-adapter/mcp-keyring-helper.cjs +88 -0
- package/extensions/dm-mcp-adapter/mcp-oauth-provider.js +490 -0
- package/extensions/dm-mcp-adapter/mcp-output-guard.js +386 -0
- package/extensions/dm-mcp-adapter/mcp-panel.js +951 -0
- package/extensions/dm-mcp-adapter/mcp-probe.js +151 -0
- package/extensions/dm-mcp-adapter/mcp-references.js +263 -0
- package/extensions/dm-mcp-adapter/mcp-script-worker.mjs +126 -0
- package/extensions/dm-mcp-adapter/mcp-setup-panel.js +578 -0
- package/extensions/dm-mcp-adapter/mcp-status.js +80 -0
- package/extensions/dm-mcp-adapter/mcp-trace.js +215 -0
- package/extensions/dm-mcp-adapter/metadata-cache.js +292 -0
- package/extensions/dm-mcp-adapter/namespace-tools.js +155 -0
- package/extensions/dm-mcp-adapter/npx-resolver.js +465 -0
- package/extensions/dm-mcp-adapter/oauth-handler.js +17 -0
- package/extensions/dm-mcp-adapter/oauth.js +17 -0
- package/extensions/dm-mcp-adapter/onboarding-state.js +62 -0
- package/extensions/dm-mcp-adapter/package-mcp-loader.js +144 -0
- package/extensions/dm-mcp-adapter/package.json +68 -0
- package/extensions/dm-mcp-adapter/panel-keys.js +26 -0
- package/extensions/dm-mcp-adapter/prompts.js +258 -0
- package/extensions/dm-mcp-adapter/proxy-modes.js +1336 -0
- package/extensions/dm-mcp-adapter/request-headers-command.js +293 -0
- package/extensions/dm-mcp-adapter/resource-tools.js +7 -0
- package/extensions/dm-mcp-adapter/runtime-owner.js +79 -0
- package/extensions/dm-mcp-adapter/sampling-handler.js +222 -0
- package/extensions/dm-mcp-adapter/sandbox-proxy-template.js +190 -0
- package/extensions/dm-mcp-adapter/search-ranking.js +198 -0
- package/extensions/dm-mcp-adapter/server-manager.js +1258 -0
- package/extensions/dm-mcp-adapter/session-recovery.js +82 -0
- package/extensions/dm-mcp-adapter/skills/mcp-scripting/SKILL.md +39 -0
- package/extensions/dm-mcp-adapter/state.js +0 -0
- package/extensions/dm-mcp-adapter/test-runner.mjs +18 -0
- package/extensions/dm-mcp-adapter/tool-approval.js +151 -0
- package/extensions/dm-mcp-adapter/tool-metadata.js +247 -0
- package/extensions/dm-mcp-adapter/tool-registrar.js +212 -0
- package/extensions/dm-mcp-adapter/tool-result-renderer.js +355 -0
- package/extensions/dm-mcp-adapter/ts-shape.js +157 -0
- package/extensions/dm-mcp-adapter/types.js +264 -0
- package/extensions/dm-mcp-adapter/ui-app-bridge-helpers.js +36 -0
- package/extensions/dm-mcp-adapter/ui-resource-handler.js +209 -0
- package/extensions/dm-mcp-adapter/ui-server.js +815 -0
- package/extensions/dm-mcp-adapter/ui-session.js +455 -0
- package/extensions/dm-mcp-adapter/ui-stream-types.js +58 -0
- package/extensions/dm-mcp-adapter/ui-tool-visibility.js +26 -0
- package/extensions/dm-mcp-adapter/unix-socket-transport.js +83 -0
- package/extensions/dm-mcp-adapter/utils.js +307 -0
- 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/package.json +13 -1
- package/extensions/dm-localllm-provider/detect.test.js +0 -1051
- package/extensions/dm-localllm-provider/index.test.js +0 -149
- package/extensions/dm-localllm-provider/keychain.test.js +0 -61
|
@@ -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
|
+
}
|