@duckmind/dm-windows-x64 0.63.6 → 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.
Files changed (91) hide show
  1. package/dm.exe +0 -0
  2. package/extensions/.dm-extensions.json +174 -11
  3. package/extensions/dm-mcp-adapter/OAUTH.md +3 -0
  4. package/extensions/dm-mcp-adapter/THIRD_PARTY_NOTICES.md +4 -0
  5. package/extensions/dm-mcp-adapter/abort.js +35 -0
  6. package/extensions/dm-mcp-adapter/agent-dir.js +45 -0
  7. package/extensions/dm-mcp-adapter/agent-plugin-loader.js +349 -0
  8. package/extensions/dm-mcp-adapter/app-bridge.bundle.js +5843 -0
  9. package/extensions/dm-mcp-adapter/cli.js +354 -0
  10. package/extensions/dm-mcp-adapter/commands.js +619 -0
  11. package/extensions/dm-mcp-adapter/config.js +1060 -0
  12. package/extensions/dm-mcp-adapter/consent-manager.js +60 -0
  13. package/extensions/dm-mcp-adapter/direct-tools.js +544 -0
  14. package/extensions/dm-mcp-adapter/dist/agent-dir.js +45 -0
  15. package/extensions/dm-mcp-adapter/dist/agent-plugin-loader.js +349 -0
  16. package/extensions/dm-mcp-adapter/dist/config.js +1060 -0
  17. package/extensions/dm-mcp-adapter/dist/mcp-bearer-store.js +311 -0
  18. package/extensions/dm-mcp-adapter/dist/metadata-cache.js +285 -0
  19. package/extensions/dm-mcp-adapter/dist/package-mcp-loader.js +144 -0
  20. package/extensions/dm-mcp-adapter/dist/resource-tools.js +7 -0
  21. package/extensions/dm-mcp-adapter/dist/types.js +247 -0
  22. package/extensions/dm-mcp-adapter/dist/ui-app-bridge-helpers.js +36 -0
  23. package/extensions/dm-mcp-adapter/dist/ui-stream-types.js +58 -0
  24. package/extensions/dm-mcp-adapter/dist/ui-tool-visibility.js +26 -0
  25. package/extensions/dm-mcp-adapter/dist/utils.js +307 -0
  26. package/extensions/dm-mcp-adapter/elicitation-handler.js +306 -0
  27. package/extensions/dm-mcp-adapter/error-signal.js +16 -0
  28. package/extensions/dm-mcp-adapter/errors.js +225 -0
  29. package/extensions/dm-mcp-adapter/failure-backoff.js +19 -0
  30. package/extensions/dm-mcp-adapter/glimpse-ui.js +61 -0
  31. package/extensions/dm-mcp-adapter/host-html-template.js +464 -0
  32. package/extensions/dm-mcp-adapter/index.js +1079 -0
  33. package/extensions/dm-mcp-adapter/init.js +624 -0
  34. package/extensions/dm-mcp-adapter/json-schema-validator.js +53 -0
  35. package/extensions/dm-mcp-adapter/lifecycle.js +385 -0
  36. package/extensions/dm-mcp-adapter/logger.js +115 -0
  37. package/extensions/dm-mcp-adapter/mcp-auth-flow.js +824 -0
  38. package/extensions/dm-mcp-adapter/mcp-auth.js +732 -0
  39. package/extensions/dm-mcp-adapter/mcp-bearer-store.js +311 -0
  40. package/extensions/dm-mcp-adapter/mcp-callback-server.js +388 -0
  41. package/extensions/dm-mcp-adapter/mcp-code.js +291 -0
  42. package/extensions/dm-mcp-adapter/mcp-keyring-helper.cjs +88 -0
  43. package/extensions/dm-mcp-adapter/mcp-oauth-provider.js +490 -0
  44. package/extensions/dm-mcp-adapter/mcp-output-guard.js +386 -0
  45. package/extensions/dm-mcp-adapter/mcp-panel.js +951 -0
  46. package/extensions/dm-mcp-adapter/mcp-probe.js +151 -0
  47. package/extensions/dm-mcp-adapter/mcp-references.js +263 -0
  48. package/extensions/dm-mcp-adapter/mcp-script-worker.mjs +126 -0
  49. package/extensions/dm-mcp-adapter/mcp-setup-panel.js +578 -0
  50. package/extensions/dm-mcp-adapter/mcp-status.js +80 -0
  51. package/extensions/dm-mcp-adapter/mcp-trace.js +215 -0
  52. package/extensions/dm-mcp-adapter/metadata-cache.js +292 -0
  53. package/extensions/dm-mcp-adapter/namespace-tools.js +155 -0
  54. package/extensions/dm-mcp-adapter/npx-resolver.js +465 -0
  55. package/extensions/dm-mcp-adapter/oauth-handler.js +17 -0
  56. package/extensions/dm-mcp-adapter/oauth.js +17 -0
  57. package/extensions/dm-mcp-adapter/onboarding-state.js +62 -0
  58. package/extensions/dm-mcp-adapter/package-mcp-loader.js +144 -0
  59. package/extensions/dm-mcp-adapter/package.json +68 -0
  60. package/extensions/dm-mcp-adapter/panel-keys.js +26 -0
  61. package/extensions/dm-mcp-adapter/prompts.js +258 -0
  62. package/extensions/dm-mcp-adapter/proxy-modes.js +1336 -0
  63. package/extensions/dm-mcp-adapter/request-headers-command.js +293 -0
  64. package/extensions/dm-mcp-adapter/resource-tools.js +7 -0
  65. package/extensions/dm-mcp-adapter/runtime-owner.js +79 -0
  66. package/extensions/dm-mcp-adapter/sampling-handler.js +222 -0
  67. package/extensions/dm-mcp-adapter/sandbox-proxy-template.js +190 -0
  68. package/extensions/dm-mcp-adapter/search-ranking.js +198 -0
  69. package/extensions/dm-mcp-adapter/server-manager.js +1258 -0
  70. package/extensions/dm-mcp-adapter/session-recovery.js +82 -0
  71. package/extensions/dm-mcp-adapter/skills/mcp-scripting/SKILL.md +39 -0
  72. package/extensions/dm-mcp-adapter/state.js +0 -0
  73. package/extensions/dm-mcp-adapter/test-runner.mjs +18 -0
  74. package/extensions/dm-mcp-adapter/tool-approval.js +151 -0
  75. package/extensions/dm-mcp-adapter/tool-metadata.js +247 -0
  76. package/extensions/dm-mcp-adapter/tool-registrar.js +212 -0
  77. package/extensions/dm-mcp-adapter/tool-result-renderer.js +355 -0
  78. package/extensions/dm-mcp-adapter/ts-shape.js +157 -0
  79. package/extensions/dm-mcp-adapter/types.js +264 -0
  80. package/extensions/dm-mcp-adapter/ui-app-bridge-helpers.js +36 -0
  81. package/extensions/dm-mcp-adapter/ui-resource-handler.js +209 -0
  82. package/extensions/dm-mcp-adapter/ui-server.js +815 -0
  83. package/extensions/dm-mcp-adapter/ui-session.js +455 -0
  84. package/extensions/dm-mcp-adapter/ui-stream-types.js +58 -0
  85. package/extensions/dm-mcp-adapter/ui-tool-visibility.js +26 -0
  86. package/extensions/dm-mcp-adapter/unix-socket-transport.js +83 -0
  87. package/extensions/dm-mcp-adapter/utils.js +307 -0
  88. package/package.json +13 -1
  89. package/extensions/dm-localllm-provider/detect.test.js +0 -1051
  90. package/extensions/dm-localllm-provider/index.test.js +0 -149
  91. package/extensions/dm-localllm-provider/keychain.test.js +0 -61
