@di-code/coding-agent 0.1.4 → 0.1.7
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/README.md +79 -42
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +96 -17
- package/dist/cli.js.map +1 -1
- package/dist/core/clipboard-image.d.ts +3 -3
- package/dist/core/clipboard-image.d.ts.map +1 -1
- package/dist/core/clipboard-image.js +26 -13
- package/dist/core/clipboard-image.js.map +1 -1
- package/dist/core/resources/loader.d.ts.map +1 -1
- package/dist/core/resources/loader.js +15 -42
- package/dist/core/resources/loader.js.map +1 -1
- package/dist/core/resources/types.d.ts +6 -9
- package/dist/core/resources/types.d.ts.map +1 -1
- package/dist/core/resources/types.js.map +1 -1
- package/dist/core/session/session-manager.d.ts +12 -1
- package/dist/core/session/session-manager.d.ts.map +1 -1
- package/dist/core/session/session-manager.js +66 -3
- package/dist/core/session/session-manager.js.map +1 -1
- package/dist/core/session/session-storage.d.ts.map +1 -1
- package/dist/core/session/session-storage.js +29 -15
- package/dist/core/session/session-storage.js.map +1 -1
- package/dist/core/session/types.d.ts +6 -1
- package/dist/core/session/types.d.ts.map +1 -1
- package/dist/core/session/types.js +1 -1
- package/dist/core/session/types.js.map +1 -1
- package/dist/core/session.d.ts +23 -1
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +86 -13
- package/dist/core/session.js.map +1 -1
- package/dist/core/system-prompt.js +2 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/file-search.d.ts +14 -0
- package/dist/core/tools/file-search.d.ts.map +1 -0
- package/dist/core/tools/file-search.js +99 -0
- package/dist/core/tools/file-search.js.map +1 -0
- package/dist/core/tools/glob.d.ts +11 -0
- package/dist/core/tools/glob.d.ts.map +1 -0
- package/dist/core/tools/glob.js +44 -0
- package/dist/core/tools/glob.js.map +1 -0
- package/dist/core/tools/grep.d.ts +13 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +67 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/load-skill.d.ts +10 -0
- package/dist/core/tools/load-skill.d.ts.map +1 -0
- package/dist/core/tools/load-skill.js +22 -0
- package/dist/core/tools/load-skill.js.map +1 -0
- package/dist/core/tools/path-boundary.d.ts +2 -0
- package/dist/core/tools/path-boundary.d.ts.map +1 -1
- package/dist/core/tools/path-boundary.js +4 -0
- package/dist/core/tools/path-boundary.js.map +1 -1
- package/dist/core/user-data.d.ts +3 -0
- package/dist/core/user-data.d.ts.map +1 -0
- package/dist/core/user-data.js +8 -0
- package/dist/core/user-data.js.map +1 -0
- package/dist/entry.js +13 -0
- package/dist/entry.js.map +1 -1
- package/dist/extensions/runtime.js +2 -2
- package/dist/extensions/runtime.js.map +1 -1
- package/dist/i18n.d.ts +5 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +225 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +17 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +243 -11
- package/dist/main.js.map +1 -1
- package/dist/mcp/config.d.ts +33 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +211 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/loader.d.ts +21 -0
- package/dist/mcp/loader.d.ts.map +1 -0
- package/dist/mcp/loader.js +60 -0
- package/dist/mcp/loader.js.map +1 -0
- package/dist/mcp/tool-adapter.d.ts +5 -0
- package/dist/mcp/tool-adapter.d.ts.map +1 -0
- package/dist/mcp/tool-adapter.js +149 -0
- package/dist/mcp/tool-adapter.js.map +1 -0
- package/dist/modes/interactive-components.d.ts +2 -2
- package/dist/modes/interactive-components.d.ts.map +1 -1
- package/dist/modes/interactive-components.js +30 -33
- package/dist/modes/interactive-components.js.map +1 -1
- package/dist/modes/interactive-state.d.ts.map +1 -1
- package/dist/modes/interactive-state.js +2 -1
- package/dist/modes/interactive-state.js.map +1 -1
- package/dist/modes/interactive.d.ts +9 -0
- package/dist/modes/interactive.d.ts.map +1 -1
- package/dist/modes/interactive.js +209 -63
- package/dist/modes/interactive.js.map +1 -1
- package/dist/modes/tree-selector.d.ts +30 -0
- package/dist/modes/tree-selector.d.ts.map +1 -0
- package/dist/modes/tree-selector.js +205 -0
- package/dist/modes/tree-selector.js.map +1 -0
- package/dist/plugins/loader.d.ts +19 -1
- package/dist/plugins/loader.d.ts.map +1 -1
- package/dist/plugins/loader.js +21 -2
- package/dist/plugins/loader.js.map +1 -1
- package/dist/provider-onboarding.d.ts.map +1 -1
- package/dist/provider-onboarding.js +119 -22
- package/dist/provider-onboarding.js.map +1 -1
- package/dist/startup.d.ts +34 -2
- package/dist/startup.d.ts.map +1 -1
- package/dist/startup.js +278 -9
- package/dist/startup.js.map +1 -1
- package/package.json +6 -4
package/dist/main.js
CHANGED
|
@@ -2,21 +2,95 @@ import { randomUUID } from "node:crypto";
|
|
|
2
2
|
import { access, readdir, stat } from "node:fs/promises";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { basename, dirname, extname, join, resolve } from "node:path";
|
|
5
|
-
import { ProcessTerminal, TUI } from "@di-code/tui";
|
|
5
|
+
import { ProcessTerminal, TUI, truncateToWidth } from "@di-code/tui";
|
|
6
6
|
import { runCli } from "./cli.js";
|
|
7
7
|
import { loadImageInputs } from "./core/image-input.js";
|
|
8
8
|
import { loadResources } from "./core/resources/loader.js";
|
|
9
9
|
import { SessionManager } from "./core/session/session-manager.js";
|
|
10
10
|
import { AgentSession } from "./core/session.js";
|
|
11
11
|
import { buildSystemPrompt } from "./core/system-prompt.js";
|
|
12
|
+
import { workspaceStorageKey } from "./core/user-data.js";
|
|
12
13
|
import { ProjectTrustManager } from "./extensions/trust.js";
|
|
14
|
+
import { DEFAULT_LOCALE, translate } from "./i18n.js";
|
|
15
|
+
import { addMcpConfig, getMcpConfig, listMcpConfig, removeMcpConfig } from "./mcp/config.js";
|
|
16
|
+
import { loadProjectMcp } from "./mcp/loader.js";
|
|
13
17
|
import { InteractiveMode } from "./modes/interactive.js";
|
|
14
18
|
import { runJsonMode } from "./modes/json.js";
|
|
15
19
|
import { runPrintMode } from "./modes/print.js";
|
|
16
20
|
import { loadPlugins } from "./plugins/loader.js";
|
|
17
21
|
import { PluginManager } from "./plugins/manager.js";
|
|
18
|
-
|
|
22
|
+
import { resolveThinkingLevelPreference } from "./startup.js";
|
|
19
23
|
const MAX_SESSION_QUESTION_LENGTH = 72;
|
|
24
|
+
function defaultSessionDirectory(agentDir, cwd) {
|
|
25
|
+
return join(agentDir, "sessions", workspaceStorageKey(cwd));
|
|
26
|
+
}
|
|
27
|
+
const STARTUP_STATUS_COLORS = {
|
|
28
|
+
error: "\x1b[31m",
|
|
29
|
+
success: "\x1b[32m",
|
|
30
|
+
warning: "\x1b[33m",
|
|
31
|
+
reset: "\x1b[0m",
|
|
32
|
+
};
|
|
33
|
+
function formatMcpStatus(status) {
|
|
34
|
+
switch (status.state) {
|
|
35
|
+
case "connecting":
|
|
36
|
+
return `${STARTUP_STATUS_COLORS.warning}MCP [loading]${STARTUP_STATUS_COLORS.reset} ${status.serverId}`;
|
|
37
|
+
case "connected":
|
|
38
|
+
return `${STARTUP_STATUS_COLORS.success}MCP [ok]${STARTUP_STATUS_COLORS.reset} ${status.serverId} (${status.tools} tools, ${status.resources} resources, ${status.prompts} prompts)`;
|
|
39
|
+
case "failed":
|
|
40
|
+
return `${STARTUP_STATUS_COLORS.error}MCP [error]${STARTUP_STATUS_COLORS.reset} ${status.serverId} (${status.stage}): ${status.message}`;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function formatMcpDiagnostic(serverId, stage, message) {
|
|
44
|
+
return `${STARTUP_STATUS_COLORS.error}MCP [error]${STARTUP_STATUS_COLORS.reset} ${serverId ?? "configuration"} (${stage}): ${message}\n`;
|
|
45
|
+
}
|
|
46
|
+
function formatPluginStatus(status) {
|
|
47
|
+
switch (status.state) {
|
|
48
|
+
case "loading":
|
|
49
|
+
return `${STARTUP_STATUS_COLORS.warning}Plugin [loading]${STARTUP_STATUS_COLORS.reset} ${status.pluginId}`;
|
|
50
|
+
case "loaded":
|
|
51
|
+
return `${STARTUP_STATUS_COLORS.success}Plugin [ok]${STARTUP_STATUS_COLORS.reset} ${status.pluginId} (${status.tools} tools, ${status.commands} commands)`;
|
|
52
|
+
case "failed":
|
|
53
|
+
return `${STARTUP_STATUS_COLORS.error}Plugin [error]${STARTUP_STATUS_COLORS.reset} ${status.pluginId ?? "plugin"} (${status.stage}): ${status.message}`;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function formatPluginDiagnostic(pluginId, stage, message) {
|
|
57
|
+
return `${STARTUP_STATUS_COLORS.error}Plugin [error]${STARTUP_STATUS_COLORS.reset} ${pluginId ?? "plugin"} (${stage}): ${message}\n`;
|
|
58
|
+
}
|
|
59
|
+
function pluginStatusKey(status) {
|
|
60
|
+
if (status.state === "failed" && status.pluginId === undefined)
|
|
61
|
+
return `plugin:${status.sourcePath}`;
|
|
62
|
+
return `plugin:${status.pluginId}`;
|
|
63
|
+
}
|
|
64
|
+
/** Renders startup states in place so terminal history retains only their final outcome. */
|
|
65
|
+
export class StartupStatusRenderer {
|
|
66
|
+
lines = [];
|
|
67
|
+
indexes = new Map();
|
|
68
|
+
write;
|
|
69
|
+
replaceInPlace;
|
|
70
|
+
width;
|
|
71
|
+
constructor(write, replaceInPlace, width = 80) {
|
|
72
|
+
this.write = write;
|
|
73
|
+
this.replaceInPlace = replaceInPlace;
|
|
74
|
+
this.width = width;
|
|
75
|
+
}
|
|
76
|
+
update(key, text) {
|
|
77
|
+
const line = truncateToWidth(text.replace(/[\r\n]+/g, " "), Math.max(1, this.width), "...");
|
|
78
|
+
const index = this.indexes.get(key);
|
|
79
|
+
if (index === undefined || !this.replaceInPlace) {
|
|
80
|
+
this.indexes.set(key, this.lines.length);
|
|
81
|
+
this.lines.push(line);
|
|
82
|
+
this.write(`${line}\n`);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.lines[index] = line;
|
|
86
|
+
const offset = this.lines.length - index;
|
|
87
|
+
this.write(`\x1b[${offset}A\r\x1b[2K${line}\x1b[${offset}B\r`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function startupStatusRenderer(write, interactive) {
|
|
91
|
+
const width = typeof process.stderr.columns === "number" && process.stderr.columns > 0 ? process.stderr.columns : 80;
|
|
92
|
+
return new StartupStatusRenderer(write, interactive && process.stderr.isTTY === true, width);
|
|
93
|
+
}
|
|
20
94
|
async function openOrCreateSession(filePath, cwd, now) {
|
|
21
95
|
try {
|
|
22
96
|
await access(filePath);
|
|
@@ -59,8 +133,30 @@ async function mostRecentSessionPath(sessionDirectory) {
|
|
|
59
133
|
.sort((left, right) => right.modifiedAt - left.modifiedAt || right.filePath.localeCompare(left.filePath))[0]
|
|
60
134
|
?.filePath;
|
|
61
135
|
}
|
|
62
|
-
async function
|
|
63
|
-
const
|
|
136
|
+
async function hasProjectLocalCapabilities(cwd) {
|
|
137
|
+
const directories = [
|
|
138
|
+
join(cwd, ".di-code", "skills"),
|
|
139
|
+
join(cwd, ".agents", "skills"),
|
|
140
|
+
join(cwd, ".di-code", "extensions"),
|
|
141
|
+
join(cwd, ".di-code", "plugins"),
|
|
142
|
+
join(cwd, ".di-code", "mcp.local.json"),
|
|
143
|
+
join(cwd, ".mcp.json"),
|
|
144
|
+
];
|
|
145
|
+
const results = await Promise.all(directories.map(async (directory) => {
|
|
146
|
+
try {
|
|
147
|
+
const metadata = await stat(directory);
|
|
148
|
+
return metadata.isDirectory() || metadata.isFile();
|
|
149
|
+
}
|
|
150
|
+
catch (cause) {
|
|
151
|
+
if (cause instanceof Error && "code" in cause && cause.code === "ENOENT")
|
|
152
|
+
return false;
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
}));
|
|
156
|
+
return results.some(Boolean);
|
|
157
|
+
}
|
|
158
|
+
async function selectStartupSession(command, allowedRoot, agentDir, now) {
|
|
159
|
+
const sessionDirectory = defaultSessionDirectory(agentDir, allowedRoot);
|
|
64
160
|
if (command.sessionPath !== undefined) {
|
|
65
161
|
return openOrCreateSession(resolve(allowedRoot, command.sessionPath), allowedRoot, now);
|
|
66
162
|
}
|
|
@@ -161,6 +257,7 @@ export async function runMain(args, options) {
|
|
|
161
257
|
stdout: options.stdout,
|
|
162
258
|
stderr: options.stderr,
|
|
163
259
|
version: options.version,
|
|
260
|
+
locale: options.locale ?? options.startupConfiguration?.locale ?? DEFAULT_LOCALE,
|
|
164
261
|
plugin: async (command) => {
|
|
165
262
|
const agentDir = resolve(options.agentDir ?? join(homedir(), ".di-code"));
|
|
166
263
|
const manager = new PluginManager({ agentDir });
|
|
@@ -194,45 +291,169 @@ export async function runMain(args, options) {
|
|
|
194
291
|
return 1;
|
|
195
292
|
}
|
|
196
293
|
},
|
|
294
|
+
mcp: async (command) => {
|
|
295
|
+
const cwd = resolve(options.allowedRoot ?? process.cwd());
|
|
296
|
+
const scope = command.scope;
|
|
297
|
+
const trustManager = new ProjectTrustManager(join(options.agentDir ?? join(homedir(), ".di-code"), "trust.json"));
|
|
298
|
+
const requireProjectTrust = async (selected) => {
|
|
299
|
+
if ((selected === "local" || selected === "project") && (await trustManager.get(cwd)) !== true)
|
|
300
|
+
throw new Error(`Project trust is required to modify the ${selected} MCP scope.`);
|
|
301
|
+
};
|
|
302
|
+
try {
|
|
303
|
+
switch (command.action) {
|
|
304
|
+
case "add": {
|
|
305
|
+
const selected = scope ?? "local";
|
|
306
|
+
await requireProjectTrust(selected);
|
|
307
|
+
const config = command.transport === "stdio"
|
|
308
|
+
? {
|
|
309
|
+
command: command.command,
|
|
310
|
+
...(command.args && command.args.length > 0 ? { args: command.args } : {}),
|
|
311
|
+
}
|
|
312
|
+
: { type: "http", url: command.url };
|
|
313
|
+
await addMcpConfig(cwd, selected, command.serverId, config);
|
|
314
|
+
options.stdout(`Added MCP server "${command.serverId}" to ${selected} scope.\n`);
|
|
315
|
+
return 0;
|
|
316
|
+
}
|
|
317
|
+
case "list": {
|
|
318
|
+
const scopes = scope ? [scope] : ["local", "project", "user"];
|
|
319
|
+
for (const selected of scopes) {
|
|
320
|
+
for (const entry of await listMcpConfig(cwd, selected))
|
|
321
|
+
options.stdout(`${entry.id}\t${entry.scope}\t${JSON.stringify(entry.config)}\n`);
|
|
322
|
+
}
|
|
323
|
+
return 0;
|
|
324
|
+
}
|
|
325
|
+
case "get": {
|
|
326
|
+
const entry = await getMcpConfig(cwd, command.serverId, scope);
|
|
327
|
+
if (!entry)
|
|
328
|
+
throw new Error(`MCP server "${command.serverId}" was not found.`);
|
|
329
|
+
options.stdout(`${JSON.stringify({ id: entry.id, scope: entry.scope, config: entry.config })}\n`);
|
|
330
|
+
return 0;
|
|
331
|
+
}
|
|
332
|
+
case "remove": {
|
|
333
|
+
const selected = scope ?? "local";
|
|
334
|
+
await requireProjectTrust(selected);
|
|
335
|
+
await removeMcpConfig(cwd, selected, command.serverId);
|
|
336
|
+
options.stdout(`Removed MCP server "${command.serverId}" from ${selected} scope.\n`);
|
|
337
|
+
return 0;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
catch (cause) {
|
|
342
|
+
options.stderr(`${cause instanceof Error ? cause.message : String(cause)}\n`);
|
|
343
|
+
return 1;
|
|
344
|
+
}
|
|
345
|
+
},
|
|
197
346
|
run: async (command) => {
|
|
198
347
|
const allowedRoot = resolve(options.allowedRoot ?? process.cwd());
|
|
199
348
|
const now = options.now ?? Date.now;
|
|
200
|
-
const runtime = await options.createRuntime(command);
|
|
201
|
-
if (runtime === undefined)
|
|
202
|
-
return 0;
|
|
203
349
|
const agentDir = resolve(options.agentDir ?? join(homedir(), ".di-code"));
|
|
204
350
|
const trustManager = new ProjectTrustManager(join(agentDir, "trust.json"));
|
|
205
351
|
if (command.projectTrust !== undefined)
|
|
206
352
|
await trustManager.set(allowedRoot, command.projectTrust);
|
|
353
|
+
let persistedTrust = await trustManager.get(allowedRoot);
|
|
354
|
+
const shouldPromptForTrust = command.mode === "interactive" &&
|
|
355
|
+
options.isInteractiveTerminal === true &&
|
|
356
|
+
command.projectTrust === undefined &&
|
|
357
|
+
persistedTrust === null &&
|
|
358
|
+
options.promptProjectTrust !== undefined &&
|
|
359
|
+
(await hasProjectLocalCapabilities(allowedRoot));
|
|
360
|
+
if (shouldPromptForTrust) {
|
|
361
|
+
let decision = false;
|
|
362
|
+
try {
|
|
363
|
+
decision = await options.promptProjectTrust(allowedRoot);
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
// Fail closed when the prompt is interrupted or unavailable.
|
|
367
|
+
}
|
|
368
|
+
await trustManager.set(allowedRoot, decision);
|
|
369
|
+
persistedTrust = decision;
|
|
370
|
+
}
|
|
371
|
+
const runtime = await options.createRuntime(command);
|
|
372
|
+
if (runtime === undefined)
|
|
373
|
+
return 0;
|
|
207
374
|
const resources = await loadResources({
|
|
208
375
|
cwd: allowedRoot,
|
|
209
376
|
agentDir,
|
|
210
|
-
projectTrusted:
|
|
377
|
+
projectTrusted: persistedTrust === true,
|
|
211
378
|
noSkills: command.noSkills,
|
|
212
379
|
noContextFiles: command.noContextFiles,
|
|
213
380
|
skillPaths: command.skillPaths,
|
|
214
381
|
});
|
|
382
|
+
for (const diagnostic of resources.diagnostics) {
|
|
383
|
+
if (diagnostic.kind !== "skill")
|
|
384
|
+
continue;
|
|
385
|
+
options.stderr(`${JSON.stringify({ type: "skill_diagnostic", path: diagnostic.path, stage: diagnostic.stage, severity: diagnostic.severity, message: diagnostic.message })}\n`);
|
|
386
|
+
}
|
|
387
|
+
const interactivePluginStatus = command.mode === "interactive";
|
|
388
|
+
const startupStatus = startupStatusRenderer(options.stderr, interactivePluginStatus);
|
|
389
|
+
const pluginStatusFailures = new Set();
|
|
215
390
|
const extensions = await loadPlugins({
|
|
216
391
|
cwd: allowedRoot,
|
|
217
392
|
agentDir,
|
|
218
393
|
trustManager,
|
|
219
394
|
mode: command.mode,
|
|
395
|
+
...(interactivePluginStatus
|
|
396
|
+
? {
|
|
397
|
+
onPluginLoadStatus: (status) => {
|
|
398
|
+
if (status.state === "failed")
|
|
399
|
+
pluginStatusFailures.add(status.sourcePath);
|
|
400
|
+
startupStatus.update(pluginStatusKey(status), formatPluginStatus(status));
|
|
401
|
+
},
|
|
402
|
+
}
|
|
403
|
+
: {}),
|
|
220
404
|
});
|
|
221
405
|
for (const diagnostic of extensions.diagnostics) {
|
|
406
|
+
if (interactivePluginStatus) {
|
|
407
|
+
if (pluginStatusFailures.has(diagnostic.sourcePath))
|
|
408
|
+
continue;
|
|
409
|
+
options.stderr(formatPluginDiagnostic(diagnostic.pluginId, diagnostic.stage, diagnostic.message));
|
|
410
|
+
continue;
|
|
411
|
+
}
|
|
222
412
|
options.stderr(`${JSON.stringify({ type: "plugin_diagnostic", pluginId: diagnostic.pluginId, stage: diagnostic.stage, sourcePath: diagnostic.sourcePath, severity: diagnostic.severity, message: diagnostic.message })}\n`);
|
|
223
413
|
}
|
|
414
|
+
const interactiveMcpStatus = command.mode === "interactive";
|
|
415
|
+
const mcp = await loadProjectMcp({
|
|
416
|
+
cwd: allowedRoot,
|
|
417
|
+
projectTrusted: persistedTrust === true,
|
|
418
|
+
homeDirectory: homedir(),
|
|
419
|
+
reservedToolNames: [
|
|
420
|
+
"read",
|
|
421
|
+
"write",
|
|
422
|
+
"edit",
|
|
423
|
+
"bash",
|
|
424
|
+
"load_skill",
|
|
425
|
+
...extensions.host.listTools().map((tool) => tool.name),
|
|
426
|
+
],
|
|
427
|
+
...(interactiveMcpStatus
|
|
428
|
+
? {
|
|
429
|
+
onServerConnectionStatus: (status) => startupStatus.update(`mcp:${status.serverId}`, formatMcpStatus(status)),
|
|
430
|
+
}
|
|
431
|
+
: {}),
|
|
432
|
+
});
|
|
433
|
+
for (const diagnostic of mcp.diagnostics) {
|
|
434
|
+
if (interactiveMcpStatus) {
|
|
435
|
+
if (diagnostic.serverId && (diagnostic.stage === "connect" || diagnostic.stage === "list_tools"))
|
|
436
|
+
continue;
|
|
437
|
+
options.stderr(formatMcpDiagnostic(diagnostic.serverId, diagnostic.stage, diagnostic.message));
|
|
438
|
+
continue;
|
|
439
|
+
}
|
|
440
|
+
options.stderr(`${JSON.stringify({ type: "mcp_diagnostic", serverId: diagnostic.serverId, stage: diagnostic.stage, message: diagnostic.message })}\n`);
|
|
441
|
+
}
|
|
224
442
|
const systemPrompt = buildSystemPrompt({ cwd: allowedRoot, ...resources });
|
|
225
|
-
const manager = await selectStartupSession(command, allowedRoot, now);
|
|
443
|
+
const manager = await selectStartupSession(command, allowedRoot, agentDir, now);
|
|
226
444
|
const sessionFile = manager.filePath;
|
|
445
|
+
const thinkingLevel = resolveThinkingLevelPreference(options.startupConfiguration, runtime);
|
|
227
446
|
const session = new AgentSession({
|
|
228
447
|
allowedRoot,
|
|
229
448
|
provider: runtime.provider,
|
|
230
449
|
model: runtime.model,
|
|
450
|
+
...(thinkingLevel === undefined ? {} : { thinkingLevel }),
|
|
231
451
|
systemPrompt,
|
|
232
452
|
skills: resources.skills,
|
|
233
453
|
now: options.now,
|
|
234
454
|
sessionManager: manager,
|
|
235
455
|
extensionHost: extensions.host,
|
|
456
|
+
externalTools: mcp.tools,
|
|
236
457
|
});
|
|
237
458
|
const imagePaths = command.imagePaths ?? [];
|
|
238
459
|
const promptRunner = {
|
|
@@ -246,6 +467,7 @@ export async function runMain(args, options) {
|
|
|
246
467
|
}
|
|
247
468
|
finally {
|
|
248
469
|
await extensions.host.emit({ type: "session_shutdown", reason: "user" });
|
|
470
|
+
await mcp.manager.close();
|
|
249
471
|
}
|
|
250
472
|
}
|
|
251
473
|
if (command.mode === "interactive") {
|
|
@@ -254,6 +476,11 @@ export async function runMain(args, options) {
|
|
|
254
476
|
const mode = new InteractiveMode({
|
|
255
477
|
session,
|
|
256
478
|
tui,
|
|
479
|
+
agentDir,
|
|
480
|
+
locale: options.locale ?? options.startupConfiguration?.locale ?? DEFAULT_LOCALE,
|
|
481
|
+
onExit: () => {
|
|
482
|
+
void mcp.manager.close();
|
|
483
|
+
},
|
|
257
484
|
extensionHost: extensions.host,
|
|
258
485
|
...(options.startupConfiguration
|
|
259
486
|
? { providerOnboarding: { configuration: options.startupConfiguration, agentDir } }
|
|
@@ -261,8 +488,8 @@ export async function runMain(args, options) {
|
|
|
261
488
|
sessions: [
|
|
262
489
|
{
|
|
263
490
|
id: "new-session",
|
|
264
|
-
label:
|
|
265
|
-
description:
|
|
491
|
+
label: translate(options.locale ?? options.startupConfiguration?.locale ?? DEFAULT_LOCALE, "newSession"),
|
|
492
|
+
description: translate(options.locale ?? options.startupConfiguration?.locale ?? DEFAULT_LOCALE, "newSessionDescription"),
|
|
266
493
|
open: async () => {
|
|
267
494
|
const filePath = newSessionPath(dirname(sessionFile), now);
|
|
268
495
|
const nextManager = await SessionManager.create({
|
|
@@ -275,11 +502,13 @@ export async function runMain(args, options) {
|
|
|
275
502
|
allowedRoot,
|
|
276
503
|
provider: runtime.provider,
|
|
277
504
|
model: runtime.model,
|
|
505
|
+
...(thinkingLevel === undefined ? {} : { thinkingLevel }),
|
|
278
506
|
systemPrompt,
|
|
279
507
|
skills: resources.skills,
|
|
280
508
|
now: options.now,
|
|
281
509
|
sessionManager: nextManager,
|
|
282
510
|
extensionHost: extensions.host,
|
|
511
|
+
externalTools: mcp.tools,
|
|
283
512
|
});
|
|
284
513
|
},
|
|
285
514
|
},
|
|
@@ -289,11 +518,13 @@ export async function runMain(args, options) {
|
|
|
289
518
|
allowedRoot,
|
|
290
519
|
provider: runtime.provider,
|
|
291
520
|
model: runtime.model,
|
|
521
|
+
...(thinkingLevel === undefined ? {} : { thinkingLevel }),
|
|
292
522
|
systemPrompt,
|
|
293
523
|
skills: resources.skills,
|
|
294
524
|
now: options.now,
|
|
295
525
|
sessionManager: nextManager,
|
|
296
526
|
extensionHost: extensions.host,
|
|
527
|
+
externalTools: mcp.tools,
|
|
297
528
|
});
|
|
298
529
|
})),
|
|
299
530
|
],
|
|
@@ -307,6 +538,7 @@ export async function runMain(args, options) {
|
|
|
307
538
|
}
|
|
308
539
|
finally {
|
|
309
540
|
await extensions.host.emit({ type: "session_shutdown", reason: "user" });
|
|
541
|
+
await mcp.manager.close();
|
|
310
542
|
}
|
|
311
543
|
},
|
|
312
544
|
};
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { access, readdir, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, extname, join, resolve } from \"node:path\";\nimport type { Model, Provider } from \"@di-code/ai\";\nimport { ProcessTerminal, TUI } from \"@di-code/tui\";\nimport { type CliCommand, type CliDependencies, runCli } from \"./cli.ts\";\nimport { loadImageInputs } from \"./core/image-input.ts\";\nimport { loadResources } from \"./core/resources/loader.ts\";\nimport { SessionManager } from \"./core/session/session-manager.ts\";\nimport { AgentSession } from \"./core/session.ts\";\nimport { buildSystemPrompt } from \"./core/system-prompt.ts\";\nimport { ProjectTrustManager } from \"./extensions/trust.ts\";\nimport { InteractiveMode } from \"./modes/interactive.ts\";\nimport { runJsonMode } from \"./modes/json.ts\";\nimport { type PrintIo, runPrintMode } from \"./modes/print.ts\";\nimport { loadPlugins } from \"./plugins/loader.ts\";\nimport { PluginManager } from \"./plugins/manager.ts\";\nimport type { StartupConfiguration } from \"./startup.ts\";\n\nexport interface MainRuntime {\n\treadonly provider: Provider;\n\treadonly model: Model;\n}\n\nexport interface MainOptions extends PrintIo {\n\treadonly version: string;\n\treadonly createRuntime: (\n\t\tcommand: Extract<CliCommand, { kind: \"run\" }>,\n\t) => MainRuntime | undefined | Promise<MainRuntime | undefined>;\n\treadonly allowedRoot?: string;\n\treadonly agentDir?: string;\n\treadonly startupConfiguration?: StartupConfiguration;\n\treadonly now?: () => number;\n}\n\nconst DEFAULT_SESSION_DIRECTORY = join(\".di-code\", \"sessions\");\nconst MAX_SESSION_QUESTION_LENGTH = 72;\n\nasync function openOrCreateSession(filePath: string, cwd: string, now: () => number): Promise<SessionManager> {\n\ttry {\n\t\tawait access(filePath);\n\t\treturn await SessionManager.open(filePath, { now });\n\t} catch (cause) {\n\t\tif (!(cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\")) throw cause;\n\t\treturn SessionManager.create({ filePath, cwd, now, deferCreate: true });\n\t}\n}\n\nfunction newSessionPath(sessionDirectory: string, now: () => number): string {\n\treturn join(sessionDirectory, `session-${now()}-${randomUUID().slice(0, 8)}.jsonl`);\n}\n\nasync function mostRecentSessionPath(sessionDirectory: string): Promise<string | undefined> {\n\tlet names: string[];\n\ttry {\n\t\tnames = (await readdir(sessionDirectory, { withFileTypes: true }))\n\t\t\t.filter((entry) => entry.isFile() && extname(entry.name) === \".jsonl\")\n\t\t\t.map((entry) => entry.name);\n\t} catch (cause) {\n\t\tif (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") return undefined;\n\t\tthrow cause;\n\t}\n\n\tconst candidates = await Promise.all(\n\t\tnames.map(async (name) => {\n\t\t\tconst filePath = join(sessionDirectory, name);\n\t\t\ttry {\n\t\t\t\treturn { filePath, modifiedAt: (await stat(filePath)).mtimeMs };\n\t\t\t} catch (cause) {\n\t\t\t\tif (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") return undefined;\n\t\t\t\tthrow cause;\n\t\t\t}\n\t\t}),\n\t);\n\treturn candidates\n\t\t.filter((candidate): candidate is { filePath: string; modifiedAt: number } => candidate !== undefined)\n\t\t.sort((left, right) => right.modifiedAt - left.modifiedAt || right.filePath.localeCompare(left.filePath))[0]\n\t\t?.filePath;\n}\n\nasync function selectStartupSession(\n\tcommand: Extract<CliCommand, { kind: \"run\" }>,\n\tallowedRoot: string,\n\tnow: () => number,\n): Promise<SessionManager> {\n\tconst sessionDirectory = resolve(allowedRoot, DEFAULT_SESSION_DIRECTORY);\n\tif (command.sessionPath !== undefined) {\n\t\treturn openOrCreateSession(resolve(allowedRoot, command.sessionPath), allowedRoot, now);\n\t}\n\tif (command.continueSession) {\n\t\tconst recentPath = await mostRecentSessionPath(sessionDirectory);\n\t\tif (recentPath !== undefined) return SessionManager.open(recentPath, { now });\n\t}\n\treturn SessionManager.create({\n\t\tfilePath: newSessionPath(sessionDirectory, now),\n\t\tcwd: allowedRoot,\n\t\tnow,\n\t\tdeferCreate: true,\n\t});\n}\n\nfunction formatSessionTimestamp(timestamp: number, fallback: string, timeZone?: string): string {\n\tconst date = new Date(timestamp);\n\tif (Number.isNaN(date.getTime())) return fallback;\n\ttry {\n\t\tconst parts = new Map(\n\t\t\tnew Intl.DateTimeFormat(\"en-CA\", {\n\t\t\t\ttimeZone: timeZone ?? Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t\t\t\tyear: \"numeric\",\n\t\t\t\tmonth: \"2-digit\",\n\t\t\t\tday: \"2-digit\",\n\t\t\t\thour: \"2-digit\",\n\t\t\t\tminute: \"2-digit\",\n\t\t\t\thourCycle: \"h23\",\n\t\t\t})\n\t\t\t\t.formatToParts(date)\n\t\t\t\t.filter((part) => part.type !== \"literal\")\n\t\t\t\t.map((part) => [part.type, part.value]),\n\t\t);\n\t\tconst year = parts.get(\"year\");\n\t\tconst month = parts.get(\"month\");\n\t\tconst day = parts.get(\"day\");\n\t\tconst hour = parts.get(\"hour\");\n\t\tconst minute = parts.get(\"minute\");\n\t\tif (!year || !month || !day || !hour || !minute) return fallback;\n\t\treturn `${year}-${month}-${day} ${hour}:${minute}`;\n\t} catch {\n\t\treturn fallback;\n\t}\n}\n\nexport function formatSessionLabel(manager: SessionManager, timeZone?: string): string {\n\tconst firstUserEntry = manager.entries.find((entry) => entry.type === \"message\" && entry.message.role === \"user\");\n\tconst fileName = basename(manager.filePath, extname(manager.filePath));\n\tif (firstUserEntry?.type !== \"message\" || firstUserEntry.message.role !== \"user\") {\n\t\treturn `${fileName} (${formatSessionTimestamp(Date.parse(manager.header.timestamp), manager.header.timestamp, timeZone)})`;\n\t}\n\n\tconst question = firstUserEntry.message.content\n\t\t.filter((content) => content.type === \"text\")\n\t\t.map((content) => content.text)\n\t\t.join(\" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n\tconst label =\n\t\tquestion.length > MAX_SESSION_QUESTION_LENGTH\n\t\t\t? `${question.slice(0, MAX_SESSION_QUESTION_LENGTH - 3)}...`\n\t\t\t: question || fileName;\n\tconst timestamp = formatSessionTimestamp(firstUserEntry.message.timestamp, firstUserEntry.timestamp, timeZone);\n\treturn `${label} (${timestamp})`;\n}\n\nasync function sessionChoices(\n\tsessionDirectory: string,\n\tcurrentFile: string,\n\topen: (filePath: string) => Promise<AgentSession>,\n): Promise<readonly { id: string; label: string; description: string; open: () => Promise<AgentSession> }[]> {\n\tlet names: string[] = [];\n\ttry {\n\t\tnames = (await readdir(sessionDirectory, { withFileTypes: true }))\n\t\t\t.filter((entry) => entry.isFile() && extname(entry.name) === \".jsonl\")\n\t\t\t.map((entry) => entry.name)\n\t\t\t.sort();\n\t} catch (cause) {\n\t\tif (!(cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\")) throw cause;\n\t}\n\n\treturn Promise.all(\n\t\tnames\n\t\t\t.filter((name) => resolve(sessionDirectory, name) !== resolve(currentFile))\n\t\t\t.map(async (name) => {\n\t\t\t\tconst filePath = join(sessionDirectory, name);\n\t\t\t\tconst id = basename(name, extname(name));\n\t\t\t\tlet label = id;\n\t\t\t\ttry {\n\t\t\t\t\tlabel = formatSessionLabel(await SessionManager.open(filePath));\n\t\t\t\t} catch {\n\t\t\t\t\t// Keep damaged sessions selectable so opening one can report the detailed load error.\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tid,\n\t\t\t\t\tlabel,\n\t\t\t\t\tdescription: filePath,\n\t\t\t\t\topen: () => open(filePath),\n\t\t\t\t};\n\t\t\t}),\n\t);\n}\n\nexport async function runMain(args: readonly string[], options: MainOptions): Promise<number> {\n\tconst dependencies: CliDependencies = {\n\t\tstdout: options.stdout,\n\t\tstderr: options.stderr,\n\t\tversion: options.version,\n\t\tplugin: async (command) => {\n\t\t\tconst agentDir = resolve(options.agentDir ?? join(homedir(), \".di-code\"));\n\t\t\tconst manager = new PluginManager({ agentDir });\n\t\t\ttry {\n\t\t\t\tswitch (command.action) {\n\t\t\t\t\tcase \"list\":\n\t\t\t\t\t\tfor (const plugin of await manager.list())\n\t\t\t\t\t\t\toptions.stdout(`${plugin.id}\\t${plugin.enabled ? \"enabled\" : \"disabled\"}\\t${plugin.manifest.version}\\n`);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\tcase \"install\": {\n\t\t\t\t\t\tconst plugin = await manager.install(command.argument as string);\n\t\t\t\t\t\toptions.stdout(`Installed ${plugin.id}\\n`);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"enable\":\n\t\t\t\t\t\tawait manager.enable(command.argument as string);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\tcase \"disable\":\n\t\t\t\t\t\tawait manager.disable(command.argument as string);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\tawait manager.update(command.argument as string);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\tcase \"remove\":\n\t\t\t\t\t\tawait manager.remove(command.argument as string);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t} catch (cause) {\n\t\t\t\toptions.stderr(`${cause instanceof Error ? cause.message : String(cause)}\\n`);\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t},\n\t\trun: async (command) => {\n\t\t\tconst allowedRoot = resolve(options.allowedRoot ?? process.cwd());\n\t\t\tconst now = options.now ?? Date.now;\n\t\t\tconst runtime = await options.createRuntime(command);\n\t\t\tif (runtime === undefined) return 0;\n\t\t\tconst agentDir = resolve(options.agentDir ?? join(homedir(), \".di-code\"));\n\t\t\tconst trustManager = new ProjectTrustManager(join(agentDir, \"trust.json\"));\n\t\t\tif (command.projectTrust !== undefined) await trustManager.set(allowedRoot, command.projectTrust);\n\t\t\tconst resources = await loadResources({\n\t\t\t\tcwd: allowedRoot,\n\t\t\t\tagentDir,\n\t\t\t\tprojectTrusted: (await trustManager.get(allowedRoot)) === true,\n\t\t\t\tnoSkills: command.noSkills,\n\t\t\t\tnoContextFiles: command.noContextFiles,\n\t\t\t\tskillPaths: command.skillPaths,\n\t\t\t});\n\t\t\tconst extensions = await loadPlugins({\n\t\t\t\tcwd: allowedRoot,\n\t\t\t\tagentDir,\n\t\t\t\ttrustManager,\n\t\t\t\tmode: command.mode,\n\t\t\t});\n\t\t\tfor (const diagnostic of extensions.diagnostics) {\n\t\t\t\toptions.stderr(\n\t\t\t\t\t`${JSON.stringify({ type: \"plugin_diagnostic\", pluginId: diagnostic.pluginId, stage: diagnostic.stage, sourcePath: diagnostic.sourcePath, severity: diagnostic.severity, message: diagnostic.message })}\\n`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst systemPrompt = buildSystemPrompt({ cwd: allowedRoot, ...resources });\n\t\t\tconst manager = await selectStartupSession(command, allowedRoot, now);\n\t\t\tconst sessionFile = manager.filePath;\n\t\t\tconst session = new AgentSession({\n\t\t\t\tallowedRoot,\n\t\t\t\tprovider: runtime.provider,\n\t\t\t\tmodel: runtime.model,\n\t\t\t\tsystemPrompt,\n\t\t\t\tskills: resources.skills,\n\t\t\t\tnow: options.now,\n\t\t\t\tsessionManager: manager,\n\t\t\t\textensionHost: extensions.host,\n\t\t\t});\n\t\t\tconst imagePaths = command.imagePaths ?? [];\n\t\t\tconst promptRunner = {\n\t\t\t\tprompt: async (text: string) => session.promptWithImages(text, await loadImageInputs(imagePaths, allowedRoot)),\n\t\t\t\tsubscribe: session.subscribe.bind(session),\n\t\t\t};\n\t\t\tif (command.mode === \"json\") {\n\t\t\t\tawait extensions.host.emit({ type: \"session_start\", cwd: allowedRoot });\n\t\t\t\ttry {\n\t\t\t\t\treturn await runJsonMode(command.prompt, promptRunner, options);\n\t\t\t\t} finally {\n\t\t\t\t\tawait extensions.host.emit({ type: \"session_shutdown\", reason: \"user\" });\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (command.mode === \"interactive\") {\n\t\t\t\tconst terminal = new ProcessTerminal();\n\t\t\t\tconst tui = new TUI(terminal);\n\t\t\t\tconst mode = new InteractiveMode({\n\t\t\t\t\tsession,\n\t\t\t\t\ttui,\n\t\t\t\t\textensionHost: extensions.host,\n\t\t\t\t\t...(options.startupConfiguration\n\t\t\t\t\t\t? { providerOnboarding: { configuration: options.startupConfiguration, agentDir } }\n\t\t\t\t\t\t: {}),\n\t\t\t\t\tsessions: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"new-session\",\n\t\t\t\t\t\t\tlabel: \"New session\",\n\t\t\t\t\t\t\tdescription: \"Start a new persistent conversation.\",\n\t\t\t\t\t\t\topen: async () => {\n\t\t\t\t\t\t\t\tconst filePath = newSessionPath(dirname(sessionFile), now);\n\t\t\t\t\t\t\t\tconst nextManager = await SessionManager.create({\n\t\t\t\t\t\t\t\t\tfilePath,\n\t\t\t\t\t\t\t\t\tcwd: allowedRoot,\n\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\tdeferCreate: true,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\treturn new AgentSession({\n\t\t\t\t\t\t\t\t\tallowedRoot,\n\t\t\t\t\t\t\t\t\tprovider: runtime.provider,\n\t\t\t\t\t\t\t\t\tmodel: runtime.model,\n\t\t\t\t\t\t\t\t\tsystemPrompt,\n\t\t\t\t\t\t\t\t\tskills: resources.skills,\n\t\t\t\t\t\t\t\t\tnow: options.now,\n\t\t\t\t\t\t\t\t\tsessionManager: nextManager,\n\t\t\t\t\t\t\t\t\textensionHost: extensions.host,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...(await sessionChoices(dirname(sessionFile), sessionFile, async (filePath) => {\n\t\t\t\t\t\t\tconst nextManager = await SessionManager.open(filePath, { now });\n\t\t\t\t\t\t\treturn new AgentSession({\n\t\t\t\t\t\t\t\tallowedRoot,\n\t\t\t\t\t\t\t\tprovider: runtime.provider,\n\t\t\t\t\t\t\t\tmodel: runtime.model,\n\t\t\t\t\t\t\t\tsystemPrompt,\n\t\t\t\t\t\t\t\tskills: resources.skills,\n\t\t\t\t\t\t\t\tnow: options.now,\n\t\t\t\t\t\t\t\tsessionManager: nextManager,\n\t\t\t\t\t\t\t\textensionHost: extensions.host,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})),\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\tmode.start(command.prompt);\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tawait extensions.host.emit({ type: \"session_start\", cwd: allowedRoot });\n\t\t\ttry {\n\t\t\t\treturn await runPrintMode(command.prompt, promptRunner, options);\n\t\t\t} finally {\n\t\t\t\tawait extensions.host.emit({ type: \"session_shutdown\", reason: \"user\" });\n\t\t\t}\n\t\t},\n\t};\n\n\treturn runCli(args, dependencies);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { access, readdir, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, extname, join, resolve } from \"node:path\";\nimport type { Model, Provider } from \"@di-code/ai\";\nimport type { McpServerConnectionStatus } from \"@di-code/mcp\";\nimport { ProcessTerminal, TUI, truncateToWidth } from \"@di-code/tui\";\nimport { type CliCommand, type CliDependencies, runCli } from \"./cli.ts\";\nimport { loadImageInputs } from \"./core/image-input.ts\";\nimport { loadResources } from \"./core/resources/loader.ts\";\nimport { SessionManager } from \"./core/session/session-manager.ts\";\nimport { AgentSession } from \"./core/session.ts\";\nimport { buildSystemPrompt } from \"./core/system-prompt.ts\";\nimport { workspaceStorageKey } from \"./core/user-data.ts\";\nimport { ProjectTrustManager } from \"./extensions/trust.ts\";\nimport { DEFAULT_LOCALE, type Locale, translate } from \"./i18n.ts\";\nimport { addMcpConfig, getMcpConfig, listMcpConfig, type McpConfigScope, removeMcpConfig } from \"./mcp/config.ts\";\nimport { loadProjectMcp } from \"./mcp/loader.ts\";\nimport { InteractiveMode } from \"./modes/interactive.ts\";\nimport { runJsonMode } from \"./modes/json.ts\";\nimport { type PrintIo, runPrintMode } from \"./modes/print.ts\";\nimport { loadPlugins, type PluginLoadStatus } from \"./plugins/loader.ts\";\nimport { PluginManager } from \"./plugins/manager.ts\";\nimport type { StartupConfiguration } from \"./startup.ts\";\nimport { resolveThinkingLevelPreference } from \"./startup.ts\";\n\nexport interface MainRuntime {\n\treadonly provider: Provider;\n\treadonly model: Model;\n}\n\nexport interface MainOptions extends PrintIo {\n\treadonly version: string;\n\treadonly createRuntime: (\n\t\tcommand: Extract<CliCommand, { kind: \"run\" }>,\n\t) => MainRuntime | undefined | Promise<MainRuntime | undefined>;\n\treadonly allowedRoot?: string;\n\treadonly agentDir?: string;\n\treadonly startupConfiguration?: StartupConfiguration;\n\t/** Language for built-in human-facing CLI and terminal text. */\n\treadonly locale?: Locale;\n\treadonly now?: () => number;\n\t/** Whether stdin and stdout are interactive terminals. */\n\treadonly isInteractiveTerminal?: boolean;\n\t/** Ask whether project-local Skills, plugins, and extensions may be loaded. */\n\treadonly promptProjectTrust?: (cwd: string) => Promise<boolean>;\n}\n\nconst MAX_SESSION_QUESTION_LENGTH = 72;\n\nfunction defaultSessionDirectory(agentDir: string, cwd: string): string {\n\treturn join(agentDir, \"sessions\", workspaceStorageKey(cwd));\n}\n\nconst STARTUP_STATUS_COLORS = {\n\terror: \"\\x1b[31m\",\n\tsuccess: \"\\x1b[32m\",\n\twarning: \"\\x1b[33m\",\n\treset: \"\\x1b[0m\",\n} as const;\n\nfunction formatMcpStatus(status: McpServerConnectionStatus): string {\n\tswitch (status.state) {\n\t\tcase \"connecting\":\n\t\t\treturn `${STARTUP_STATUS_COLORS.warning}MCP [loading]${STARTUP_STATUS_COLORS.reset} ${status.serverId}`;\n\t\tcase \"connected\":\n\t\t\treturn `${STARTUP_STATUS_COLORS.success}MCP [ok]${STARTUP_STATUS_COLORS.reset} ${status.serverId} (${status.tools} tools, ${status.resources} resources, ${status.prompts} prompts)`;\n\t\tcase \"failed\":\n\t\t\treturn `${STARTUP_STATUS_COLORS.error}MCP [error]${STARTUP_STATUS_COLORS.reset} ${status.serverId} (${status.stage}): ${status.message}`;\n\t}\n}\n\nfunction formatMcpDiagnostic(serverId: string | undefined, stage: string, message: string): string {\n\treturn `${STARTUP_STATUS_COLORS.error}MCP [error]${STARTUP_STATUS_COLORS.reset} ${serverId ?? \"configuration\"} (${stage}): ${message}\\n`;\n}\n\nfunction formatPluginStatus(status: PluginLoadStatus): string {\n\tswitch (status.state) {\n\t\tcase \"loading\":\n\t\t\treturn `${STARTUP_STATUS_COLORS.warning}Plugin [loading]${STARTUP_STATUS_COLORS.reset} ${status.pluginId}`;\n\t\tcase \"loaded\":\n\t\t\treturn `${STARTUP_STATUS_COLORS.success}Plugin [ok]${STARTUP_STATUS_COLORS.reset} ${status.pluginId} (${status.tools} tools, ${status.commands} commands)`;\n\t\tcase \"failed\":\n\t\t\treturn `${STARTUP_STATUS_COLORS.error}Plugin [error]${STARTUP_STATUS_COLORS.reset} ${status.pluginId ?? \"plugin\"} (${status.stage}): ${status.message}`;\n\t}\n}\n\nfunction formatPluginDiagnostic(pluginId: string | undefined, stage: string, message: string): string {\n\treturn `${STARTUP_STATUS_COLORS.error}Plugin [error]${STARTUP_STATUS_COLORS.reset} ${pluginId ?? \"plugin\"} (${stage}): ${message}\\n`;\n}\n\nfunction pluginStatusKey(status: PluginLoadStatus): string {\n\tif (status.state === \"failed\" && status.pluginId === undefined) return `plugin:${status.sourcePath}`;\n\treturn `plugin:${status.pluginId}`;\n}\n\n/** Renders startup states in place so terminal history retains only their final outcome. */\nexport class StartupStatusRenderer {\n\tprivate readonly lines: string[] = [];\n\tprivate readonly indexes = new Map<string, number>();\n\tprivate readonly write: (text: string) => void;\n\tprivate readonly replaceInPlace: boolean;\n\tprivate readonly width: number;\n\n\tconstructor(write: (text: string) => void, replaceInPlace: boolean, width = 80) {\n\t\tthis.write = write;\n\t\tthis.replaceInPlace = replaceInPlace;\n\t\tthis.width = width;\n\t}\n\n\tupdate(key: string, text: string): void {\n\t\tconst line = truncateToWidth(text.replace(/[\\r\\n]+/g, \" \"), Math.max(1, this.width), \"...\");\n\t\tconst index = this.indexes.get(key);\n\t\tif (index === undefined || !this.replaceInPlace) {\n\t\t\tthis.indexes.set(key, this.lines.length);\n\t\t\tthis.lines.push(line);\n\t\t\tthis.write(`${line}\\n`);\n\t\t\treturn;\n\t\t}\n\t\tthis.lines[index] = line;\n\t\tconst offset = this.lines.length - index;\n\t\tthis.write(`\\x1b[${offset}A\\r\\x1b[2K${line}\\x1b[${offset}B\\r`);\n\t}\n}\n\nfunction startupStatusRenderer(write: (text: string) => void, interactive: boolean): StartupStatusRenderer {\n\tconst width = typeof process.stderr.columns === \"number\" && process.stderr.columns > 0 ? process.stderr.columns : 80;\n\treturn new StartupStatusRenderer(write, interactive && process.stderr.isTTY === true, width);\n}\n\nasync function openOrCreateSession(filePath: string, cwd: string, now: () => number): Promise<SessionManager> {\n\ttry {\n\t\tawait access(filePath);\n\t\treturn await SessionManager.open(filePath, { now });\n\t} catch (cause) {\n\t\tif (!(cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\")) throw cause;\n\t\treturn SessionManager.create({ filePath, cwd, now, deferCreate: true });\n\t}\n}\n\nfunction newSessionPath(sessionDirectory: string, now: () => number): string {\n\treturn join(sessionDirectory, `session-${now()}-${randomUUID().slice(0, 8)}.jsonl`);\n}\n\nasync function mostRecentSessionPath(sessionDirectory: string): Promise<string | undefined> {\n\tlet names: string[];\n\ttry {\n\t\tnames = (await readdir(sessionDirectory, { withFileTypes: true }))\n\t\t\t.filter((entry) => entry.isFile() && extname(entry.name) === \".jsonl\")\n\t\t\t.map((entry) => entry.name);\n\t} catch (cause) {\n\t\tif (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") return undefined;\n\t\tthrow cause;\n\t}\n\n\tconst candidates = await Promise.all(\n\t\tnames.map(async (name) => {\n\t\t\tconst filePath = join(sessionDirectory, name);\n\t\t\ttry {\n\t\t\t\treturn { filePath, modifiedAt: (await stat(filePath)).mtimeMs };\n\t\t\t} catch (cause) {\n\t\t\t\tif (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") return undefined;\n\t\t\t\tthrow cause;\n\t\t\t}\n\t\t}),\n\t);\n\treturn candidates\n\t\t.filter((candidate): candidate is { filePath: string; modifiedAt: number } => candidate !== undefined)\n\t\t.sort((left, right) => right.modifiedAt - left.modifiedAt || right.filePath.localeCompare(left.filePath))[0]\n\t\t?.filePath;\n}\n\nasync function hasProjectLocalCapabilities(cwd: string): Promise<boolean> {\n\tconst directories = [\n\t\tjoin(cwd, \".di-code\", \"skills\"),\n\t\tjoin(cwd, \".agents\", \"skills\"),\n\t\tjoin(cwd, \".di-code\", \"extensions\"),\n\t\tjoin(cwd, \".di-code\", \"plugins\"),\n\t\tjoin(cwd, \".di-code\", \"mcp.local.json\"),\n\t\tjoin(cwd, \".mcp.json\"),\n\t];\n\tconst results = await Promise.all(\n\t\tdirectories.map(async (directory) => {\n\t\t\ttry {\n\t\t\t\tconst metadata = await stat(directory);\n\t\t\t\treturn metadata.isDirectory() || metadata.isFile();\n\t\t\t} catch (cause) {\n\t\t\t\tif (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") return false;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}),\n\t);\n\treturn results.some(Boolean);\n}\n\nasync function selectStartupSession(\n\tcommand: Extract<CliCommand, { kind: \"run\" }>,\n\tallowedRoot: string,\n\tagentDir: string,\n\tnow: () => number,\n): Promise<SessionManager> {\n\tconst sessionDirectory = defaultSessionDirectory(agentDir, allowedRoot);\n\tif (command.sessionPath !== undefined) {\n\t\treturn openOrCreateSession(resolve(allowedRoot, command.sessionPath), allowedRoot, now);\n\t}\n\tif (command.continueSession) {\n\t\tconst recentPath = await mostRecentSessionPath(sessionDirectory);\n\t\tif (recentPath !== undefined) return SessionManager.open(recentPath, { now });\n\t}\n\treturn SessionManager.create({\n\t\tfilePath: newSessionPath(sessionDirectory, now),\n\t\tcwd: allowedRoot,\n\t\tnow,\n\t\tdeferCreate: true,\n\t});\n}\n\nfunction formatSessionTimestamp(timestamp: number, fallback: string, timeZone?: string): string {\n\tconst date = new Date(timestamp);\n\tif (Number.isNaN(date.getTime())) return fallback;\n\ttry {\n\t\tconst parts = new Map(\n\t\t\tnew Intl.DateTimeFormat(\"en-CA\", {\n\t\t\t\ttimeZone: timeZone ?? Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t\t\t\tyear: \"numeric\",\n\t\t\t\tmonth: \"2-digit\",\n\t\t\t\tday: \"2-digit\",\n\t\t\t\thour: \"2-digit\",\n\t\t\t\tminute: \"2-digit\",\n\t\t\t\thourCycle: \"h23\",\n\t\t\t})\n\t\t\t\t.formatToParts(date)\n\t\t\t\t.filter((part) => part.type !== \"literal\")\n\t\t\t\t.map((part) => [part.type, part.value]),\n\t\t);\n\t\tconst year = parts.get(\"year\");\n\t\tconst month = parts.get(\"month\");\n\t\tconst day = parts.get(\"day\");\n\t\tconst hour = parts.get(\"hour\");\n\t\tconst minute = parts.get(\"minute\");\n\t\tif (!year || !month || !day || !hour || !minute) return fallback;\n\t\treturn `${year}-${month}-${day} ${hour}:${minute}`;\n\t} catch {\n\t\treturn fallback;\n\t}\n}\n\nexport function formatSessionLabel(manager: SessionManager, timeZone?: string): string {\n\tconst firstUserEntry = manager.entries.find((entry) => entry.type === \"message\" && entry.message.role === \"user\");\n\tconst fileName = basename(manager.filePath, extname(manager.filePath));\n\tif (firstUserEntry?.type !== \"message\" || firstUserEntry.message.role !== \"user\") {\n\t\treturn `${fileName} (${formatSessionTimestamp(Date.parse(manager.header.timestamp), manager.header.timestamp, timeZone)})`;\n\t}\n\n\tconst question = firstUserEntry.message.content\n\t\t.filter((content) => content.type === \"text\")\n\t\t.map((content) => content.text)\n\t\t.join(\" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n\tconst label =\n\t\tquestion.length > MAX_SESSION_QUESTION_LENGTH\n\t\t\t? `${question.slice(0, MAX_SESSION_QUESTION_LENGTH - 3)}...`\n\t\t\t: question || fileName;\n\tconst timestamp = formatSessionTimestamp(firstUserEntry.message.timestamp, firstUserEntry.timestamp, timeZone);\n\treturn `${label} (${timestamp})`;\n}\n\nasync function sessionChoices(\n\tsessionDirectory: string,\n\tcurrentFile: string,\n\topen: (filePath: string) => Promise<AgentSession>,\n): Promise<readonly { id: string; label: string; description: string; open: () => Promise<AgentSession> }[]> {\n\tlet names: string[] = [];\n\ttry {\n\t\tnames = (await readdir(sessionDirectory, { withFileTypes: true }))\n\t\t\t.filter((entry) => entry.isFile() && extname(entry.name) === \".jsonl\")\n\t\t\t.map((entry) => entry.name)\n\t\t\t.sort();\n\t} catch (cause) {\n\t\tif (!(cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\")) throw cause;\n\t}\n\n\treturn Promise.all(\n\t\tnames\n\t\t\t.filter((name) => resolve(sessionDirectory, name) !== resolve(currentFile))\n\t\t\t.map(async (name) => {\n\t\t\t\tconst filePath = join(sessionDirectory, name);\n\t\t\t\tconst id = basename(name, extname(name));\n\t\t\t\tlet label = id;\n\t\t\t\ttry {\n\t\t\t\t\tlabel = formatSessionLabel(await SessionManager.open(filePath));\n\t\t\t\t} catch {\n\t\t\t\t\t// Keep damaged sessions selectable so opening one can report the detailed load error.\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tid,\n\t\t\t\t\tlabel,\n\t\t\t\t\tdescription: filePath,\n\t\t\t\t\topen: () => open(filePath),\n\t\t\t\t};\n\t\t\t}),\n\t);\n}\n\nexport async function runMain(args: readonly string[], options: MainOptions): Promise<number> {\n\tconst dependencies: CliDependencies = {\n\t\tstdout: options.stdout,\n\t\tstderr: options.stderr,\n\t\tversion: options.version,\n\t\tlocale: options.locale ?? options.startupConfiguration?.locale ?? DEFAULT_LOCALE,\n\t\tplugin: async (command) => {\n\t\t\tconst agentDir = resolve(options.agentDir ?? join(homedir(), \".di-code\"));\n\t\t\tconst manager = new PluginManager({ agentDir });\n\t\t\ttry {\n\t\t\t\tswitch (command.action) {\n\t\t\t\t\tcase \"list\":\n\t\t\t\t\t\tfor (const plugin of await manager.list())\n\t\t\t\t\t\t\toptions.stdout(`${plugin.id}\\t${plugin.enabled ? \"enabled\" : \"disabled\"}\\t${plugin.manifest.version}\\n`);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\tcase \"install\": {\n\t\t\t\t\t\tconst plugin = await manager.install(command.argument as string);\n\t\t\t\t\t\toptions.stdout(`Installed ${plugin.id}\\n`);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"enable\":\n\t\t\t\t\t\tawait manager.enable(command.argument as string);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\tcase \"disable\":\n\t\t\t\t\t\tawait manager.disable(command.argument as string);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\tawait manager.update(command.argument as string);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\tcase \"remove\":\n\t\t\t\t\t\tawait manager.remove(command.argument as string);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t} catch (cause) {\n\t\t\t\toptions.stderr(`${cause instanceof Error ? cause.message : String(cause)}\\n`);\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t},\n\t\tmcp: async (command) => {\n\t\t\tconst cwd = resolve(options.allowedRoot ?? process.cwd());\n\t\t\tconst scope = command.scope;\n\t\t\tconst trustManager = new ProjectTrustManager(join(options.agentDir ?? join(homedir(), \".di-code\"), \"trust.json\"));\n\t\t\tconst requireProjectTrust = async (selected: McpConfigScope): Promise<void> => {\n\t\t\t\tif ((selected === \"local\" || selected === \"project\") && (await trustManager.get(cwd)) !== true)\n\t\t\t\t\tthrow new Error(`Project trust is required to modify the ${selected} MCP scope.`);\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tswitch (command.action) {\n\t\t\t\t\tcase \"add\": {\n\t\t\t\t\t\tconst selected = scope ?? \"local\";\n\t\t\t\t\t\tawait requireProjectTrust(selected);\n\t\t\t\t\t\tconst config =\n\t\t\t\t\t\t\tcommand.transport === \"stdio\"\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\tcommand: command.command,\n\t\t\t\t\t\t\t\t\t\t...(command.args && command.args.length > 0 ? { args: command.args } : {}),\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: { type: \"http\", url: command.url };\n\t\t\t\t\t\tawait addMcpConfig(cwd, selected, command.serverId as string, config);\n\t\t\t\t\t\toptions.stdout(`Added MCP server \"${command.serverId}\" to ${selected} scope.\\n`);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"list\": {\n\t\t\t\t\t\tconst scopes: readonly McpConfigScope[] = scope ? [scope] : [\"local\", \"project\", \"user\"];\n\t\t\t\t\t\tfor (const selected of scopes) {\n\t\t\t\t\t\t\tfor (const entry of await listMcpConfig(cwd, selected))\n\t\t\t\t\t\t\t\toptions.stdout(`${entry.id}\\t${entry.scope}\\t${JSON.stringify(entry.config)}\\n`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"get\": {\n\t\t\t\t\t\tconst entry = await getMcpConfig(cwd, command.serverId as string, scope);\n\t\t\t\t\t\tif (!entry) throw new Error(`MCP server \"${command.serverId}\" was not found.`);\n\t\t\t\t\t\toptions.stdout(`${JSON.stringify({ id: entry.id, scope: entry.scope, config: entry.config })}\\n`);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"remove\": {\n\t\t\t\t\t\tconst selected = scope ?? \"local\";\n\t\t\t\t\t\tawait requireProjectTrust(selected);\n\t\t\t\t\t\tawait removeMcpConfig(cwd, selected, command.serverId as string);\n\t\t\t\t\t\toptions.stdout(`Removed MCP server \"${command.serverId}\" from ${selected} scope.\\n`);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (cause) {\n\t\t\t\toptions.stderr(`${cause instanceof Error ? cause.message : String(cause)}\\n`);\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t},\n\t\trun: async (command) => {\n\t\t\tconst allowedRoot = resolve(options.allowedRoot ?? process.cwd());\n\t\t\tconst now = options.now ?? Date.now;\n\t\t\tconst agentDir = resolve(options.agentDir ?? join(homedir(), \".di-code\"));\n\t\t\tconst trustManager = new ProjectTrustManager(join(agentDir, \"trust.json\"));\n\t\t\tif (command.projectTrust !== undefined) await trustManager.set(allowedRoot, command.projectTrust);\n\t\t\tlet persistedTrust = await trustManager.get(allowedRoot);\n\t\t\tconst shouldPromptForTrust =\n\t\t\t\tcommand.mode === \"interactive\" &&\n\t\t\t\toptions.isInteractiveTerminal === true &&\n\t\t\t\tcommand.projectTrust === undefined &&\n\t\t\t\tpersistedTrust === null &&\n\t\t\t\toptions.promptProjectTrust !== undefined &&\n\t\t\t\t(await hasProjectLocalCapabilities(allowedRoot));\n\t\t\tif (shouldPromptForTrust) {\n\t\t\t\tlet decision = false;\n\t\t\t\ttry {\n\t\t\t\t\tdecision = await options.promptProjectTrust(allowedRoot);\n\t\t\t\t} catch {\n\t\t\t\t\t// Fail closed when the prompt is interrupted or unavailable.\n\t\t\t\t}\n\t\t\t\tawait trustManager.set(allowedRoot, decision);\n\t\t\t\tpersistedTrust = decision;\n\t\t\t}\n\t\t\tconst runtime = await options.createRuntime(command);\n\t\t\tif (runtime === undefined) return 0;\n\t\t\tconst resources = await loadResources({\n\t\t\t\tcwd: allowedRoot,\n\t\t\t\tagentDir,\n\t\t\t\tprojectTrusted: persistedTrust === true,\n\t\t\t\tnoSkills: command.noSkills,\n\t\t\t\tnoContextFiles: command.noContextFiles,\n\t\t\t\tskillPaths: command.skillPaths,\n\t\t\t});\n\t\t\tfor (const diagnostic of resources.diagnostics) {\n\t\t\t\tif (diagnostic.kind !== \"skill\") continue;\n\t\t\t\toptions.stderr(\n\t\t\t\t\t`${JSON.stringify({ type: \"skill_diagnostic\", path: diagnostic.path, stage: diagnostic.stage, severity: diagnostic.severity, message: diagnostic.message })}\\n`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst interactivePluginStatus = command.mode === \"interactive\";\n\t\t\tconst startupStatus = startupStatusRenderer(options.stderr, interactivePluginStatus);\n\t\t\tconst pluginStatusFailures = new Set<string>();\n\t\t\tconst extensions = await loadPlugins({\n\t\t\t\tcwd: allowedRoot,\n\t\t\t\tagentDir,\n\t\t\t\ttrustManager,\n\t\t\t\tmode: command.mode,\n\t\t\t\t...(interactivePluginStatus\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tonPluginLoadStatus: (status) => {\n\t\t\t\t\t\t\t\tif (status.state === \"failed\") pluginStatusFailures.add(status.sourcePath);\n\t\t\t\t\t\t\t\tstartupStatus.update(pluginStatusKey(status), formatPluginStatus(status));\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t});\n\t\t\tfor (const diagnostic of extensions.diagnostics) {\n\t\t\t\tif (interactivePluginStatus) {\n\t\t\t\t\tif (pluginStatusFailures.has(diagnostic.sourcePath)) continue;\n\t\t\t\t\toptions.stderr(formatPluginDiagnostic(diagnostic.pluginId, diagnostic.stage, diagnostic.message));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\toptions.stderr(\n\t\t\t\t\t`${JSON.stringify({ type: \"plugin_diagnostic\", pluginId: diagnostic.pluginId, stage: diagnostic.stage, sourcePath: diagnostic.sourcePath, severity: diagnostic.severity, message: diagnostic.message })}\\n`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst interactiveMcpStatus = command.mode === \"interactive\";\n\t\t\tconst mcp = await loadProjectMcp({\n\t\t\t\tcwd: allowedRoot,\n\t\t\t\tprojectTrusted: persistedTrust === true,\n\t\t\t\thomeDirectory: homedir(),\n\t\t\t\treservedToolNames: [\n\t\t\t\t\t\"read\",\n\t\t\t\t\t\"write\",\n\t\t\t\t\t\"edit\",\n\t\t\t\t\t\"bash\",\n\t\t\t\t\t\"load_skill\",\n\t\t\t\t\t...extensions.host.listTools().map((tool) => tool.name),\n\t\t\t\t],\n\t\t\t\t...(interactiveMcpStatus\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tonServerConnectionStatus: (status) =>\n\t\t\t\t\t\t\t\tstartupStatus.update(`mcp:${status.serverId}`, formatMcpStatus(status)),\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t});\n\t\t\tfor (const diagnostic of mcp.diagnostics) {\n\t\t\t\tif (interactiveMcpStatus) {\n\t\t\t\t\tif (diagnostic.serverId && (diagnostic.stage === \"connect\" || diagnostic.stage === \"list_tools\")) continue;\n\t\t\t\t\toptions.stderr(formatMcpDiagnostic(diagnostic.serverId, diagnostic.stage, diagnostic.message));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\toptions.stderr(\n\t\t\t\t\t`${JSON.stringify({ type: \"mcp_diagnostic\", serverId: diagnostic.serverId, stage: diagnostic.stage, message: diagnostic.message })}\\n`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst systemPrompt = buildSystemPrompt({ cwd: allowedRoot, ...resources });\n\t\t\tconst manager = await selectStartupSession(command, allowedRoot, agentDir, now);\n\t\t\tconst sessionFile = manager.filePath;\n\t\t\tconst thinkingLevel = resolveThinkingLevelPreference(options.startupConfiguration, runtime);\n\t\t\tconst session = new AgentSession({\n\t\t\t\tallowedRoot,\n\t\t\t\tprovider: runtime.provider,\n\t\t\t\tmodel: runtime.model,\n\t\t\t\t...(thinkingLevel === undefined ? {} : { thinkingLevel }),\n\t\t\t\tsystemPrompt,\n\t\t\t\tskills: resources.skills,\n\t\t\t\tnow: options.now,\n\t\t\t\tsessionManager: manager,\n\t\t\t\textensionHost: extensions.host,\n\t\t\t\texternalTools: mcp.tools,\n\t\t\t});\n\t\t\tconst imagePaths = command.imagePaths ?? [];\n\t\t\tconst promptRunner = {\n\t\t\t\tprompt: async (text: string) => session.promptWithImages(text, await loadImageInputs(imagePaths, allowedRoot)),\n\t\t\t\tsubscribe: session.subscribe.bind(session),\n\t\t\t};\n\t\t\tif (command.mode === \"json\") {\n\t\t\t\tawait extensions.host.emit({ type: \"session_start\", cwd: allowedRoot });\n\t\t\t\ttry {\n\t\t\t\t\treturn await runJsonMode(command.prompt, promptRunner, options);\n\t\t\t\t} finally {\n\t\t\t\t\tawait extensions.host.emit({ type: \"session_shutdown\", reason: \"user\" });\n\t\t\t\t\tawait mcp.manager.close();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (command.mode === \"interactive\") {\n\t\t\t\tconst terminal = new ProcessTerminal();\n\t\t\t\tconst tui = new TUI(terminal);\n\t\t\t\tconst mode = new InteractiveMode({\n\t\t\t\t\tsession,\n\t\t\t\t\ttui,\n\t\t\t\t\tagentDir,\n\t\t\t\t\tlocale: options.locale ?? options.startupConfiguration?.locale ?? DEFAULT_LOCALE,\n\t\t\t\t\tonExit: () => {\n\t\t\t\t\t\tvoid mcp.manager.close();\n\t\t\t\t\t},\n\t\t\t\t\textensionHost: extensions.host,\n\t\t\t\t\t...(options.startupConfiguration\n\t\t\t\t\t\t? { providerOnboarding: { configuration: options.startupConfiguration, agentDir } }\n\t\t\t\t\t\t: {}),\n\t\t\t\t\tsessions: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"new-session\",\n\t\t\t\t\t\t\tlabel: translate(options.locale ?? options.startupConfiguration?.locale ?? DEFAULT_LOCALE, \"newSession\"),\n\t\t\t\t\t\t\tdescription: translate(\n\t\t\t\t\t\t\t\toptions.locale ?? options.startupConfiguration?.locale ?? DEFAULT_LOCALE,\n\t\t\t\t\t\t\t\t\"newSessionDescription\",\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\topen: async () => {\n\t\t\t\t\t\t\t\tconst filePath = newSessionPath(dirname(sessionFile), now);\n\t\t\t\t\t\t\t\tconst nextManager = await SessionManager.create({\n\t\t\t\t\t\t\t\t\tfilePath,\n\t\t\t\t\t\t\t\t\tcwd: allowedRoot,\n\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\tdeferCreate: true,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\treturn new AgentSession({\n\t\t\t\t\t\t\t\t\tallowedRoot,\n\t\t\t\t\t\t\t\t\tprovider: runtime.provider,\n\t\t\t\t\t\t\t\t\tmodel: runtime.model,\n\t\t\t\t\t\t\t\t\t...(thinkingLevel === undefined ? {} : { thinkingLevel }),\n\t\t\t\t\t\t\t\t\tsystemPrompt,\n\t\t\t\t\t\t\t\t\tskills: resources.skills,\n\t\t\t\t\t\t\t\t\tnow: options.now,\n\t\t\t\t\t\t\t\t\tsessionManager: nextManager,\n\t\t\t\t\t\t\t\t\textensionHost: extensions.host,\n\t\t\t\t\t\t\t\t\texternalTools: mcp.tools,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...(await sessionChoices(dirname(sessionFile), sessionFile, async (filePath) => {\n\t\t\t\t\t\t\tconst nextManager = await SessionManager.open(filePath, { now });\n\t\t\t\t\t\t\treturn new AgentSession({\n\t\t\t\t\t\t\t\tallowedRoot,\n\t\t\t\t\t\t\t\tprovider: runtime.provider,\n\t\t\t\t\t\t\t\tmodel: runtime.model,\n\t\t\t\t\t\t\t\t...(thinkingLevel === undefined ? {} : { thinkingLevel }),\n\t\t\t\t\t\t\t\tsystemPrompt,\n\t\t\t\t\t\t\t\tskills: resources.skills,\n\t\t\t\t\t\t\t\tnow: options.now,\n\t\t\t\t\t\t\t\tsessionManager: nextManager,\n\t\t\t\t\t\t\t\textensionHost: extensions.host,\n\t\t\t\t\t\t\t\texternalTools: mcp.tools,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})),\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\tmode.start(command.prompt);\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tawait extensions.host.emit({ type: \"session_start\", cwd: allowedRoot });\n\t\t\ttry {\n\t\t\t\treturn await runPrintMode(command.prompt, promptRunner, options);\n\t\t\t} finally {\n\t\t\t\tawait extensions.host.emit({ type: \"session_shutdown\", reason: \"user\" });\n\t\t\t\tawait mcp.manager.close();\n\t\t\t}\n\t\t},\n\t};\n\n\treturn runCli(args, dependencies);\n}\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { McpServerConfig } from "@di-code/mcp";
|
|
2
|
+
declare const SERVER_ID_PATTERN: RegExp;
|
|
3
|
+
export type McpConfigScope = "local" | "project" | "user";
|
|
4
|
+
type Environment = Readonly<Record<string, string | undefined>>;
|
|
5
|
+
export interface McpConfigDocument {
|
|
6
|
+
readonly mcpServers: Readonly<Record<string, unknown>>;
|
|
7
|
+
}
|
|
8
|
+
export declare function mcpConfigPath(cwd: string, scope?: McpConfigScope, homeDirectory?: string): string;
|
|
9
|
+
export declare function readMcpConfigScope(cwd: string, scope: McpConfigScope, homeDirectory?: string): Promise<McpConfigDocument>;
|
|
10
|
+
export declare function loadMcpConfig(cwd: string, environment?: Environment): Promise<readonly McpServerConfig[]>;
|
|
11
|
+
export declare function loadEffectiveMcpConfig(options: {
|
|
12
|
+
cwd: string;
|
|
13
|
+
homeDirectory?: string;
|
|
14
|
+
environment?: Environment;
|
|
15
|
+
projectTrusted: boolean;
|
|
16
|
+
}): Promise<readonly McpServerConfig[]>;
|
|
17
|
+
export declare function listMcpConfig(cwd: string, scope: McpConfigScope, homeDirectory?: string): Promise<readonly {
|
|
18
|
+
id: string;
|
|
19
|
+
scope: McpConfigScope;
|
|
20
|
+
config: unknown;
|
|
21
|
+
}[]>;
|
|
22
|
+
export declare function getMcpConfig(cwd: string, id: string, scope?: McpConfigScope, homeDirectory?: string): Promise<{
|
|
23
|
+
id: string;
|
|
24
|
+
scope: McpConfigScope;
|
|
25
|
+
config: unknown;
|
|
26
|
+
} | undefined>;
|
|
27
|
+
export declare function addMcpConfig(cwd: string, scope: McpConfigScope, id: string, config: unknown, options?: {
|
|
28
|
+
homeDirectory?: string;
|
|
29
|
+
environment?: Environment;
|
|
30
|
+
}): Promise<void>;
|
|
31
|
+
export declare function removeMcpConfig(cwd: string, scope: McpConfigScope, id: string, homeDirectory?: string): Promise<void>;
|
|
32
|
+
export { SERVER_ID_PATTERN };
|
|
33
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAKpD,QAAA,MAAM,iBAAiB,QAA+B,CAAC;AACvD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAC1D,KAAK,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAChE,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD;AAqGD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,cAA0B,EAAE,aAAa,SAAY,GAAG,MAAM,CAM/G;AAwBD,wBAAsB,kBAAkB,CACvC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,cAAc,EACrB,aAAa,SAAY,GACvB,OAAO,CAAC,iBAAiB,CAAC,CAE5B;AAED,wBAAsB,aAAa,CAClC,GAAG,EAAE,MAAM,EACX,WAAW,GAAE,WAAyB,GACpC,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAKrC;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAWtC;AAkBD,wBAAsB,aAAa,CAClC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,cAAc,EACrB,aAAa,SAAY,GACvB,OAAO,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,EAAE,CAAC,CAK5E;AAED,wBAAsB,YAAY,CACjC,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,EACV,KAAK,CAAC,EAAE,cAAc,EACtB,aAAa,SAAY,GACvB,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC,CAO7E;AAoBD,wBAAsB,YAAY,CACjC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,cAAc,EACrB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,EACf,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,WAAW,CAAA;CAAO,GACjE,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,eAAe,CACpC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,cAAc,EACrB,EAAE,EAAE,MAAM,EACV,aAAa,SAAY,GACvB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|