@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.
Files changed (111) hide show
  1. package/README.md +79 -42
  2. package/dist/cli.d.ts +15 -0
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +96 -17
  5. package/dist/cli.js.map +1 -1
  6. package/dist/core/clipboard-image.d.ts +3 -3
  7. package/dist/core/clipboard-image.d.ts.map +1 -1
  8. package/dist/core/clipboard-image.js +26 -13
  9. package/dist/core/clipboard-image.js.map +1 -1
  10. package/dist/core/resources/loader.d.ts.map +1 -1
  11. package/dist/core/resources/loader.js +15 -42
  12. package/dist/core/resources/loader.js.map +1 -1
  13. package/dist/core/resources/types.d.ts +6 -9
  14. package/dist/core/resources/types.d.ts.map +1 -1
  15. package/dist/core/resources/types.js.map +1 -1
  16. package/dist/core/session/session-manager.d.ts +12 -1
  17. package/dist/core/session/session-manager.d.ts.map +1 -1
  18. package/dist/core/session/session-manager.js +66 -3
  19. package/dist/core/session/session-manager.js.map +1 -1
  20. package/dist/core/session/session-storage.d.ts.map +1 -1
  21. package/dist/core/session/session-storage.js +29 -15
  22. package/dist/core/session/session-storage.js.map +1 -1
  23. package/dist/core/session/types.d.ts +6 -1
  24. package/dist/core/session/types.d.ts.map +1 -1
  25. package/dist/core/session/types.js +1 -1
  26. package/dist/core/session/types.js.map +1 -1
  27. package/dist/core/session.d.ts +23 -1
  28. package/dist/core/session.d.ts.map +1 -1
  29. package/dist/core/session.js +86 -13
  30. package/dist/core/session.js.map +1 -1
  31. package/dist/core/system-prompt.js +2 -2
  32. package/dist/core/system-prompt.js.map +1 -1
  33. package/dist/core/tools/file-search.d.ts +14 -0
  34. package/dist/core/tools/file-search.d.ts.map +1 -0
  35. package/dist/core/tools/file-search.js +99 -0
  36. package/dist/core/tools/file-search.js.map +1 -0
  37. package/dist/core/tools/glob.d.ts +11 -0
  38. package/dist/core/tools/glob.d.ts.map +1 -0
  39. package/dist/core/tools/glob.js +44 -0
  40. package/dist/core/tools/glob.js.map +1 -0
  41. package/dist/core/tools/grep.d.ts +13 -0
  42. package/dist/core/tools/grep.d.ts.map +1 -0
  43. package/dist/core/tools/grep.js +67 -0
  44. package/dist/core/tools/grep.js.map +1 -0
  45. package/dist/core/tools/load-skill.d.ts +10 -0
  46. package/dist/core/tools/load-skill.d.ts.map +1 -0
  47. package/dist/core/tools/load-skill.js +22 -0
  48. package/dist/core/tools/load-skill.js.map +1 -0
  49. package/dist/core/tools/path-boundary.d.ts +2 -0
  50. package/dist/core/tools/path-boundary.d.ts.map +1 -1
  51. package/dist/core/tools/path-boundary.js +4 -0
  52. package/dist/core/tools/path-boundary.js.map +1 -1
  53. package/dist/core/user-data.d.ts +3 -0
  54. package/dist/core/user-data.d.ts.map +1 -0
  55. package/dist/core/user-data.js +8 -0
  56. package/dist/core/user-data.js.map +1 -0
  57. package/dist/entry.js +13 -0
  58. package/dist/entry.js.map +1 -1
  59. package/dist/extensions/runtime.js +2 -2
  60. package/dist/extensions/runtime.js.map +1 -1
  61. package/dist/i18n.d.ts +5 -0
  62. package/dist/i18n.d.ts.map +1 -0
  63. package/dist/i18n.js +225 -0
  64. package/dist/i18n.js.map +1 -0
  65. package/dist/index.d.ts +3 -0
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +3 -0
  68. package/dist/index.js.map +1 -1
  69. package/dist/main.d.ts +17 -0
  70. package/dist/main.d.ts.map +1 -1
  71. package/dist/main.js +243 -11
  72. package/dist/main.js.map +1 -1
  73. package/dist/mcp/config.d.ts +33 -0
  74. package/dist/mcp/config.d.ts.map +1 -0
  75. package/dist/mcp/config.js +211 -0
  76. package/dist/mcp/config.js.map +1 -0
  77. package/dist/mcp/loader.d.ts +21 -0
  78. package/dist/mcp/loader.d.ts.map +1 -0
  79. package/dist/mcp/loader.js +60 -0
  80. package/dist/mcp/loader.js.map +1 -0
  81. package/dist/mcp/tool-adapter.d.ts +5 -0
  82. package/dist/mcp/tool-adapter.d.ts.map +1 -0
  83. package/dist/mcp/tool-adapter.js +149 -0
  84. package/dist/mcp/tool-adapter.js.map +1 -0
  85. package/dist/modes/interactive-components.d.ts +2 -2
  86. package/dist/modes/interactive-components.d.ts.map +1 -1
  87. package/dist/modes/interactive-components.js +30 -33
  88. package/dist/modes/interactive-components.js.map +1 -1
  89. package/dist/modes/interactive-state.d.ts.map +1 -1
  90. package/dist/modes/interactive-state.js +2 -1
  91. package/dist/modes/interactive-state.js.map +1 -1
  92. package/dist/modes/interactive.d.ts +9 -0
  93. package/dist/modes/interactive.d.ts.map +1 -1
  94. package/dist/modes/interactive.js +209 -63
  95. package/dist/modes/interactive.js.map +1 -1
  96. package/dist/modes/tree-selector.d.ts +30 -0
  97. package/dist/modes/tree-selector.d.ts.map +1 -0
  98. package/dist/modes/tree-selector.js +205 -0
  99. package/dist/modes/tree-selector.js.map +1 -0
  100. package/dist/plugins/loader.d.ts +19 -1
  101. package/dist/plugins/loader.d.ts.map +1 -1
  102. package/dist/plugins/loader.js +21 -2
  103. package/dist/plugins/loader.js.map +1 -1
  104. package/dist/provider-onboarding.d.ts.map +1 -1
  105. package/dist/provider-onboarding.js +119 -22
  106. package/dist/provider-onboarding.js.map +1 -1
  107. package/dist/startup.d.ts +34 -2
  108. package/dist/startup.d.ts.map +1 -1
  109. package/dist/startup.js +278 -9
  110. package/dist/startup.js.map +1 -1
  111. 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
- const DEFAULT_SESSION_DIRECTORY = join(".di-code", "sessions");
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 selectStartupSession(command, allowedRoot, now) {
63
- const sessionDirectory = resolve(allowedRoot, DEFAULT_SESSION_DIRECTORY);
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: (await trustManager.get(allowedRoot)) === true,
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: "New session",
265
- description: "Start a new persistent conversation.",
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"}