@@ -0,0 +1,307 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { homedir, platform } from "node:os";
3
+ import { extname, isAbsolute, join } from "node:path";
4
+ async function execOpen(pi, target, browser, signal) {
5
+ const os = platform();
6
+ if (os === "darwin") {
7
+ if (browser) {
8
+ return isAbsolute(browser) && extname(browser).toLowerCase() !== ".app" ? pi.exec(browser, [target], signal ? { signal } : {}) : pi.exec("open", ["-a", browser, target], signal ? { signal } : {});
9
+ }
10
+ return pi.exec("open", [target], signal ? { signal } : {});
11
+ }
12
+ if (os === "win32") {
13
+ return browser ? pi.exec("cmd", ["/c", "start", "", browser, target], signal ? { signal } : {}) : pi.exec("cmd", ["/c", "start", "", target], signal ? { signal } : {});
14
+ }
15
+ return browser ? pi.exec(browser, [target], signal ? { signal } : {}) : pi.exec("xdg-open", [target], signal ? { signal } : {});
16
+ }
17
+ export async function openUrl(pi, url, browser, signal) {
18
+ const result = await execOpen(pi, url, browser, signal);
19
+ if (result.code !== 0) {
20
+ throw new Error(result.stderr || `Failed to open browser (exit code ${result.code})`);
21
+ }
22
+ }
23
+ export async function openPath(pi, targetPath) {
24
+ const result = await execOpen(pi, targetPath);
25
+ if (result.code !== 0) {
26
+ throw new Error(result.stderr || `Failed to open path (exit code ${result.code})`);
27
+ }
28
+ }
29
+ export async function parallelLimit(items, limit, fn) {
30
+ const results = [];
31
+ const iterator = items.entries();
32
+ async function worker() {
33
+ while (true) {
34
+ const next = iterator.next();
35
+ if (next.done)
36
+ return;
37
+ const [index, item] = next.value;
38
+ results[index] = await fn(item);
39
+ }
40
+ }
41
+ const workers = Array(Math.min(limit, items.length)).fill(null).map(() => worker());
42
+ await Promise.all(workers);
43
+ return results;
44
+ }
45
+ export function getConfigPathFromArgv() {
46
+ const idx = process.argv.indexOf("--mcp-config");
47
+ if (idx >= 0 && idx + 1 < process.argv.length) {
48
+ return process.argv[idx + 1];
49
+ }
50
+ return;
51
+ }
52
+ export function interpolateEnvVars(value, environment = process.env) {
53
+ return value.replace(/\$\{(\w+)\}/g, (_, name) => environment[name] ?? "").replace(/\$env:(\w+)/g, (_, name) => environment[name] ?? "").replace(/\{env:(\w+)\}/g, (_, name) => environment[name] ?? "");
54
+ }
55
+ function getMissingEnvVars(value, environment) {
56
+ const missing = new Set;
57
+ for (const match of value.matchAll(/\$\{(\w+)\}|\$env:(\w+)|\{env:(\w+)\}/g)) {
58
+ const name = match[1] ?? match[2] ?? match[3];
59
+ if (name && environment[name] === undefined) {
60
+ missing.add(name);
61
+ }
62
+ }
63
+ return [...missing];
64
+ }
65
+ export function toStringRecord(value) {
66
+ if (!value || typeof value !== "object" || Array.isArray(value))
67
+ return;
68
+ const result = {};
69
+ for (const [key, entry] of Object.entries(value)) {
70
+ if (typeof entry === "string")
71
+ result[key] = entry;
72
+ }
73
+ return Object.keys(result).length > 0 ? result : undefined;
74
+ }
75
+ function interpolateSecretExpression(value, environment) {
76
+ if (value.startsWith("!!"))
77
+ return interpolateEnvVars(value.slice(1), environment);
78
+ return value.startsWith("!") ? value : interpolateEnvVars(value, environment);
79
+ }
80
+ export function interpolateEnvRecord(values, environment = process.env) {
81
+ if (!values)
82
+ return;
83
+ return Object.fromEntries(Object.entries(values).map(([key, value]) => [
84
+ key,
85
+ interpolateSecretExpression(value, environment)
86
+ ]));
87
+ }
88
+ const COMMAND_SECRET_TIMEOUT_MS = 1e4;
89
+ const COMMAND_SECRET_MAX_OUTPUT_BYTES = 1024 * 1024;
90
+ export function resolveCommandSecret(value, context) {
91
+ if (value === undefined)
92
+ return;
93
+ if (value.startsWith("!!"))
94
+ return interpolateEnvVars(value.slice(1));
95
+ if (!value.startsWith("!"))
96
+ return interpolateEnvVars(value);
97
+ const result = spawnSync(value.slice(1), {
98
+ shell: true,
99
+ encoding: "utf8",
100
+ timeout: COMMAND_SECRET_TIMEOUT_MS,
101
+ maxBuffer: COMMAND_SECRET_MAX_OUTPUT_BYTES,
102
+ stdio: ["ignore", "pipe", "ignore"],
103
+ windowsHide: true
104
+ });
105
+ if (result.error) {
106
+ const code = result.error.code;
107
+ const reason = code === "ETIMEDOUT" ? "command timed out after 10 seconds" : code === "ENOBUFS" ? "command output exceeded 1 MiB" : "command failed to start";
108
+ throw new Error(`Failed to resolve ${context}: ${reason}`);
109
+ }
110
+ if (result.status !== 0) {
111
+ throw new Error(`Failed to resolve ${context}: command exited with code ${result.status ?? "unknown"}`);
112
+ }
113
+ const resolved = result.stdout.trim();
114
+ if (!resolved)
115
+ throw new Error(`Failed to resolve ${context}: command returned empty output`);
116
+ return resolved;
117
+ }
118
+ export function resolveCommandSecretsRecord(values, context) {
119
+ if (!values)
120
+ return;
121
+ return Object.fromEntries(Object.entries(values).map(([key, value]) => [
122
+ key,
123
+ resolveCommandSecret(value, context(key))
124
+ ]));
125
+ }
126
+ export function resolveServerUrl(definition, environment = process.env) {
127
+ if (definition.url == null)
128
+ return;
129
+ if (typeof definition.url !== "string") {
130
+ throw new Error("MCP server URL must be a string");
131
+ }
132
+ const missing = getMissingEnvVars(definition.url, environment);
133
+ if (missing.length > 0) {
134
+ throw new Error(`Missing environment variable${missing.length === 1 ? "" : "s"} in MCP server URL: ${missing.join(", ")}`);
135
+ }
136
+ const resolved = interpolateEnvVars(definition.url, environment);
137
+ try {
138
+ new URL(resolved);
139
+ } catch (error) {
140
+ throw new Error(`Invalid MCP server URL after environment interpolation: ${resolved}`, { cause: error });
141
+ }
142
+ return resolved;
143
+ }
144
+ export function resolveConfigPath(value, environment = process.env) {
145
+ if (value === undefined)
146
+ return;
147
+ const resolved = interpolateEnvVars(value, environment);
148
+ if (resolved === "~")
149
+ return homedir();
150
+ if (resolved.startsWith("~/") || resolved.startsWith("~\\")) {
151
+ return join(homedir(), resolved.slice(2));
152
+ }
153
+ return resolved;
154
+ }
155
+ export function resolveBearerToken(definition, environment = process.env) {
156
+ if (definition.bearerToken !== undefined) {
157
+ return interpolateSecretExpression(definition.bearerToken, environment);
158
+ }
159
+ return definition.bearerTokenEnv ? environment[definition.bearerTokenEnv] : undefined;
160
+ }
161
+ export function stripOscSequences(text) {
162
+ let result = "";
163
+ let index = 0;
164
+ while (index < text.length) {
165
+ const isEscOsc = text.charCodeAt(index) === 27 && text[index + 1] === "]";
166
+ const isC1Osc = text.charCodeAt(index) === 157;
167
+ if (!isEscOsc && !isC1Osc) {
168
+ result += text[index++];
169
+ continue;
170
+ }
171
+ index += isEscOsc ? 2 : 1;
172
+ while (index < text.length) {
173
+ const code = text.charCodeAt(index++);
174
+ if (code === 7 || code === 156)
175
+ break;
176
+ if (code === 27 && text[index] === "\\") {
177
+ index++;
178
+ break;
179
+ }
180
+ }
181
+ }
182
+ return result;
183
+ }
184
+ export function sanitizeTerminalText(text) {
185
+ return stripOscSequences(text).replace(/(?:\x1b\[[0-?]*[ -/]*[@-~]|\x1b[@-Z\\-_])/g, "").replace(/[\u0000-\u001f\u007f-\u009f]+/g, " ").replace(/\s+/g, " ").trim();
186
+ }
187
+ export function formatTerminalError(error) {
188
+ const messages = [];
189
+ const seen = new Set;
190
+ const collect = (value) => {
191
+ if (seen.has(value))
192
+ return;
193
+ if (typeof value === "object" && value !== null || typeof value === "function")
194
+ seen.add(value);
195
+ if (value instanceof AggregateError) {
196
+ const countBefore = messages.length;
197
+ for (const nested of value.errors)
198
+ collect(nested);
199
+ if (value.cause !== undefined)
200
+ collect(value.cause);
201
+ if (messages.length === countBefore && value.message)
202
+ messages.push(value.message);
203
+ return;
204
+ }
205
+ if (value instanceof Error) {
206
+ if (value.message)
207
+ messages.push(value.message);
208
+ if (value.cause !== undefined)
209
+ collect(value.cause);
210
+ return;
211
+ }
212
+ messages.push(String(value));
213
+ };
214
+ collect(error);
215
+ return sanitizeTerminalText([...new Set(messages)].join(": "));
216
+ }
217
+ export function truncateAtWord(text, target) {
218
+ if (!text || text.length <= target)
219
+ return text;
220
+ const truncated = text.slice(0, target);
221
+ const lastSpace = truncated.lastIndexOf(" ");
222
+ if (lastSpace > target * 0.6) {
223
+ return truncated.slice(0, lastSpace) + "...";
224
+ }
225
+ return truncated + "...";
226
+ }
227
+ export function normalizeDirectToolInputSchema(schema) {
228
+ const inputSchema = schema && typeof schema === "object" && !Array.isArray(schema) ? schema : { type: "object", properties: {} };
229
+ const { $schema, additionalProperties, ...normalized } = inputSchema;
230
+ return normalized;
231
+ }
232
+ export function normalizeToolArguments(value, context = "tool arguments") {
233
+ if (value === undefined || value === null || value === "")
234
+ return {};
235
+ if (typeof value === "string") {
236
+ const trimmed = value.trim();
237
+ if (trimmed === "")
238
+ return {};
239
+ let parsed;
240
+ try {
241
+ parsed = JSON.parse(trimmed);
242
+ } catch (error) {
243
+ throw new Error(`${context}: invalid args JSON (${error instanceof SyntaxError ? error.message : String(error)}); ` + `pass args as a JSON object, or as a valid JSON string encoding one`, { cause: error });
244
+ }
245
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
246
+ throw new Error(`${context}: expected a JSON object, got ${Array.isArray(parsed) ? "array" : typeof parsed}`);
247
+ }
248
+ return parsed;
249
+ }
250
+ if (typeof value !== "object" || Array.isArray(value)) {
251
+ throw new Error(`${context}: expected a JSON object, got ${Array.isArray(value) ? "array" : typeof value}`);
252
+ }
253
+ assertJsonSerializable(value, context);
254
+ try {
255
+ return JSON.parse(JSON.stringify(value));
256
+ } catch (error) {
257
+ throw new Error(`${context}: value is not JSON-serializable: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
258
+ }
259
+ }
260
+ function assertJsonSerializable(value, context, path = "") {
261
+ if (value === null)
262
+ return;
263
+ if (typeof value === "string" || typeof value === "boolean")
264
+ return;
265
+ if (typeof value === "number") {
266
+ if (!Number.isFinite(value))
267
+ throw new Error(`${context}: value at ${path || "root"} is not a finite number`);
268
+ return;
269
+ }
270
+ if (Array.isArray(value)) {
271
+ for (const [index, item] of value.entries())
272
+ assertJsonSerializable(item, context, `${path}[${index}]`);
273
+ return;
274
+ }
275
+ if (typeof value === "object") {
276
+ if (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) {
277
+ throw new Error(`${context}: value at ${path || "root"} is not a plain JSON object`);
278
+ }
279
+ if (Object.getOwnPropertySymbols(value).length > 0) {
280
+ throw new Error(`${context}: value at ${path || "root"} has symbol keys`);
281
+ }
282
+ for (const [key, item] of Object.entries(value)) {
283
+ assertJsonSerializable(item, context, path ? `${path}.${key}` : key);
284
+ }
285
+ return;
286
+ }
287
+ throw new Error(`${context}: value at ${path || "root"} is not JSON-serializable`);
288
+ }
289
+ export function formatAuthRequiredMessage(config, serverName, defaultMessage) {
290
+ const template = config.settings?.authRequiredMessage;
291
+ return template ? template.replaceAll("${server}", serverName) : defaultMessage;
292
+ }
293
+ export function formatMcpStatus(config, message) {
294
+ if (config.settings?.mcpFooterStatus === "off")
295
+ return;
296
+ return `${config.settings?.showStatusIcon === false ? "MCP: " : "\uD83D\uDD0C MCP: "}${message}`;
297
+ }
298
+ export function extractToolUiStreamMode(toolMeta) {
299
+ const uiMeta = toolMeta?.ui;
300
+ if (!uiMeta || typeof uiMeta !== "object")
301
+ return;
302
+ const streamMode = uiMeta["dm-mcp-adapter.streamMode"];
303
+ if (streamMode === "eager" || streamMode === "stream-first") {
304
+ return streamMode;
305
+ }
306
+ return;
307
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duckmind/dm-windows-x64",
3
- "version": "0.63.6",
3
+ "version": "0.63.9",
4
4
  "description": "DuckMind (dm) binary payload for windows x64",
5
5
  "license": "MIT",
6
6
  "os": [
@@ -39,6 +39,18 @@
39
39
  "turndown": "^7.2.0",
40
40
  "undici": "^8.9.0",
41
41
  "unpdf": "^1.6.2",
42
+ "@modelcontextprotocol/client": "2.0.0",
43
+ "@modelcontextprotocol/core": "2.0.0",
44
+ "@modelcontextprotocol/ext-apps": "^1.2.2",
45
+ "@napi-rs/keyring": "^1.3.0",
46
+ "ajv": "^8.17.1",
47
+ "ajv-formats": "^3.0.1",
48
+ "cross-spawn": "^7.0.6",
49
+ "open": "^10.2.0",
50
+ "recheck": "^4.5.0",
51
+ "smol-toml": "^1.6.1",
52
+ "strip-json-comments": "^5.0.3",
53
+ "zod": "^3.25.0 || ^4.0.0",
42
54
  "@sinclair/typebox": "^0.34.48"
43
55
  }
44
56
  }