@di-code/coding-agent 0.1.9 → 0.2.2

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 (106) hide show
  1. package/README.md +7 -0
  2. package/compositions/base.yml +3 -0
  3. package/dist/compositions.d.ts.map +1 -1
  4. package/dist/compositions.js +2 -0
  5. package/dist/compositions.js.map +1 -1
  6. package/dist/core/image-input.d.ts +1 -1
  7. package/dist/core/image-input.d.ts.map +1 -1
  8. package/dist/core/image-input.js +15 -4
  9. package/dist/core/image-input.js.map +1 -1
  10. package/dist/core/session/session-manager.d.ts +18 -1
  11. package/dist/core/session/session-manager.d.ts.map +1 -1
  12. package/dist/core/session/session-manager.js +90 -1
  13. package/dist/core/session/session-manager.js.map +1 -1
  14. package/dist/core/session/session-storage.d.ts +2 -0
  15. package/dist/core/session/session-storage.d.ts.map +1 -1
  16. package/dist/core/session/session-storage.js +34 -2
  17. package/dist/core/session/session-storage.js.map +1 -1
  18. package/dist/core/session/types.d.ts +16 -1
  19. package/dist/core/session/types.d.ts.map +1 -1
  20. package/dist/core/session/types.js.map +1 -1
  21. package/dist/core/session.d.ts +27 -2
  22. package/dist/core/session.d.ts.map +1 -1
  23. package/dist/core/session.js +59 -0
  24. package/dist/core/session.js.map +1 -1
  25. package/dist/entry.js +1 -1
  26. package/dist/entry.js.map +1 -1
  27. package/dist/i18n.js +4 -4
  28. package/dist/i18n.js.map +1 -1
  29. package/dist/interactive-host-entry.d.ts.map +1 -1
  30. package/dist/interactive-host-entry.js +107 -12
  31. package/dist/interactive-host-entry.js.map +1 -1
  32. package/dist/main.d.ts.map +1 -1
  33. package/dist/main.js +8 -1
  34. package/dist/main.js.map +1 -1
  35. package/dist/mcp/config.d.ts.map +1 -1
  36. package/dist/mcp/config.js +19 -0
  37. package/dist/mcp/config.js.map +1 -1
  38. package/dist/mcp-command-entry.d.ts +8 -0
  39. package/dist/mcp-command-entry.d.ts.map +1 -0
  40. package/dist/mcp-command-entry.js +56 -0
  41. package/dist/mcp-command-entry.js.map +1 -0
  42. package/dist/modes/interactive-components.d.ts +8 -0
  43. package/dist/modes/interactive-components.d.ts.map +1 -1
  44. package/dist/modes/interactive-components.js +7 -2
  45. package/dist/modes/interactive-components.js.map +1 -1
  46. package/dist/modes/interactive-state.d.ts.map +1 -1
  47. package/dist/modes/interactive-state.js +1 -4
  48. package/dist/modes/interactive-state.js.map +1 -1
  49. package/dist/modes/interactive.d.ts +4 -0
  50. package/dist/modes/interactive.d.ts.map +1 -1
  51. package/dist/modes/interactive.js +69 -0
  52. package/dist/modes/interactive.js.map +1 -1
  53. package/dist/modes/tree-selector.d.ts.map +1 -1
  54. package/dist/modes/tree-selector.js +5 -4
  55. package/dist/modes/tree-selector.js.map +1 -1
  56. package/dist/rpc/client.d.ts +2 -0
  57. package/dist/rpc/client.d.ts.map +1 -1
  58. package/dist/rpc/client.js +3 -0
  59. package/dist/rpc/client.js.map +1 -1
  60. package/dist/rpc/dispatcher.d.ts +14 -0
  61. package/dist/rpc/dispatcher.d.ts.map +1 -1
  62. package/dist/rpc/dispatcher.js +222 -7
  63. package/dist/rpc/dispatcher.js.map +1 -1
  64. package/dist/rpc/protocol.d.ts +12 -5
  65. package/dist/rpc/protocol.d.ts.map +1 -1
  66. package/dist/rpc/protocol.js +56 -0
  67. package/dist/rpc/protocol.js.map +1 -1
  68. package/dist/rpc/server.d.ts +5 -0
  69. package/dist/rpc/server.d.ts.map +1 -1
  70. package/dist/rpc/server.js +4 -0
  71. package/dist/rpc/server.js.map +1 -1
  72. package/dist/rpc-server-entry.d.ts.map +1 -1
  73. package/dist/rpc-server-entry.js +15 -1
  74. package/dist/rpc-server-entry.js.map +1 -1
  75. package/dist/runtime/product-host.d.ts +7 -0
  76. package/dist/runtime/product-host.d.ts.map +1 -1
  77. package/dist/runtime/product-host.js +29 -9
  78. package/dist/runtime/product-host.js.map +1 -1
  79. package/dist/runtime/session-factory.d.ts +18 -2
  80. package/dist/runtime/session-factory.d.ts.map +1 -1
  81. package/dist/runtime/session-factory.js +286 -23
  82. package/dist/runtime/session-factory.js.map +1 -1
  83. package/dist/runtime/session-host.d.ts +46 -1
  84. package/dist/runtime/session-host.d.ts.map +1 -1
  85. package/dist/runtime/session-host.js +38 -6
  86. package/dist/runtime/session-host.js.map +1 -1
  87. package/dist/ui-host.d.ts.map +1 -1
  88. package/dist/ui-host.js +3 -0
  89. package/dist/ui-host.js.map +1 -1
  90. package/dist/web/assets/index-C2SOU925.css +1 -0
  91. package/dist/web/assets/index-knXkInvO.js +41 -0
  92. package/dist/web/assets/index-knXkInvO.js.map +1 -0
  93. package/dist/web/index.html +2 -2
  94. package/dist/web-command.d.ts.map +1 -1
  95. package/dist/web-command.js +8 -1
  96. package/dist/web-command.js.map +1 -1
  97. package/dist/webui-entry.js +9 -1
  98. package/dist/webui-entry.js.map +1 -1
  99. package/dist/webui.d.ts +10 -0
  100. package/dist/webui.d.ts.map +1 -1
  101. package/dist/webui.js +21 -0
  102. package/dist/webui.js.map +1 -1
  103. package/package.json +11 -9
  104. package/dist/web/assets/index-BwfuGMvv.css +0 -1
  105. package/dist/web/assets/index-DPUaJqFJ.js +0 -41
  106. package/dist/web/assets/index-DPUaJqFJ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,EAAqB,KAAK,YAAY,EAAuB,MAAM,yBAAyB,CAAC;AAQpG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AAGzF,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IACxC,qEAAqE;IACrE,QAAQ,CAAC,WAAW,CAAC,EAAE,2BAA2B,CAAC;IACnD,uFAAuF;IACvF,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CAChE;AA+BD,6EAA6E;AAC7E,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkHhH"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,EAAqB,KAAK,YAAY,EAAuB,MAAM,yBAAyB,CAAC;AAQpG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AAGzF,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IACxC,qEAAqE;IACrE,QAAQ,CAAC,WAAW,CAAC,EAAE,2BAA2B,CAAC;IACnD,uFAAuF;IACvF,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CAChE;AAoCD,6EAA6E;AAC7E,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqHhH"}
package/dist/main.js CHANGED
@@ -15,10 +15,13 @@ function isRun(command) {
15
15
  return command.kind === "run";
16
16
  }
17
17
  function isMinimalCommand(command) {
18
- return command.kind === "run" || command.kind === "plugin" || command.kind === "observe";
18
+ return command.kind === "run" || command.kind === "plugin" || command.kind === "observe" || command.kind === "mcp";
19
19
  }
20
20
  async function hasTrustedProjectContent(cwd) {
21
21
  for (const path of [
22
+ join(cwd, ".di-code", "composition.yml"),
23
+ join(cwd, ".di-code", "composition.yaml"),
24
+ join(cwd, ".di-code", "plugins"),
22
25
  join(cwd, ".di-code", "skills"),
23
26
  join(cwd, ".agents", "skills"),
24
27
  join(cwd, ".di-code", "mcp.local.json"),
@@ -110,6 +113,10 @@ export async function runMinimalProfile(args, options) {
110
113
  name = "plugin";
111
114
  input = { ...command, stdout: options.stdout, stderr: options.stderr };
112
115
  }
116
+ else if (command.kind === "mcp") {
117
+ name = "mcp";
118
+ input = { ...command, cwd: allowedRoot, stdout: options.stdout, stderr: options.stderr };
119
+ }
113
120
  else if (command.mode === "interactive") {
114
121
  name = "interactive";
115
122
  input = {
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 { access } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { hostCommandRegistryKey, processExitKey, sessionStoreKey } from \"@di-code/builtins\";\nimport { createCompositionLoader, type PluginModule } from \"@di-code/plugin-loader\";\nimport { createRootContext, type RuntimeEvent, redactSensitiveText } from \"@di-code/plugin-runtime\";\nimport { type CliCommand, createCliParser } from \"./cli.ts\";\nimport {\n\timportCompositionModule,\n\tresolveCompositionEntries,\n\tresolveManagedCompositionEntries,\n} from \"./compositions.ts\";\nimport { createProjectTrustStore } from \"./project-trust-entry.ts\";\nimport type { InteractiveBootstrapOptions } from \"./runtime/interactive-host-service.ts\";\nimport { pluginInventoryKey } from \"./runtime/plugin-inventory-service.ts\";\n\nexport interface MinimalProfileOptions {\n\treadonly version: string;\n\treadonly allowedRoot?: string;\n\t/** User data root used to resolve managed plugin state. */\n\treadonly agentDir?: string;\n\treadonly stdout: (text: string) => void;\n\treadonly stderr: (text: string) => void;\n\treadonly onRuntimeEvent?: (event: RuntimeEvent) => void;\n\treadonly onSessionDisposed?: () => void;\n\t/** Terminal-only facilities supplied by the executable bootstrap. */\n\treadonly interactive?: InteractiveBootstrapOptions;\n\t/** Test-only namespace importer; production uses package-aware composition imports. */\n\treadonly importModule?: (name: string) => Promise<PluginModule>;\n}\n\nfunction errorMessage(cause: unknown): string {\n\treturn redactSensitiveText(cause instanceof Error ? cause.message : String(cause));\n}\n\nfunction isRun(command: CliCommand): command is Extract<CliCommand, { kind: \"run\" }> {\n\treturn command.kind === \"run\";\n}\n\nfunction isMinimalCommand(command: CliCommand): command is Extract<CliCommand, { kind: \"run\" | \"plugin\" | \"observe\" }> {\n\treturn command.kind === \"run\" || command.kind === \"plugin\" || command.kind === \"observe\";\n}\n\nasync function hasTrustedProjectContent(cwd: string): Promise<boolean> {\n\tfor (const path of [\n\t\tjoin(cwd, \".di-code\", \"skills\"),\n\t\tjoin(cwd, \".agents\", \"skills\"),\n\t\tjoin(cwd, \".di-code\", \"mcp.local.json\"),\n\t\tjoin(cwd, \".mcp.json\"),\n\t]) {\n\t\ttry {\n\t\t\tawait access(path);\n\t\t\treturn true;\n\t\t} catch (cause) {\n\t\t\tif (!(cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\")) throw cause;\n\t\t}\n\t}\n\treturn false;\n}\n\n/** Starts a composition profile and executes its registered host command. */\nexport async function runMinimalProfile(args: readonly string[], options: MinimalProfileOptions): Promise<number> {\n\tconst parser = createCliParser();\n\tlet command: CliCommand;\n\ttry {\n\t\tcommand = parser.parse(args);\n\t} catch (cause) {\n\t\toptions.stderr(`${errorMessage(cause)}\\n`);\n\t\treturn 1;\n\t}\n\tif (command.kind === \"help\") {\n\t\toptions.stdout(`${parser.help(\"en\")}\\n`);\n\t\treturn 0;\n\t}\n\tif (command.kind === \"version\") {\n\t\toptions.stdout(`${options.version}\\n`);\n\t\treturn 0;\n\t}\n\tif (!isMinimalCommand(command)) {\n\t\toptions.stderr(\"MCP commands are unavailable in the minimal profile.\\n\");\n\t\treturn 1;\n\t}\n\tif (isRun(command) && command.mode === \"interactive\" && !options.interactive?.isInteractiveTerminal) {\n\t\toptions.stderr(\"Interactive mode requires an interactive TTY.\\n\");\n\t\treturn 1;\n\t}\n\tconst mode = isRun(command) ? command.mode : \"print\";\n\tconst observability = command.kind === \"observe\";\n\tconst allowedRoot = resolve(options.allowedRoot ?? process.cwd());\n\tconst agentDir = resolve(options.agentDir ?? join(homedir(), \".di-code\"));\n\tconst trustStore = createProjectTrustStore(join(agentDir, \"trust.json\"));\n\tif (isRun(command) && command.projectTrust !== undefined) await trustStore.set(allowedRoot, command.projectTrust);\n\tlet projectTrusted = isRun(command) && !command.noProjectPlugins && (await trustStore.get(allowedRoot)) === true;\n\tif (\n\t\tisRun(command) &&\n\t\tcommand.mode === \"interactive\" &&\n\t\t!projectTrusted &&\n\t\tcommand.projectTrust === undefined &&\n\t\toptions.interactive?.promptProjectTrust &&\n\t\t(await hasTrustedProjectContent(allowedRoot))\n\t) {\n\t\tprojectTrusted = await options.interactive.promptProjectTrust(allowedRoot);\n\t\tawait trustStore.set(allowedRoot, projectTrusted);\n\t}\n\tconst managedEntries = await resolveManagedCompositionEntries(agentDir);\n\tconst compositionEntries = await resolveCompositionEntries(\n\t\tisRun(command) ? (command.profile ?? command.mode) : \"base\",\n\t\t{\n\t\t\tcwd: allowedRoot,\n\t\t\tagentDir,\n\t\t\t...(isRun(command) && command.compositionPath ? { compositionPath: command.compositionPath } : {}),\n\t\t\tincludeProjectComposition: projectTrusted,\n\t\t\tobservability,\n\t\t\tallowedRoot,\n\t\t},\n\t);\n\tconst context = createRootContext({ id: \"minimal-profile\", mode, trustedProject: projectTrusted });\n\tconst unsubscribe = context.events.subscribe((event) => options.onRuntimeEvent?.(event));\n\tconst loader = createCompositionLoader({\n\t\tcontext,\n\t\tentries: [...compositionEntries, ...managedEntries],\n\t\timportModule: options.importModule ?? importCompositionModule,\n\t\tprojectTrusted,\n\t});\n\ttry {\n\t\tawait loader.load();\n\t\tcontext.require(pluginInventoryKey).set(loader.tree.snapshot());\n\t\tconst host = context.require(hostCommandRegistryKey);\n\t\tlet name: string;\n\t\tlet input: unknown;\n\t\tif (command.kind === \"observe\") {\n\t\t\tname = command.action === \"trace\" ? \"trace-plugins\" : \"dump-composition\";\n\t\t\tinput = { stdout: options.stdout };\n\t\t} else if (command.kind === \"plugin\") {\n\t\t\tname = \"plugin\";\n\t\t\tinput = { ...command, stdout: options.stdout, stderr: options.stderr };\n\t\t} else if (command.mode === \"interactive\") {\n\t\t\tname = \"interactive\";\n\t\t\tinput = {\n\t\t\t\tcommand,\n\t\t\t\tcwd: allowedRoot,\n\t\t\t\tagentDir,\n\t\t\t\tprojectTrusted,\n\t\t\t\tstderr: options.stderr,\n\t\t\t\t...(options.interactive?.startInteractiveMode\n\t\t\t\t\t? { startInteractiveMode: options.interactive.startInteractiveMode }\n\t\t\t\t\t: {}),\n\t\t\t};\n\t\t} else {\n\t\t\tname = command.mode;\n\t\t\tinput = { prompt: command.prompt, stdout: options.stdout };\n\t\t}\n\t\tconst code = await host.execute(name, input, context.signal);\n\t\tconst processExit = context.require(processExitKey);\n\t\tprocessExit.setCode(code);\n\t\treturn processExit.code();\n\t} catch (cause) {\n\t\toptions.stderr(`${errorMessage(cause).replace(/^Required entry agent-loop failed: /, \"\")}\\n`);\n\t\treturn 1;\n\t} finally {\n\t\tconst memory = context.get(sessionStoreKey);\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tawait loader.dispose();\n\t\t\t} finally {\n\t\t\t\tawait context.dispose();\n\t\t\t}\n\t\t} finally {\n\t\t\tunsubscribe();\n\t\t\tif (memory) {\n\t\t\t\tmemory.dispose();\n\t\t\t\tif (memory.disposed()) options.onSessionDisposed?.();\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["import { access } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { hostCommandRegistryKey, processExitKey, sessionStoreKey } from \"@di-code/builtins\";\nimport { createCompositionLoader, type PluginModule } from \"@di-code/plugin-loader\";\nimport { createRootContext, type RuntimeEvent, redactSensitiveText } from \"@di-code/plugin-runtime\";\nimport { type CliCommand, createCliParser } from \"./cli.ts\";\nimport {\n\timportCompositionModule,\n\tresolveCompositionEntries,\n\tresolveManagedCompositionEntries,\n} from \"./compositions.ts\";\nimport { createProjectTrustStore } from \"./project-trust-entry.ts\";\nimport type { InteractiveBootstrapOptions } from \"./runtime/interactive-host-service.ts\";\nimport { pluginInventoryKey } from \"./runtime/plugin-inventory-service.ts\";\n\nexport interface MinimalProfileOptions {\n\treadonly version: string;\n\treadonly allowedRoot?: string;\n\t/** User data root used to resolve managed plugin state. */\n\treadonly agentDir?: string;\n\treadonly stdout: (text: string) => void;\n\treadonly stderr: (text: string) => void;\n\treadonly onRuntimeEvent?: (event: RuntimeEvent) => void;\n\treadonly onSessionDisposed?: () => void;\n\t/** Terminal-only facilities supplied by the executable bootstrap. */\n\treadonly interactive?: InteractiveBootstrapOptions;\n\t/** Test-only namespace importer; production uses package-aware composition imports. */\n\treadonly importModule?: (name: string) => Promise<PluginModule>;\n}\n\nfunction errorMessage(cause: unknown): string {\n\treturn redactSensitiveText(cause instanceof Error ? cause.message : String(cause));\n}\n\nfunction isRun(command: CliCommand): command is Extract<CliCommand, { kind: \"run\" }> {\n\treturn command.kind === \"run\";\n}\n\nfunction isMinimalCommand(\n\tcommand: CliCommand,\n): command is Extract<CliCommand, { kind: \"run\" | \"plugin\" | \"observe\" | \"mcp\" }> {\n\treturn command.kind === \"run\" || command.kind === \"plugin\" || command.kind === \"observe\" || command.kind === \"mcp\";\n}\n\nasync function hasTrustedProjectContent(cwd: string): Promise<boolean> {\n\tfor (const path of [\n\t\tjoin(cwd, \".di-code\", \"composition.yml\"),\n\t\tjoin(cwd, \".di-code\", \"composition.yaml\"),\n\t\tjoin(cwd, \".di-code\", \"plugins\"),\n\t\tjoin(cwd, \".di-code\", \"skills\"),\n\t\tjoin(cwd, \".agents\", \"skills\"),\n\t\tjoin(cwd, \".di-code\", \"mcp.local.json\"),\n\t\tjoin(cwd, \".mcp.json\"),\n\t]) {\n\t\ttry {\n\t\t\tawait access(path);\n\t\t\treturn true;\n\t\t} catch (cause) {\n\t\t\tif (!(cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\")) throw cause;\n\t\t}\n\t}\n\treturn false;\n}\n\n/** Starts a composition profile and executes its registered host command. */\nexport async function runMinimalProfile(args: readonly string[], options: MinimalProfileOptions): Promise<number> {\n\tconst parser = createCliParser();\n\tlet command: CliCommand;\n\ttry {\n\t\tcommand = parser.parse(args);\n\t} catch (cause) {\n\t\toptions.stderr(`${errorMessage(cause)}\\n`);\n\t\treturn 1;\n\t}\n\tif (command.kind === \"help\") {\n\t\toptions.stdout(`${parser.help(\"en\")}\\n`);\n\t\treturn 0;\n\t}\n\tif (command.kind === \"version\") {\n\t\toptions.stdout(`${options.version}\\n`);\n\t\treturn 0;\n\t}\n\tif (!isMinimalCommand(command)) {\n\t\toptions.stderr(\"MCP commands are unavailable in the minimal profile.\\n\");\n\t\treturn 1;\n\t}\n\tif (isRun(command) && command.mode === \"interactive\" && !options.interactive?.isInteractiveTerminal) {\n\t\toptions.stderr(\"Interactive mode requires an interactive TTY.\\n\");\n\t\treturn 1;\n\t}\n\tconst mode = isRun(command) ? command.mode : \"print\";\n\tconst observability = command.kind === \"observe\";\n\tconst allowedRoot = resolve(options.allowedRoot ?? process.cwd());\n\tconst agentDir = resolve(options.agentDir ?? join(homedir(), \".di-code\"));\n\tconst trustStore = createProjectTrustStore(join(agentDir, \"trust.json\"));\n\tif (isRun(command) && command.projectTrust !== undefined) await trustStore.set(allowedRoot, command.projectTrust);\n\tlet projectTrusted = isRun(command) && !command.noProjectPlugins && (await trustStore.get(allowedRoot)) === true;\n\tif (\n\t\tisRun(command) &&\n\t\tcommand.mode === \"interactive\" &&\n\t\t!projectTrusted &&\n\t\tcommand.projectTrust === undefined &&\n\t\toptions.interactive?.promptProjectTrust &&\n\t\t(await hasTrustedProjectContent(allowedRoot))\n\t) {\n\t\tprojectTrusted = await options.interactive.promptProjectTrust(allowedRoot);\n\t\tawait trustStore.set(allowedRoot, projectTrusted);\n\t}\n\tconst managedEntries = await resolveManagedCompositionEntries(agentDir);\n\tconst compositionEntries = await resolveCompositionEntries(\n\t\tisRun(command) ? (command.profile ?? command.mode) : \"base\",\n\t\t{\n\t\t\tcwd: allowedRoot,\n\t\t\tagentDir,\n\t\t\t...(isRun(command) && command.compositionPath ? { compositionPath: command.compositionPath } : {}),\n\t\t\tincludeProjectComposition: projectTrusted,\n\t\t\tobservability,\n\t\t\tallowedRoot,\n\t\t},\n\t);\n\tconst context = createRootContext({ id: \"minimal-profile\", mode, trustedProject: projectTrusted });\n\tconst unsubscribe = context.events.subscribe((event) => options.onRuntimeEvent?.(event));\n\tconst loader = createCompositionLoader({\n\t\tcontext,\n\t\tentries: [...compositionEntries, ...managedEntries],\n\t\timportModule: options.importModule ?? importCompositionModule,\n\t\tprojectTrusted,\n\t});\n\ttry {\n\t\tawait loader.load();\n\t\tcontext.require(pluginInventoryKey).set(loader.tree.snapshot());\n\t\tconst host = context.require(hostCommandRegistryKey);\n\t\tlet name: string;\n\t\tlet input: unknown;\n\t\tif (command.kind === \"observe\") {\n\t\t\tname = command.action === \"trace\" ? \"trace-plugins\" : \"dump-composition\";\n\t\t\tinput = { stdout: options.stdout };\n\t\t} else if (command.kind === \"plugin\") {\n\t\t\tname = \"plugin\";\n\t\t\tinput = { ...command, stdout: options.stdout, stderr: options.stderr };\n\t\t} else if (command.kind === \"mcp\") {\n\t\t\tname = \"mcp\";\n\t\t\tinput = { ...command, cwd: allowedRoot, stdout: options.stdout, stderr: options.stderr };\n\t\t} else if (command.mode === \"interactive\") {\n\t\t\tname = \"interactive\";\n\t\t\tinput = {\n\t\t\t\tcommand,\n\t\t\t\tcwd: allowedRoot,\n\t\t\t\tagentDir,\n\t\t\t\tprojectTrusted,\n\t\t\t\tstderr: options.stderr,\n\t\t\t\t...(options.interactive?.startInteractiveMode\n\t\t\t\t\t? { startInteractiveMode: options.interactive.startInteractiveMode }\n\t\t\t\t\t: {}),\n\t\t\t};\n\t\t} else {\n\t\t\tname = command.mode;\n\t\t\tinput = { prompt: command.prompt, stdout: options.stdout };\n\t\t}\n\t\tconst code = await host.execute(name, input, context.signal);\n\t\tconst processExit = context.require(processExitKey);\n\t\tprocessExit.setCode(code);\n\t\treturn processExit.code();\n\t} catch (cause) {\n\t\toptions.stderr(`${errorMessage(cause).replace(/^Required entry agent-loop failed: /, \"\")}\\n`);\n\t\treturn 1;\n\t} finally {\n\t\tconst memory = context.get(sessionStoreKey);\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tawait loader.dispose();\n\t\t\t} finally {\n\t\t\t\tawait context.dispose();\n\t\t\t}\n\t\t} finally {\n\t\t\tunsubscribe();\n\t\t\tif (memory) {\n\t\t\t\tmemory.dispose();\n\t\t\t\tif (memory.disposed()) options.onSessionDisposed?.();\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
@@ -1 +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"}
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;AAwHD,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"}
@@ -10,6 +10,13 @@ function requiredString(value, path) {
10
10
  throw new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be a non-empty string`);
11
11
  return value.trim();
12
12
  }
13
+ function optionalTimeout(value, path) {
14
+ if (value === undefined)
15
+ return undefined;
16
+ if (!Number.isSafeInteger(value) || value <= 0 || value > 300_000)
17
+ throw new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be a positive integer no greater than 300000`);
18
+ return value;
19
+ }
13
20
  function resolveEnvironmentValue(value, path, environment) {
14
21
  return value.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g, (_whole, name) => {
15
22
  const resolved = environment[name];
@@ -67,6 +74,12 @@ function parseServer(id, value, cwd, environment) {
67
74
  cwd,
68
75
  env: { ...inheritedEnvironment(), ...env },
69
76
  },
77
+ ...(optionalTimeout(entry.connectTimeoutMs, `mcpServers.${id}.connectTimeoutMs`) === undefined
78
+ ? {}
79
+ : { connectTimeoutMs: optionalTimeout(entry.connectTimeoutMs, `mcpServers.${id}.connectTimeoutMs`) }),
80
+ ...(optionalTimeout(entry.callTimeoutMs, `mcpServers.${id}.callTimeoutMs`) === undefined
81
+ ? {}
82
+ : { callTimeoutMs: optionalTimeout(entry.callTimeoutMs, `mcpServers.${id}.callTimeoutMs`) }),
70
83
  };
71
84
  }
72
85
  if (entry.type !== "http")
@@ -93,6 +106,12 @@ function parseServer(id, value, cwd, environment) {
93
106
  url: parsedUrl.toString(),
94
107
  ...(headers ? { headers } : {}),
95
108
  },
109
+ ...(optionalTimeout(entry.connectTimeoutMs, `mcpServers.${id}.connectTimeoutMs`) === undefined
110
+ ? {}
111
+ : { connectTimeoutMs: optionalTimeout(entry.connectTimeoutMs, `mcpServers.${id}.connectTimeoutMs`) }),
112
+ ...(optionalTimeout(entry.callTimeoutMs, `mcpServers.${id}.callTimeoutMs`) === undefined
113
+ ? {}
114
+ : { callTimeoutMs: optionalTimeout(entry.callTimeoutMs, `mcpServers.${id}.callTimeoutMs`) }),
96
115
  };
97
116
  }
98
117
  export function mcpConfigPath(cwd, scope = "project", homeDirectory = homedir()) {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type { McpServerConfig } from \"@di-code/mcp\";\n\nconst PROJECT_CONFIG_FILE_NAME = \".mcp.json\";\nconst LOCAL_CONFIG_FILE_NAME = join(\".di-code\", \"mcp.local.json\");\nconst USER_CONFIG_FILE_NAME = join(\".di-code\", \"mcp.json\");\nconst SERVER_ID_PATTERN = /^[a-z0-9][a-z0-9_-]{0,62}$/;\nexport type McpConfigScope = \"local\" | \"project\" | \"user\";\ntype Environment = Readonly<Record<string, string | undefined>>;\nexport interface McpConfigDocument {\n\treadonly mcpServers: Readonly<Record<string, unknown>>;\n}\n\nfunction requiredString(value: unknown, path: string): string {\n\tif (typeof value !== \"string\" || !value.trim())\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be a non-empty string`);\n\treturn value.trim();\n}\n\nfunction resolveEnvironmentValue(value: string, path: string, environment: Environment): string {\n\treturn value.replace(/\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g, (_whole, name: string) => {\n\t\tconst resolved = environment[name];\n\t\tif (!resolved) throw new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} environment variable \"${name}\" is not set`);\n\t\treturn resolved;\n\t});\n}\n\nfunction parseEnvironment(value: unknown, path: string, environment: Environment): Record<string, string> | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be an object`);\n\tconst result: Record<string, string> = {};\n\tfor (const [name, raw] of Object.entries(value as Record<string, unknown>)) {\n\t\tif (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name))\n\t\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path}.${name} is not a valid environment variable name`);\n\t\tresult[name] = resolveEnvironmentValue(requiredString(raw, `${path}.${name}`), `${path}.${name}`, environment);\n\t}\n\treturn result;\n}\n\nfunction parseHeaders(value: unknown, path: string, environment: Environment): Record<string, string> | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be an object`);\n\tconst result: Record<string, string> = {};\n\tfor (const [name, raw] of Object.entries(value as Record<string, unknown>)) {\n\t\tif (!name.trim()) throw new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} contains an empty header name`);\n\t\tresult[name] = resolveEnvironmentValue(requiredString(raw, `${path}.${name}`), `${path}.${name}`, environment);\n\t}\n\treturn result;\n}\n\nfunction inheritedEnvironment(): Record<string, string> {\n\treturn Object.fromEntries(\n\t\tObject.entries(process.env).filter((entry): entry is [string, string] => entry[1] !== undefined),\n\t);\n}\n\nfunction parseServer(id: string, value: unknown, cwd: string, environment: Environment): McpServerConfig {\n\tif (!SERVER_ID_PATTERN.test(id))\n\t\tthrow new Error(\n\t\t\t`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id} must use lowercase letters, numbers, hyphens, or underscores`,\n\t\t);\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id} must be an object`);\n\tconst entry = value as Record<string, unknown>;\n\tif (entry.type === undefined || entry.type === \"stdio\") {\n\t\tif (\n\t\t\tentry.args !== undefined &&\n\t\t\t(!Array.isArray(entry.args) || entry.args.some((argument) => typeof argument !== \"string\"))\n\t\t)\n\t\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.args must be an array of strings`);\n\t\tconst env = parseEnvironment(entry.env, `mcpServers.${id}.env`, environment);\n\t\treturn {\n\t\t\tid,\n\t\t\ttransport: {\n\t\t\t\ttype: \"stdio\",\n\t\t\t\tcommand: requiredString(entry.command, `mcpServers.${id}.command`),\n\t\t\t\t...(entry.args === undefined ? {} : { args: [...(entry.args as string[])] }),\n\t\t\t\tcwd,\n\t\t\t\tenv: { ...inheritedEnvironment(), ...env },\n\t\t\t},\n\t\t};\n\t}\n\tif (entry.type !== \"http\")\n\t\tthrow new Error(\n\t\t\t`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.type \"${String(entry.type)}\" is not supported; expected stdio or http`,\n\t\t);\n\tconst url = requiredString(entry.url, `mcpServers.${id}.url`);\n\tlet parsedUrl: URL;\n\ttry {\n\t\tparsedUrl = new URL(url);\n\t} catch (cause) {\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.url must be an absolute http or https URL`, {\n\t\t\tcause,\n\t\t});\n\t}\n\tif (parsedUrl.protocol !== \"http:\" && parsedUrl.protocol !== \"https:\")\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.url must use http or https`);\n\tif (parsedUrl.username || parsedUrl.password)\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.url must not contain credentials`);\n\tconst headers = parseHeaders(entry.headers, `mcpServers.${id}.headers`, environment);\n\treturn {\n\t\tid,\n\t\ttransport: {\n\t\t\ttype: \"streamable-http\" as const,\n\t\t\turl: parsedUrl.toString(),\n\t\t\t...(headers ? { headers } : {}),\n\t\t},\n\t};\n}\n\nexport function mcpConfigPath(cwd: string, scope: McpConfigScope = \"project\", homeDirectory = homedir()): string {\n\treturn scope === \"project\"\n\t\t? join(resolve(cwd), PROJECT_CONFIG_FILE_NAME)\n\t\t: scope === \"local\"\n\t\t\t? join(resolve(cwd), LOCAL_CONFIG_FILE_NAME)\n\t\t\t: join(resolve(homeDirectory), USER_CONFIG_FILE_NAME);\n}\n\nasync function readDocument(path: string): Promise<McpConfigDocument> {\n\tlet raw: string;\n\ttry {\n\t\traw = await readFile(path, \"utf8\");\n\t} catch (cause) {\n\t\tif (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") return { mcpServers: {} };\n\t\tthrow cause;\n\t}\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (cause) {\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: invalid JSON`, { cause });\n\t}\n\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: root value must be an object`);\n\tconst servers = (parsed as Record<string, unknown>).mcpServers;\n\tif (typeof servers !== \"object\" || servers === null || Array.isArray(servers))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers must be an object`);\n\treturn { mcpServers: { ...(servers as Record<string, unknown>) } };\n}\n\nexport async function readMcpConfigScope(\n\tcwd: string,\n\tscope: McpConfigScope,\n\thomeDirectory = homedir(),\n): Promise<McpConfigDocument> {\n\treturn readDocument(mcpConfigPath(cwd, scope, homeDirectory));\n}\n\nexport async function loadMcpConfig(\n\tcwd: string,\n\tenvironment: Environment = process.env,\n): Promise<readonly McpServerConfig[]> {\n\tconst document = await readMcpConfigScope(cwd, \"project\");\n\treturn Object.entries(document.mcpServers)\n\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t.map(([id, server]) => parseServer(id, server, cwd, environment));\n}\n\nexport async function loadEffectiveMcpConfig(options: {\n\tcwd: string;\n\thomeDirectory?: string;\n\tenvironment?: Environment;\n\tprojectTrusted: boolean;\n}): Promise<readonly McpServerConfig[]> {\n\tconst environment = options.environment ?? process.env;\n\tconst scopes: readonly McpConfigScope[] = options.projectTrusted ? [\"user\", \"project\", \"local\"] : [\"user\"];\n\tconst merged = new Map<string, unknown>();\n\tfor (const scope of scopes) {\n\t\tconst document = await readMcpConfigScope(options.cwd, scope, options.homeDirectory);\n\t\tfor (const [id, server] of Object.entries(document.mcpServers)) merged.set(id, server);\n\t}\n\treturn [...merged.entries()]\n\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t.map(([id, server]) => parseServer(id, server, options.cwd, environment));\n}\n\nfunction redactedEntry(value: unknown): unknown {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) return value;\n\tconst entry = { ...(value as Record<string, unknown>) };\n\tfor (const field of [\"env\", \"headers\"]) {\n\t\tconst values = entry[field];\n\t\tif (typeof values !== \"object\" || values === null || Array.isArray(values)) continue;\n\t\tentry[field] = Object.fromEntries(\n\t\t\tObject.entries(values).map(([name, raw]) => [\n\t\t\t\tname,\n\t\t\t\ttypeof raw === \"string\" && /^\\$\\{[A-Za-z_][A-Za-z0-9_]*\\}$/.test(raw) ? raw : \"[redacted]\",\n\t\t\t]),\n\t\t);\n\t}\n\treturn entry;\n}\n\nexport async function listMcpConfig(\n\tcwd: string,\n\tscope: McpConfigScope,\n\thomeDirectory = homedir(),\n): Promise<readonly { id: string; scope: McpConfigScope; config: unknown }[]> {\n\tconst document = await readMcpConfigScope(cwd, scope, homeDirectory);\n\treturn Object.entries(document.mcpServers)\n\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t.map(([id, config]) => ({ id, scope, config: redactedEntry(config) }));\n}\n\nexport async function getMcpConfig(\n\tcwd: string,\n\tid: string,\n\tscope?: McpConfigScope,\n\thomeDirectory = homedir(),\n): Promise<{ id: string; scope: McpConfigScope; config: unknown } | undefined> {\n\tconst scopes = scope ? [scope] : ([\"local\", \"project\", \"user\"] as const);\n\tfor (const current of scopes) {\n\t\tconst document = await readMcpConfigScope(cwd, current, homeDirectory);\n\t\tif (id in document.mcpServers) return { id, scope: current, config: redactedEntry(document.mcpServers[id]) };\n\t}\n\treturn undefined;\n}\n\nasync function writeDocument(\n\tcwd: string,\n\tscope: McpConfigScope,\n\tdocument: McpConfigDocument,\n\thomeDirectory = homedir(),\n): Promise<void> {\n\tconst path = mcpConfigPath(cwd, scope, homeDirectory);\n\tawait mkdir(dirname(path), { recursive: true });\n\tconst temporaryPath = `${path}.${process.pid}.${Date.now()}.tmp`;\n\tawait writeFile(temporaryPath, `${JSON.stringify({ mcpServers: document.mcpServers }, null, 2)}\\n`, \"utf8\");\n\ttry {\n\t\tawait rename(temporaryPath, path);\n\t} catch (cause) {\n\t\tawait unlink(temporaryPath).catch(() => undefined);\n\t\tthrow cause;\n\t}\n}\n\nexport async function addMcpConfig(\n\tcwd: string,\n\tscope: McpConfigScope,\n\tid: string,\n\tconfig: unknown,\n\toptions: { homeDirectory?: string; environment?: Environment } = {},\n): Promise<void> {\n\tif (!SERVER_ID_PATTERN.test(id)) throw new Error(`Invalid MCP server id \"${id}\".`);\n\tconst document = await readMcpConfigScope(cwd, scope, options.homeDirectory);\n\tif (id in document.mcpServers) throw new Error(`MCP server \"${id}\" already exists in ${scope} scope.`);\n\tparseServer(id, config, cwd, options.environment ?? process.env);\n\tawait writeDocument(cwd, scope, { mcpServers: { ...document.mcpServers, [id]: config } }, options.homeDirectory);\n}\n\nexport async function removeMcpConfig(\n\tcwd: string,\n\tscope: McpConfigScope,\n\tid: string,\n\thomeDirectory = homedir(),\n): Promise<void> {\n\tconst document = await readMcpConfigScope(cwd, scope, homeDirectory);\n\tif (!(id in document.mcpServers)) throw new Error(`MCP server \"${id}\" was not found in ${scope} scope.`);\n\tconst { [id]: _removed, ...remaining } = document.mcpServers;\n\tawait writeDocument(cwd, scope, { mcpServers: remaining }, homeDirectory);\n}\n\nexport { SERVER_ID_PATTERN };\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type { McpServerConfig } from \"@di-code/mcp\";\n\nconst PROJECT_CONFIG_FILE_NAME = \".mcp.json\";\nconst LOCAL_CONFIG_FILE_NAME = join(\".di-code\", \"mcp.local.json\");\nconst USER_CONFIG_FILE_NAME = join(\".di-code\", \"mcp.json\");\nconst SERVER_ID_PATTERN = /^[a-z0-9][a-z0-9_-]{0,62}$/;\nexport type McpConfigScope = \"local\" | \"project\" | \"user\";\ntype Environment = Readonly<Record<string, string | undefined>>;\nexport interface McpConfigDocument {\n\treadonly mcpServers: Readonly<Record<string, unknown>>;\n}\n\nfunction requiredString(value: unknown, path: string): string {\n\tif (typeof value !== \"string\" || !value.trim())\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be a non-empty string`);\n\treturn value.trim();\n}\n\nfunction optionalTimeout(value: unknown, path: string): number | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Number.isSafeInteger(value) || (value as number) <= 0 || (value as number) > 300_000)\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be a positive integer no greater than 300000`);\n\treturn value as number;\n}\n\nfunction resolveEnvironmentValue(value: string, path: string, environment: Environment): string {\n\treturn value.replace(/\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g, (_whole, name: string) => {\n\t\tconst resolved = environment[name];\n\t\tif (!resolved) throw new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} environment variable \"${name}\" is not set`);\n\t\treturn resolved;\n\t});\n}\n\nfunction parseEnvironment(value: unknown, path: string, environment: Environment): Record<string, string> | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be an object`);\n\tconst result: Record<string, string> = {};\n\tfor (const [name, raw] of Object.entries(value as Record<string, unknown>)) {\n\t\tif (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name))\n\t\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path}.${name} is not a valid environment variable name`);\n\t\tresult[name] = resolveEnvironmentValue(requiredString(raw, `${path}.${name}`), `${path}.${name}`, environment);\n\t}\n\treturn result;\n}\n\nfunction parseHeaders(value: unknown, path: string, environment: Environment): Record<string, string> | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be an object`);\n\tconst result: Record<string, string> = {};\n\tfor (const [name, raw] of Object.entries(value as Record<string, unknown>)) {\n\t\tif (!name.trim()) throw new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} contains an empty header name`);\n\t\tresult[name] = resolveEnvironmentValue(requiredString(raw, `${path}.${name}`), `${path}.${name}`, environment);\n\t}\n\treturn result;\n}\n\nfunction inheritedEnvironment(): Record<string, string> {\n\treturn Object.fromEntries(\n\t\tObject.entries(process.env).filter((entry): entry is [string, string] => entry[1] !== undefined),\n\t);\n}\n\nfunction parseServer(id: string, value: unknown, cwd: string, environment: Environment): McpServerConfig {\n\tif (!SERVER_ID_PATTERN.test(id))\n\t\tthrow new Error(\n\t\t\t`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id} must use lowercase letters, numbers, hyphens, or underscores`,\n\t\t);\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id} must be an object`);\n\tconst entry = value as Record<string, unknown>;\n\tif (entry.type === undefined || entry.type === \"stdio\") {\n\t\tif (\n\t\t\tentry.args !== undefined &&\n\t\t\t(!Array.isArray(entry.args) || entry.args.some((argument) => typeof argument !== \"string\"))\n\t\t)\n\t\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.args must be an array of strings`);\n\t\tconst env = parseEnvironment(entry.env, `mcpServers.${id}.env`, environment);\n\t\treturn {\n\t\t\tid,\n\t\t\ttransport: {\n\t\t\t\ttype: \"stdio\",\n\t\t\t\tcommand: requiredString(entry.command, `mcpServers.${id}.command`),\n\t\t\t\t...(entry.args === undefined ? {} : { args: [...(entry.args as string[])] }),\n\t\t\t\tcwd,\n\t\t\t\tenv: { ...inheritedEnvironment(), ...env },\n\t\t\t},\n\t\t\t...(optionalTimeout(entry.connectTimeoutMs, `mcpServers.${id}.connectTimeoutMs`) === undefined\n\t\t\t\t? {}\n\t\t\t\t: { connectTimeoutMs: optionalTimeout(entry.connectTimeoutMs, `mcpServers.${id}.connectTimeoutMs`) }),\n\t\t\t...(optionalTimeout(entry.callTimeoutMs, `mcpServers.${id}.callTimeoutMs`) === undefined\n\t\t\t\t? {}\n\t\t\t\t: { callTimeoutMs: optionalTimeout(entry.callTimeoutMs, `mcpServers.${id}.callTimeoutMs`) }),\n\t\t};\n\t}\n\tif (entry.type !== \"http\")\n\t\tthrow new Error(\n\t\t\t`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.type \"${String(entry.type)}\" is not supported; expected stdio or http`,\n\t\t);\n\tconst url = requiredString(entry.url, `mcpServers.${id}.url`);\n\tlet parsedUrl: URL;\n\ttry {\n\t\tparsedUrl = new URL(url);\n\t} catch (cause) {\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.url must be an absolute http or https URL`, {\n\t\t\tcause,\n\t\t});\n\t}\n\tif (parsedUrl.protocol !== \"http:\" && parsedUrl.protocol !== \"https:\")\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.url must use http or https`);\n\tif (parsedUrl.username || parsedUrl.password)\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.url must not contain credentials`);\n\tconst headers = parseHeaders(entry.headers, `mcpServers.${id}.headers`, environment);\n\treturn {\n\t\tid,\n\t\ttransport: {\n\t\t\ttype: \"streamable-http\" as const,\n\t\t\turl: parsedUrl.toString(),\n\t\t\t...(headers ? { headers } : {}),\n\t\t},\n\t\t...(optionalTimeout(entry.connectTimeoutMs, `mcpServers.${id}.connectTimeoutMs`) === undefined\n\t\t\t? {}\n\t\t\t: { connectTimeoutMs: optionalTimeout(entry.connectTimeoutMs, `mcpServers.${id}.connectTimeoutMs`) }),\n\t\t...(optionalTimeout(entry.callTimeoutMs, `mcpServers.${id}.callTimeoutMs`) === undefined\n\t\t\t? {}\n\t\t\t: { callTimeoutMs: optionalTimeout(entry.callTimeoutMs, `mcpServers.${id}.callTimeoutMs`) }),\n\t};\n}\n\nexport function mcpConfigPath(cwd: string, scope: McpConfigScope = \"project\", homeDirectory = homedir()): string {\n\treturn scope === \"project\"\n\t\t? join(resolve(cwd), PROJECT_CONFIG_FILE_NAME)\n\t\t: scope === \"local\"\n\t\t\t? join(resolve(cwd), LOCAL_CONFIG_FILE_NAME)\n\t\t\t: join(resolve(homeDirectory), USER_CONFIG_FILE_NAME);\n}\n\nasync function readDocument(path: string): Promise<McpConfigDocument> {\n\tlet raw: string;\n\ttry {\n\t\traw = await readFile(path, \"utf8\");\n\t} catch (cause) {\n\t\tif (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") return { mcpServers: {} };\n\t\tthrow cause;\n\t}\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (cause) {\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: invalid JSON`, { cause });\n\t}\n\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: root value must be an object`);\n\tconst servers = (parsed as Record<string, unknown>).mcpServers;\n\tif (typeof servers !== \"object\" || servers === null || Array.isArray(servers))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers must be an object`);\n\treturn { mcpServers: { ...(servers as Record<string, unknown>) } };\n}\n\nexport async function readMcpConfigScope(\n\tcwd: string,\n\tscope: McpConfigScope,\n\thomeDirectory = homedir(),\n): Promise<McpConfigDocument> {\n\treturn readDocument(mcpConfigPath(cwd, scope, homeDirectory));\n}\n\nexport async function loadMcpConfig(\n\tcwd: string,\n\tenvironment: Environment = process.env,\n): Promise<readonly McpServerConfig[]> {\n\tconst document = await readMcpConfigScope(cwd, \"project\");\n\treturn Object.entries(document.mcpServers)\n\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t.map(([id, server]) => parseServer(id, server, cwd, environment));\n}\n\nexport async function loadEffectiveMcpConfig(options: {\n\tcwd: string;\n\thomeDirectory?: string;\n\tenvironment?: Environment;\n\tprojectTrusted: boolean;\n}): Promise<readonly McpServerConfig[]> {\n\tconst environment = options.environment ?? process.env;\n\tconst scopes: readonly McpConfigScope[] = options.projectTrusted ? [\"user\", \"project\", \"local\"] : [\"user\"];\n\tconst merged = new Map<string, unknown>();\n\tfor (const scope of scopes) {\n\t\tconst document = await readMcpConfigScope(options.cwd, scope, options.homeDirectory);\n\t\tfor (const [id, server] of Object.entries(document.mcpServers)) merged.set(id, server);\n\t}\n\treturn [...merged.entries()]\n\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t.map(([id, server]) => parseServer(id, server, options.cwd, environment));\n}\n\nfunction redactedEntry(value: unknown): unknown {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) return value;\n\tconst entry = { ...(value as Record<string, unknown>) };\n\tfor (const field of [\"env\", \"headers\"]) {\n\t\tconst values = entry[field];\n\t\tif (typeof values !== \"object\" || values === null || Array.isArray(values)) continue;\n\t\tentry[field] = Object.fromEntries(\n\t\t\tObject.entries(values).map(([name, raw]) => [\n\t\t\t\tname,\n\t\t\t\ttypeof raw === \"string\" && /^\\$\\{[A-Za-z_][A-Za-z0-9_]*\\}$/.test(raw) ? raw : \"[redacted]\",\n\t\t\t]),\n\t\t);\n\t}\n\treturn entry;\n}\n\nexport async function listMcpConfig(\n\tcwd: string,\n\tscope: McpConfigScope,\n\thomeDirectory = homedir(),\n): Promise<readonly { id: string; scope: McpConfigScope; config: unknown }[]> {\n\tconst document = await readMcpConfigScope(cwd, scope, homeDirectory);\n\treturn Object.entries(document.mcpServers)\n\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t.map(([id, config]) => ({ id, scope, config: redactedEntry(config) }));\n}\n\nexport async function getMcpConfig(\n\tcwd: string,\n\tid: string,\n\tscope?: McpConfigScope,\n\thomeDirectory = homedir(),\n): Promise<{ id: string; scope: McpConfigScope; config: unknown } | undefined> {\n\tconst scopes = scope ? [scope] : ([\"local\", \"project\", \"user\"] as const);\n\tfor (const current of scopes) {\n\t\tconst document = await readMcpConfigScope(cwd, current, homeDirectory);\n\t\tif (id in document.mcpServers) return { id, scope: current, config: redactedEntry(document.mcpServers[id]) };\n\t}\n\treturn undefined;\n}\n\nasync function writeDocument(\n\tcwd: string,\n\tscope: McpConfigScope,\n\tdocument: McpConfigDocument,\n\thomeDirectory = homedir(),\n): Promise<void> {\n\tconst path = mcpConfigPath(cwd, scope, homeDirectory);\n\tawait mkdir(dirname(path), { recursive: true });\n\tconst temporaryPath = `${path}.${process.pid}.${Date.now()}.tmp`;\n\tawait writeFile(temporaryPath, `${JSON.stringify({ mcpServers: document.mcpServers }, null, 2)}\\n`, \"utf8\");\n\ttry {\n\t\tawait rename(temporaryPath, path);\n\t} catch (cause) {\n\t\tawait unlink(temporaryPath).catch(() => undefined);\n\t\tthrow cause;\n\t}\n}\n\nexport async function addMcpConfig(\n\tcwd: string,\n\tscope: McpConfigScope,\n\tid: string,\n\tconfig: unknown,\n\toptions: { homeDirectory?: string; environment?: Environment } = {},\n): Promise<void> {\n\tif (!SERVER_ID_PATTERN.test(id)) throw new Error(`Invalid MCP server id \"${id}\".`);\n\tconst document = await readMcpConfigScope(cwd, scope, options.homeDirectory);\n\tif (id in document.mcpServers) throw new Error(`MCP server \"${id}\" already exists in ${scope} scope.`);\n\tparseServer(id, config, cwd, options.environment ?? process.env);\n\tawait writeDocument(cwd, scope, { mcpServers: { ...document.mcpServers, [id]: config } }, options.homeDirectory);\n}\n\nexport async function removeMcpConfig(\n\tcwd: string,\n\tscope: McpConfigScope,\n\tid: string,\n\thomeDirectory = homedir(),\n): Promise<void> {\n\tconst document = await readMcpConfigScope(cwd, scope, homeDirectory);\n\tif (!(id in document.mcpServers)) throw new Error(`MCP server \"${id}\" was not found in ${scope} scope.`);\n\tconst { [id]: _removed, ...remaining } = document.mcpServers;\n\tawait writeDocument(cwd, scope, { mcpServers: remaining }, homeDirectory);\n}\n\nexport { SERVER_ID_PATTERN };\n"]}
@@ -0,0 +1,8 @@
1
+ import type { PluginDefinition } from "@di-code/plugin-runtime";
2
+ /** Registers the CLI MCP configuration command in the base composition. */
3
+ export declare const mcpCommand: PluginDefinition;
4
+ export declare const apiVersion: number | undefined;
5
+ export declare const name: string;
6
+ export declare const version: string | undefined;
7
+ export declare const apply: import("@di-code/plugin-runtime").PluginApply<unknown>;
8
+ //# sourceMappingURL=mcp-command-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-command-entry.d.ts","sourceRoot":"","sources":["../src/mcp-command-entry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,2EAA2E;AAC3E,eAAO,MAAM,UAAU,EAAE,gBAoDxB,CAAC;AAEF,eAAO,MAAM,UAAU,oBAAwB,CAAC;AAChD,eAAO,MAAM,IAAI,QAAkB,CAAC;AACpC,eAAO,MAAM,OAAO,oBAAqB,CAAC;AAC1C,eAAO,MAAM,KAAK,wDAAmB,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { hostCommandRegistryKey } from "@di-code/builtins";
2
+ import { addMcpConfig, getMcpConfig, listMcpConfig, removeMcpConfig } from "./mcp/config.js";
3
+ /** Registers the CLI MCP configuration command in the base composition. */
4
+ export const mcpCommand = {
5
+ apiVersion: 1,
6
+ name: "mcp-command",
7
+ version: "0.1.9",
8
+ apply(context, _config, fiber) {
9
+ const registry = context.require(hostCommandRegistryKey);
10
+ fiber.addDisposer(registry.register("mcp", async (input) => {
11
+ const command = input;
12
+ const cwd = input.cwd ?? process.cwd();
13
+ const scope = command.scope ?? "local";
14
+ const stdout = input.stdout ?? (() => undefined);
15
+ const serverId = () => {
16
+ if (!command.serverId)
17
+ throw new Error("MCP server id is required.");
18
+ return command.serverId;
19
+ };
20
+ switch (command.action) {
21
+ case "list":
22
+ stdout(`${JSON.stringify(await listMcpConfig(cwd, scope), null, 2)}\n`);
23
+ return 0;
24
+ case "get": {
25
+ const id = serverId();
26
+ const result = await getMcpConfig(cwd, id, command.scope);
27
+ if (!result)
28
+ throw new Error(`MCP server "${id}" was not found.`);
29
+ stdout(`${JSON.stringify(result, null, 2)}\n`);
30
+ return 0;
31
+ }
32
+ case "remove": {
33
+ const id = serverId();
34
+ await removeMcpConfig(cwd, scope, id);
35
+ stdout(`Removed MCP server "${id}" from ${scope} scope.\n`);
36
+ return 0;
37
+ }
38
+ case "add": {
39
+ const id = serverId();
40
+ if ((command.transport === "stdio" && !command.command) || (command.transport === "http" && !command.url))
41
+ throw new Error("MCP command is incomplete.");
42
+ await addMcpConfig(cwd, scope, id, command.transport === "stdio"
43
+ ? { type: "stdio", command: command.command, ...(command.args ? { args: command.args } : {}) }
44
+ : { type: "http", url: command.url });
45
+ stdout(`Added MCP server "${id}" to ${scope} scope.\n`);
46
+ return 0;
47
+ }
48
+ }
49
+ }));
50
+ },
51
+ };
52
+ export const apiVersion = mcpCommand.apiVersion;
53
+ export const name = mcpCommand.name;
54
+ export const version = mcpCommand.version;
55
+ export const apply = mcpCommand.apply;
56
+ //# sourceMappingURL=mcp-command-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-command-entry.js","sourceRoot":"","sources":["../src/mcp-command-entry.ts"],"names":[],"mappings":"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","sourcesContent":["import { hostCommandRegistryKey } from \"@di-code/builtins\";\nimport type { PluginDefinition } from \"@di-code/plugin-runtime\";\nimport type { CliCommand } from \"./cli.ts\";\nimport { addMcpConfig, getMcpConfig, listMcpConfig, type McpConfigScope, removeMcpConfig } from \"./mcp/config.ts\";\n\n/** Registers the CLI MCP configuration command in the base composition. */\nexport const mcpCommand: PluginDefinition = {\n\tapiVersion: 1,\n\tname: \"mcp-command\",\n\tversion: \"0.1.9\",\n\tapply(context, _config, fiber) {\n\t\tconst registry = context.require(hostCommandRegistryKey);\n\t\tfiber.addDisposer(\n\t\t\tregistry.register(\"mcp\", async (input) => {\n\t\t\t\tconst command = input as Extract<CliCommand, { kind: \"mcp\" }>;\n\t\t\t\tconst cwd = (input as { readonly cwd?: string }).cwd ?? process.cwd();\n\t\t\t\tconst scope: McpConfigScope = command.scope ?? \"local\";\n\t\t\t\tconst stdout = (input as { readonly stdout?: (text: string) => void }).stdout ?? (() => undefined);\n\t\t\t\tconst serverId = (): string => {\n\t\t\t\t\tif (!command.serverId) throw new Error(\"MCP server id is required.\");\n\t\t\t\t\treturn command.serverId;\n\t\t\t\t};\n\t\t\t\tswitch (command.action) {\n\t\t\t\t\tcase \"list\":\n\t\t\t\t\t\tstdout(`${JSON.stringify(await listMcpConfig(cwd, scope), null, 2)}\\n`);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\tcase \"get\": {\n\t\t\t\t\t\tconst id = serverId();\n\t\t\t\t\t\tconst result = await getMcpConfig(cwd, id, command.scope);\n\t\t\t\t\t\tif (!result) throw new Error(`MCP server \"${id}\" was not found.`);\n\t\t\t\t\t\tstdout(`${JSON.stringify(result, null, 2)}\\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 id = serverId();\n\t\t\t\t\t\tawait removeMcpConfig(cwd, scope, id);\n\t\t\t\t\t\tstdout(`Removed MCP server \"${id}\" from ${scope} scope.\\n`);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"add\": {\n\t\t\t\t\t\tconst id = serverId();\n\t\t\t\t\t\tif ((command.transport === \"stdio\" && !command.command) || (command.transport === \"http\" && !command.url))\n\t\t\t\t\t\t\tthrow new Error(\"MCP command is incomplete.\");\n\t\t\t\t\t\tawait addMcpConfig(\n\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\tscope,\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tcommand.transport === \"stdio\"\n\t\t\t\t\t\t\t\t? { type: \"stdio\", command: command.command, ...(command.args ? { args: command.args } : {}) }\n\t\t\t\t\t\t\t\t: { type: \"http\", url: command.url },\n\t\t\t\t\t\t);\n\t\t\t\t\t\tstdout(`Added MCP server \"${id}\" to ${scope} 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}),\n\t\t);\n\t},\n};\n\nexport const apiVersion = mcpCommand.apiVersion;\nexport const name = mcpCommand.name;\nexport const version = mcpCommand.version;\nexport const apply = mcpCommand.apply;\n"]}
@@ -6,6 +6,14 @@ export interface InteractiveViewState extends InteractiveState {
6
6
  readonly theme: "dark" | "light";
7
7
  readonly locale?: Locale;
8
8
  readonly pasteImageShortcut?: string;
9
+ readonly planMode?: {
10
+ readonly active: boolean;
11
+ readonly pending: boolean;
12
+ };
13
+ readonly extensions?: readonly {
14
+ readonly label: string;
15
+ readonly tone: "neutral" | "info" | "success" | "warning" | "error";
16
+ }[];
9
17
  }
10
18
  export declare class InteractiveHeader implements Component {
11
19
  private readonly readState;
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-components.d.ts","sourceRoot":"","sources":["../../src/modes/interactive-components.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAiB,MAAM,cAAc,CAAC;AAE/E,OAAO,EAAkB,KAAK,MAAM,EAAa,MAAM,YAAY,CAAC;AAGpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC7D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACrC;AAwFD,qBAAa,iBAAkB,YAAW,SAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;gBAE3C,SAAS,EAAE,MAAM,oBAAoB;IAIjD,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAW/B;AAED,qBAAa,eAAgB,YAAW,SAAS;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;gBAE3C,SAAS,EAAE,MAAM,oBAAoB;IAIjD,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAwG/B;AAED,qBAAa,mBAAoB,YAAW,SAAS;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;gBAE3C,SAAS,EAAE,MAAM,oBAAoB;IAIjD,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAU/B;AAED,qBAAa,iBAAkB,YAAW,SAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;gBAE3C,SAAS,EAAE,MAAM,oBAAoB;IAIjD,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAkB/B;AAQD,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,gBAAiB,YAAW,SAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;gBAE5C,SAAS,EAAE,MAAM,qBAAqB;IAIlD,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAgB/B"}
1
+ {"version":3,"file":"interactive-components.d.ts","sourceRoot":"","sources":["../../src/modes/interactive-components.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAiB,MAAM,cAAc,CAAC;AAE/E,OAAO,EAAkB,KAAK,MAAM,EAAa,MAAM,YAAY,CAAC;AAGpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC7D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5E,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS;QAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;KACpE,EAAE,CAAC;CACJ;AAwFD,qBAAa,iBAAkB,YAAW,SAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;gBAE3C,SAAS,EAAE,MAAM,oBAAoB;IAIjD,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAW/B;AAED,qBAAa,eAAgB,YAAW,SAAS;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;gBAE3C,SAAS,EAAE,MAAM,oBAAoB;IAIjD,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CA+G/B;AAED,qBAAa,mBAAoB,YAAW,SAAS;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;gBAE3C,SAAS,EAAE,MAAM,oBAAoB;IAIjD,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAU/B;AAED,qBAAa,iBAAkB,YAAW,SAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;gBAE3C,SAAS,EAAE,MAAM,oBAAoB;IAIjD,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAqB/B;AAQD,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,gBAAiB,YAAW,SAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;gBAE5C,SAAS,EAAE,MAAM,qBAAqB;IAIlD,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAgB/B"}
@@ -102,6 +102,8 @@ export class InteractiveChat {
102
102
  const lines = [];
103
103
  const colors = paletteFor(state.theme);
104
104
  const markdownTheme = markdownThemeFor(colors);
105
+ for (const extension of state.extensions ?? [])
106
+ lines.push(...renderLine(paint(colors.dim, `[${extension.label}]`, extension.tone === "warning" || extension.tone === "error"), width));
105
107
  for (const [index, message] of state.messageItems.entries()) {
106
108
  if (index > 0)
107
109
  lines.push(" ");
@@ -208,11 +210,14 @@ export class InteractiveFooter {
208
210
  const activity = activityLabel(state);
209
211
  const left = paint(activity.color, `* ${activity.text}`, true);
210
212
  const context = paint(colors.dim, `${translate(state.locale ?? DEFAULT_LOCALE, "messages", String(state.messageItems.length))} ${translate(state.locale ?? DEFAULT_LOCALE, "context")} ${formatTokenCount(state.usage.estimatedContextTokens)}/${formatTokenCount(state.usage.contextWindow)} ${translate(state.locale ?? DEFAULT_LOCALE, "total")} ${formatTokenCount(state.usage.totalTokens)} ${translate(state.locale ?? DEFAULT_LOCALE, "tokens")}`);
211
- const right = paint(colors.dim, `${state.model} ${state.theme}`);
213
+ const plan = state.planMode;
214
+ const planLabel = plan?.pending ? "plan: pending" : plan?.active ? "plan: ON" : "plan: off";
215
+ const model = paint(colors.dim, `${state.model} ${state.theme}`);
216
+ const right = plan ? `${paint(plan.active ? colors.accent : colors.dim, planLabel)} ${model}` : model;
212
217
  const status = width >= 60 ? alignEnds(`${left} ${context}`, right, width) : `${left} ${right}`;
213
218
  const pasteImageShortcut = state.pasteImageShortcut ?? (process.platform === "win32" ? "Alt+V" : "Ctrl+V");
214
219
  const hints = width >= 60
215
- ? `Enter ${translate(state.locale ?? DEFAULT_LOCALE, "send")} ${pasteImageShortcut} ${translate(state.locale ?? DEFAULT_LOCALE, "pasteImage")} Shift+Tab ${translate(state.locale ?? DEFAULT_LOCALE, "thinkingShortcut")} Esc ${translate(state.locale ?? DEFAULT_LOCALE, "cancel")} Ctrl+O ${translate(state.locale ?? DEFAULT_LOCALE, "model")}`
220
+ ? `Enter ${translate(state.locale ?? DEFAULT_LOCALE, "send")} ${pasteImageShortcut} ${translate(state.locale ?? DEFAULT_LOCALE, "pasteImage")} Alt+P Plan Shift+Tab ${translate(state.locale ?? DEFAULT_LOCALE, "thinkingShortcut")} Esc ${translate(state.locale ?? DEFAULT_LOCALE, "cancel")} Ctrl+O ${translate(state.locale ?? DEFAULT_LOCALE, "model")}`
216
221
  : `Enter ${translate(state.locale ?? DEFAULT_LOCALE, "send")} ${pasteImageShortcut} ${translate(state.locale ?? DEFAULT_LOCALE, "imageShortcut")}`;
217
222
  return [...renderLine(status, width), ...renderLine(paint(colors.dim, hints), width)];
218
223
  }
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-components.js","sourceRoot":"","sources":["../../src/modes/interactive-components.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AutocompleteItem, Component, MarkdownTheme } from \"@di-code/tui\";\nimport { Markdown, SelectionPanel, Text, truncateToWidth, visibleWidth } from \"@di-code/tui\";\nimport { DEFAULT_LOCALE, type Locale, translate } from \"../i18n.ts\";\nimport { highlightCode } from \"../utils/syntax-highlight.ts\";\nimport { renderDiff } from \"./interactive-diff.ts\";\nimport type { InteractiveState } from \"./interactive-state.ts\";\n\nexport interface InteractiveViewState extends InteractiveState {\n\treadonly model: string;\n\treadonly theme: \"dark\" | \"light\";\n\treadonly locale?: Locale;\n\treadonly pasteImageShortcut?: string;\n}\n\ninterface Palette {\n\treadonly accent: string;\n\treadonly assistant: string;\n\treadonly dim: string;\n\treadonly error: string;\n\treadonly success: string;\n\treadonly userBackground: string;\n\treadonly warning: string;\n}\n\nconst RESET = \"\\x1b[0m\";\nconst BOLD = \"\\x1b[1m\";\nconst MAX_VISIBLE_TOOL_ITEMS = 6;\nconst SPINNER_FRAMES = [\"|\", \"/\", \"-\", \"\\\\\"] as const;\n\nfunction paletteFor(theme: InteractiveViewState[\"theme\"]): Palette {\n\treturn theme === \"light\"\n\t\t? {\n\t\t\t\taccent: \"\\x1b[38;5;25m\",\n\t\t\t\tassistant: \"\\x1b[38;5;30m\",\n\t\t\t\tdim: \"\\x1b[38;5;242m\",\n\t\t\t\terror: \"\\x1b[38;5;160m\",\n\t\t\t\tsuccess: \"\\x1b[38;5;28m\",\n\t\t\t\tuserBackground: \"\\x1b[48;2;239;246;255m\",\n\t\t\t\twarning: \"\\x1b[38;5;130m\",\n\t\t\t}\n\t\t: {\n\t\t\t\taccent: \"\\x1b[38;5;45m\",\n\t\t\t\tassistant: \"\\x1b[38;5;80m\",\n\t\t\t\tdim: \"\\x1b[38;5;245m\",\n\t\t\t\terror: \"\\x1b[38;5;210m\",\n\t\t\t\tsuccess: \"\\x1b[38;5;114m\",\n\t\t\t\tuserBackground: \"\\x1b[48;2;31;39;50m\",\n\t\t\t\twarning: \"\\x1b[38;5;222m\",\n\t\t\t};\n}\n\nfunction paint(color: string, text: string, bold = false): string {\n\treturn `${color}${bold ? BOLD : \"\"}${text}${RESET}`;\n}\n\nfunction paintBackground(background: string, text: string): string {\n\treturn `${background}${text}${RESET}`;\n}\n\nfunction markdownThemeFor(colors: Palette): MarkdownTheme {\n\treturn {\n\t\theading: (text) => paint(colors.assistant, text, true),\n\t\tlink: (text) => paint(colors.accent, text),\n\t\tlinkUrl: (text) => paint(colors.dim, text),\n\t\tcode: (text) => paint(colors.warning, text),\n\t\tcodeBlock: (text) => paint(colors.assistant, text),\n\t\tcodeBlockBorder: (text) => paint(colors.dim, text),\n\t\tquote: (text) => paint(colors.dim, text),\n\t\tquoteBorder: (text) => paint(colors.dim, text),\n\t\thr: (text) => paint(colors.dim, text),\n\t\tlistBullet: (text) => paint(colors.accent, text),\n\t\tbold: (text) => paint(colors.assistant, text, true),\n\t\titalic: (text) => `\\x1b[3m${text}${RESET}`,\n\t\tstrikethrough: (text) => `\\x1b[9m${text}${RESET}`,\n\t\tunderline: (text) => `\\x1b[4m${text}${RESET}`,\n\t\thighlightCode: (code, language) =>\n\t\t\t(language ? highlightCode(code, language) : undefined) ??\n\t\t\tcode.split(\"\\n\").map((line) => paint(colors.assistant, line)),\n\t};\n}\n\nfunction renderLine(text: string, width: number): string[] {\n\treturn new Text(truncateToWidth(text, width, \"\")).render(width);\n}\n\nfunction alignEnds(left: string, right: string, width: number): string {\n\tconst gap = 3;\n\tif (visibleWidth(left) + visibleWidth(right) + gap > width) return truncateToWidth(left, width, \"\");\n\treturn `${left}${\" \".repeat(width - visibleWidth(left) - visibleWidth(right))}${right}`;\n}\n\nfunction activityLabel(state: InteractiveViewState): { readonly text: string; readonly color: string } {\n\tconst colors = paletteFor(state.theme);\n\tif (state.error) return { text: translate(state.locale ?? DEFAULT_LOCALE, \"error\"), color: colors.error };\n\tif (state.compacting) return { text: translate(state.locale ?? DEFAULT_LOCALE, \"compacting\"), color: colors.warning };\n\tif (state.retrying) return { text: translate(state.locale ?? DEFAULT_LOCALE, \"retrying\"), color: colors.warning };\n\tif (state.busy) return { text: translate(state.locale ?? DEFAULT_LOCALE, \"working\"), color: colors.accent };\n\treturn { text: translate(state.locale ?? DEFAULT_LOCALE, \"ready\"), color: colors.success };\n}\n\nexport class InteractiveHeader implements Component {\n\tprivate readonly readState: () => InteractiveViewState;\n\n\tconstructor(readState: () => InteractiveViewState) {\n\t\tthis.readState = readState;\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst state = this.readState();\n\t\tconst colors = paletteFor(state.theme);\n\t\tconst brand = paint(colors.accent, \"DI-CODE / INTERACTIVE\", true);\n\t\tconst model = paint(colors.dim, `MODEL ${state.model}`);\n\t\tconst title =\n\t\t\twidth >= 56\n\t\t\t\t? alignEnds(brand, model, width)\n\t\t\t\t: `${paint(colors.accent, \"DI-CODE\", true)} ${paint(colors.dim, state.model)}`;\n\t\treturn [...renderLine(title, width), ...renderLine(paint(colors.dim, \"-\".repeat(Math.max(0, width))), width)];\n\t}\n}\n\nexport class InteractiveChat implements Component {\n\tprivate readonly readState: () => InteractiveViewState;\n\n\tconstructor(readState: () => InteractiveViewState) {\n\t\tthis.readState = readState;\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst state = this.readState();\n\t\tconst lines: string[] = [];\n\t\tconst colors = paletteFor(state.theme);\n\t\tconst markdownTheme = markdownThemeFor(colors);\n\t\tfor (const [index, message] of state.messageItems.entries()) {\n\t\t\tif (index > 0) lines.push(\" \");\n\t\t\tif (message.role === \"file_change\") {\n\t\t\t\tlines.push(\n\t\t\t\t\t...renderLine(\n\t\t\t\t\t\tpaint(\n\t\t\t\t\t\t\tcolors.dim,\n\t\t\t\t\t\t\t`${translate(state.locale ?? DEFAULT_LOCALE, message.kind === \"edit\" ? \"edited\" : \"wrote\")} ${message.path}`,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t),\n\t\t\t\t\t\twidth,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tif (message.diff) {\n\t\t\t\t\tfor (const line of renderDiff(message.diff, colors)) lines.push(...renderLine(line, width));\n\t\t\t\t} else {\n\t\t\t\t\tfor (const line of message.removed) lines.push(...renderLine(paint(colors.error, `- ${line}`), width));\n\t\t\t\t\tfor (const line of message.added) lines.push(...renderLine(paint(colors.success, `+ ${line}`), width));\n\t\t\t\t}\n\t\t\t} else if (message.role === \"user\") {\n\t\t\t\tlines.push(\n\t\t\t\t\t...new Text(message.text, 2, 1).render(width).map((line) => paintBackground(colors.userBackground, line)),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tlines.push(...new Markdown(message.text, { paddingX: 2, theme: markdownTheme }).render(width));\n\t\t\t}\n\t\t}\n\t\tconst hasProcess = state.processItems.length > 0 || (state.busy && !state.streamingText);\n\t\tif (hasProcess && lines.length > 0) lines.push(\" \");\n\t\tconst toolCount = state.processItems.filter((item) => item.type === \"tool\").length;\n\t\tconst hiddenToolItems = Math.max(0, toolCount - MAX_VISIBLE_TOOL_ITEMS);\n\t\tlet skippedToolItems = 0;\n\t\tfor (const item of state.processItems) {\n\t\t\tif (item.type === \"tool\" && skippedToolItems < hiddenToolItems) {\n\t\t\t\tskippedToolItems += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (item.type === \"tool\" && skippedToolItems === hiddenToolItems && hiddenToolItems > 0) {\n\t\t\t\tlines.push(\n\t\t\t\t\t...renderLine(\n\t\t\t\t\t\t` ${paint(colors.dim, translate(state.locale ?? DEFAULT_LOCALE, \"earlierToolUpdates\", String(hiddenToolItems)))}`,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tskippedToolItems += 1;\n\t\t\t}\n\t\t\tif (item.type === \"thinking\") {\n\t\t\t\tconst frame = SPINNER_FRAMES[state.spinnerFrame % SPINNER_FRAMES.length] ?? SPINNER_FRAMES[0];\n\t\t\t\tlines.push(\n\t\t\t\t\t...renderLine(\n\t\t\t\t\t\t` ${paint(colors.accent, `${frame} ${translate(state.locale ?? DEFAULT_LOCALE, \"thinking\")}`)}`,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst marker = item.status === \"running\" ? \">\" : item.status === \"error\" ? \"!\" : \"+\";\n\t\t\tconst command = truncateToWidth(item.command, Math.max(1, width - 6), \"...\");\n\t\t\tconst color = item.status === \"error\" ? colors.error : item.status === \"done\" ? colors.success : colors.warning;\n\t\t\tlines.push(...renderLine(` ${paint(color, marker)} ${paint(colors.dim, command)}`, width));\n\t\t}\n\t\tif (state.busy && !state.streamingText && !state.processItems.some((item) => item.type === \"thinking\")) {\n\t\t\tconst frame = SPINNER_FRAMES[state.spinnerFrame % SPINNER_FRAMES.length] ?? SPINNER_FRAMES[0];\n\t\t\tlines.push(\n\t\t\t\t...renderLine(\n\t\t\t\t\t` ${paint(colors.accent, `${frame} ${translate(state.locale ?? DEFAULT_LOCALE, \"thinking\")}`)}`,\n\t\t\t\t\twidth,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tif (hasProcess) lines.push(\" \");\n\t\tif (state.streamingText) {\n\t\t\tif (lines.length > 0 && lines.at(-1) !== \" \") lines.push(\" \");\n\t\t\tlines.push(...new Markdown(state.streamingText, { paddingX: 2, theme: markdownTheme }).render(width));\n\t\t}\n\t\tconst hasActivity = state.status || state.queue.length > 0 || state.error;\n\t\tif (hasActivity) {\n\t\t\tif (lines.length > 0) lines.push(\" \");\n\t\t\tlines.push(...renderLine(paint(colors.dim, translate(state.locale ?? DEFAULT_LOCALE, \"activity\"), true), width));\n\t\t\tif (state.status) lines.push(...renderLine(` ${paint(colors.dim, state.status)}`, width));\n\t\t\tif (state.queue.length > 0) {\n\t\t\t\tlines.push(\n\t\t\t\t\t...renderLine(\n\t\t\t\t\t\t` ${paint(colors.dim, translate(state.locale ?? DEFAULT_LOCALE, \"queue\", String(state.queue.length)))}`,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tfor (const prompt of state.queue) lines.push(...new Text(` ${prompt}`).render(width));\n\t\t\t}\n\t\t\tif (state.error)\n\t\t\t\tlines.push(\n\t\t\t\t\t...new Text(\n\t\t\t\t\t\t` ${paint(colors.error, `${translate(state.locale ?? DEFAULT_LOCALE, \"errorPrefix\")}: ${state.error}`, true)}`,\n\t\t\t\t\t).render(width),\n\t\t\t\t);\n\t\t}\n\t\tconst rendered = lines.flatMap((line) => new Text(line).render(width));\n\t\treturn rendered.length > 0 ? rendered : [\"\"];\n\t}\n}\n\nexport class InteractiveComposer implements Component {\n\tprivate readonly readState: () => InteractiveViewState;\n\n\tconstructor(readState: () => InteractiveViewState) {\n\t\tthis.readState = readState;\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst state = this.readState();\n\t\tconst colors = paletteFor(state.theme);\n\t\tconst locale = state.locale ?? DEFAULT_LOCALE;\n\t\tconst copy =\n\t\t\twidth >= 56\n\t\t\t\t? `/ ${translate(locale, \"commands\")} Tab ${translate(locale, \"complete\")}`\n\t\t\t\t: `/ ${translate(locale, \"commands\")}`;\n\t\treturn renderLine(paint(colors.dim, copy), width);\n\t}\n}\n\nexport class InteractiveFooter implements Component {\n\tprivate readonly readState: () => InteractiveViewState;\n\n\tconstructor(readState: () => InteractiveViewState) {\n\t\tthis.readState = readState;\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst state = this.readState();\n\t\tconst colors = paletteFor(state.theme);\n\t\tconst activity = activityLabel(state);\n\t\tconst left = paint(activity.color, `* ${activity.text}`, true);\n\t\tconst context = paint(\n\t\t\tcolors.dim,\n\t\t\t`${translate(state.locale ?? DEFAULT_LOCALE, \"messages\", String(state.messageItems.length))} ${translate(state.locale ?? DEFAULT_LOCALE, \"context\")} ${formatTokenCount(state.usage.estimatedContextTokens)}/${formatTokenCount(state.usage.contextWindow)} ${translate(state.locale ?? DEFAULT_LOCALE, \"total\")} ${formatTokenCount(state.usage.totalTokens)} ${translate(state.locale ?? DEFAULT_LOCALE, \"tokens\")}`,\n\t\t);\n\t\tconst right = paint(colors.dim, `${state.model} ${state.theme}`);\n\t\tconst status = width >= 60 ? alignEnds(`${left} ${context}`, right, width) : `${left} ${right}`;\n\t\tconst pasteImageShortcut = state.pasteImageShortcut ?? (process.platform === \"win32\" ? \"Alt+V\" : \"Ctrl+V\");\n\t\tconst hints =\n\t\t\twidth >= 60\n\t\t\t\t? `Enter ${translate(state.locale ?? DEFAULT_LOCALE, \"send\")} ${pasteImageShortcut} ${translate(state.locale ?? DEFAULT_LOCALE, \"pasteImage\")} Shift+Tab ${translate(state.locale ?? DEFAULT_LOCALE, \"thinkingShortcut\")} Esc ${translate(state.locale ?? DEFAULT_LOCALE, \"cancel\")} Ctrl+O ${translate(state.locale ?? DEFAULT_LOCALE, \"model\")}`\n\t\t\t\t: `Enter ${translate(state.locale ?? DEFAULT_LOCALE, \"send\")} ${pasteImageShortcut} ${translate(state.locale ?? DEFAULT_LOCALE, \"imageShortcut\")}`;\n\t\treturn [...renderLine(status, width), ...renderLine(paint(colors.dim, hints), width)];\n\t}\n}\n\nfunction formatTokenCount(value: number): string {\n\tif (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}m`;\n\tif (value >= 1_000) return `${(value / 1_000).toFixed(1)}k`;\n\treturn String(value);\n}\n\nexport interface AutocompleteMenuState {\n\treadonly items: readonly AutocompleteItem[];\n\treadonly index: number;\n}\n\nexport class AutocompleteMenu implements Component {\n\tprivate readonly readState: () => AutocompleteMenuState;\n\n\tconstructor(readState: () => AutocompleteMenuState) {\n\t\tthis.readState = readState;\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst state = this.readState();\n\t\tconst maxVisible = 6;\n\t\tconst start = Math.min(\n\t\t\tMath.max(0, state.index - Math.floor(maxVisible / 2)),\n\t\t\tMath.max(0, state.items.length - maxVisible),\n\t\t);\n\t\tconst items = state.items.slice(start, start + maxVisible);\n\t\treturn new SelectionPanel({\n\t\t\ttitle: \"Suggestions\",\n\t\t\trows: items.map((item) => `${item.label}${item.description ? ` - ${item.description}` : \"\"}`),\n\t\t\tselectedIndex: state.index - start,\n\t\t\tposition: state.index + 1,\n\t\t\ttotal: state.items.length,\n\t\t}).render(width);\n\t}\n}\n"]}
1
+ {"version":3,"file":"interactive-components.js","sourceRoot":"","sources":["../../src/modes/interactive-components.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AutocompleteItem, Component, MarkdownTheme } from \"@di-code/tui\";\nimport { Markdown, SelectionPanel, Text, truncateToWidth, visibleWidth } from \"@di-code/tui\";\nimport { DEFAULT_LOCALE, type Locale, translate } from \"../i18n.ts\";\nimport { highlightCode } from \"../utils/syntax-highlight.ts\";\nimport { renderDiff } from \"./interactive-diff.ts\";\nimport type { InteractiveState } from \"./interactive-state.ts\";\n\nexport interface InteractiveViewState extends InteractiveState {\n\treadonly model: string;\n\treadonly theme: \"dark\" | \"light\";\n\treadonly locale?: Locale;\n\treadonly pasteImageShortcut?: string;\n\treadonly planMode?: { readonly active: boolean; readonly pending: boolean };\n\treadonly extensions?: readonly {\n\t\treadonly label: string;\n\t\treadonly tone: \"neutral\" | \"info\" | \"success\" | \"warning\" | \"error\";\n\t}[];\n}\n\ninterface Palette {\n\treadonly accent: string;\n\treadonly assistant: string;\n\treadonly dim: string;\n\treadonly error: string;\n\treadonly success: string;\n\treadonly userBackground: string;\n\treadonly warning: string;\n}\n\nconst RESET = \"\\x1b[0m\";\nconst BOLD = \"\\x1b[1m\";\nconst MAX_VISIBLE_TOOL_ITEMS = 6;\nconst SPINNER_FRAMES = [\"|\", \"/\", \"-\", \"\\\\\"] as const;\n\nfunction paletteFor(theme: InteractiveViewState[\"theme\"]): Palette {\n\treturn theme === \"light\"\n\t\t? {\n\t\t\t\taccent: \"\\x1b[38;5;25m\",\n\t\t\t\tassistant: \"\\x1b[38;5;30m\",\n\t\t\t\tdim: \"\\x1b[38;5;242m\",\n\t\t\t\terror: \"\\x1b[38;5;160m\",\n\t\t\t\tsuccess: \"\\x1b[38;5;28m\",\n\t\t\t\tuserBackground: \"\\x1b[48;2;239;246;255m\",\n\t\t\t\twarning: \"\\x1b[38;5;130m\",\n\t\t\t}\n\t\t: {\n\t\t\t\taccent: \"\\x1b[38;5;45m\",\n\t\t\t\tassistant: \"\\x1b[38;5;80m\",\n\t\t\t\tdim: \"\\x1b[38;5;245m\",\n\t\t\t\terror: \"\\x1b[38;5;210m\",\n\t\t\t\tsuccess: \"\\x1b[38;5;114m\",\n\t\t\t\tuserBackground: \"\\x1b[48;2;31;39;50m\",\n\t\t\t\twarning: \"\\x1b[38;5;222m\",\n\t\t\t};\n}\n\nfunction paint(color: string, text: string, bold = false): string {\n\treturn `${color}${bold ? BOLD : \"\"}${text}${RESET}`;\n}\n\nfunction paintBackground(background: string, text: string): string {\n\treturn `${background}${text}${RESET}`;\n}\n\nfunction markdownThemeFor(colors: Palette): MarkdownTheme {\n\treturn {\n\t\theading: (text) => paint(colors.assistant, text, true),\n\t\tlink: (text) => paint(colors.accent, text),\n\t\tlinkUrl: (text) => paint(colors.dim, text),\n\t\tcode: (text) => paint(colors.warning, text),\n\t\tcodeBlock: (text) => paint(colors.assistant, text),\n\t\tcodeBlockBorder: (text) => paint(colors.dim, text),\n\t\tquote: (text) => paint(colors.dim, text),\n\t\tquoteBorder: (text) => paint(colors.dim, text),\n\t\thr: (text) => paint(colors.dim, text),\n\t\tlistBullet: (text) => paint(colors.accent, text),\n\t\tbold: (text) => paint(colors.assistant, text, true),\n\t\titalic: (text) => `\\x1b[3m${text}${RESET}`,\n\t\tstrikethrough: (text) => `\\x1b[9m${text}${RESET}`,\n\t\tunderline: (text) => `\\x1b[4m${text}${RESET}`,\n\t\thighlightCode: (code, language) =>\n\t\t\t(language ? highlightCode(code, language) : undefined) ??\n\t\t\tcode.split(\"\\n\").map((line) => paint(colors.assistant, line)),\n\t};\n}\n\nfunction renderLine(text: string, width: number): string[] {\n\treturn new Text(truncateToWidth(text, width, \"\")).render(width);\n}\n\nfunction alignEnds(left: string, right: string, width: number): string {\n\tconst gap = 3;\n\tif (visibleWidth(left) + visibleWidth(right) + gap > width) return truncateToWidth(left, width, \"\");\n\treturn `${left}${\" \".repeat(width - visibleWidth(left) - visibleWidth(right))}${right}`;\n}\n\nfunction activityLabel(state: InteractiveViewState): { readonly text: string; readonly color: string } {\n\tconst colors = paletteFor(state.theme);\n\tif (state.error) return { text: translate(state.locale ?? DEFAULT_LOCALE, \"error\"), color: colors.error };\n\tif (state.compacting) return { text: translate(state.locale ?? DEFAULT_LOCALE, \"compacting\"), color: colors.warning };\n\tif (state.retrying) return { text: translate(state.locale ?? DEFAULT_LOCALE, \"retrying\"), color: colors.warning };\n\tif (state.busy) return { text: translate(state.locale ?? DEFAULT_LOCALE, \"working\"), color: colors.accent };\n\treturn { text: translate(state.locale ?? DEFAULT_LOCALE, \"ready\"), color: colors.success };\n}\n\nexport class InteractiveHeader implements Component {\n\tprivate readonly readState: () => InteractiveViewState;\n\n\tconstructor(readState: () => InteractiveViewState) {\n\t\tthis.readState = readState;\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst state = this.readState();\n\t\tconst colors = paletteFor(state.theme);\n\t\tconst brand = paint(colors.accent, \"DI-CODE / INTERACTIVE\", true);\n\t\tconst model = paint(colors.dim, `MODEL ${state.model}`);\n\t\tconst title =\n\t\t\twidth >= 56\n\t\t\t\t? alignEnds(brand, model, width)\n\t\t\t\t: `${paint(colors.accent, \"DI-CODE\", true)} ${paint(colors.dim, state.model)}`;\n\t\treturn [...renderLine(title, width), ...renderLine(paint(colors.dim, \"-\".repeat(Math.max(0, width))), width)];\n\t}\n}\n\nexport class InteractiveChat implements Component {\n\tprivate readonly readState: () => InteractiveViewState;\n\n\tconstructor(readState: () => InteractiveViewState) {\n\t\tthis.readState = readState;\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst state = this.readState();\n\t\tconst lines: string[] = [];\n\t\tconst colors = paletteFor(state.theme);\n\t\tconst markdownTheme = markdownThemeFor(colors);\n\t\tfor (const extension of state.extensions ?? [])\n\t\t\tlines.push(\n\t\t\t\t...renderLine(\n\t\t\t\t\tpaint(colors.dim, `[${extension.label}]`, extension.tone === \"warning\" || extension.tone === \"error\"),\n\t\t\t\t\twidth,\n\t\t\t\t),\n\t\t\t);\n\t\tfor (const [index, message] of state.messageItems.entries()) {\n\t\t\tif (index > 0) lines.push(\" \");\n\t\t\tif (message.role === \"file_change\") {\n\t\t\t\tlines.push(\n\t\t\t\t\t...renderLine(\n\t\t\t\t\t\tpaint(\n\t\t\t\t\t\t\tcolors.dim,\n\t\t\t\t\t\t\t`${translate(state.locale ?? DEFAULT_LOCALE, message.kind === \"edit\" ? \"edited\" : \"wrote\")} ${message.path}`,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t),\n\t\t\t\t\t\twidth,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tif (message.diff) {\n\t\t\t\t\tfor (const line of renderDiff(message.diff, colors)) lines.push(...renderLine(line, width));\n\t\t\t\t} else {\n\t\t\t\t\tfor (const line of message.removed) lines.push(...renderLine(paint(colors.error, `- ${line}`), width));\n\t\t\t\t\tfor (const line of message.added) lines.push(...renderLine(paint(colors.success, `+ ${line}`), width));\n\t\t\t\t}\n\t\t\t} else if (message.role === \"user\") {\n\t\t\t\tlines.push(\n\t\t\t\t\t...new Text(message.text, 2, 1).render(width).map((line) => paintBackground(colors.userBackground, line)),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tlines.push(...new Markdown(message.text, { paddingX: 2, theme: markdownTheme }).render(width));\n\t\t\t}\n\t\t}\n\t\tconst hasProcess = state.processItems.length > 0 || (state.busy && !state.streamingText);\n\t\tif (hasProcess && lines.length > 0) lines.push(\" \");\n\t\tconst toolCount = state.processItems.filter((item) => item.type === \"tool\").length;\n\t\tconst hiddenToolItems = Math.max(0, toolCount - MAX_VISIBLE_TOOL_ITEMS);\n\t\tlet skippedToolItems = 0;\n\t\tfor (const item of state.processItems) {\n\t\t\tif (item.type === \"tool\" && skippedToolItems < hiddenToolItems) {\n\t\t\t\tskippedToolItems += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (item.type === \"tool\" && skippedToolItems === hiddenToolItems && hiddenToolItems > 0) {\n\t\t\t\tlines.push(\n\t\t\t\t\t...renderLine(\n\t\t\t\t\t\t` ${paint(colors.dim, translate(state.locale ?? DEFAULT_LOCALE, \"earlierToolUpdates\", String(hiddenToolItems)))}`,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tskippedToolItems += 1;\n\t\t\t}\n\t\t\tif (item.type === \"thinking\") {\n\t\t\t\tconst frame = SPINNER_FRAMES[state.spinnerFrame % SPINNER_FRAMES.length] ?? SPINNER_FRAMES[0];\n\t\t\t\tlines.push(\n\t\t\t\t\t...renderLine(\n\t\t\t\t\t\t` ${paint(colors.accent, `${frame} ${translate(state.locale ?? DEFAULT_LOCALE, \"thinking\")}`)}`,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst marker = item.status === \"running\" ? \">\" : item.status === \"error\" ? \"!\" : \"+\";\n\t\t\tconst command = truncateToWidth(item.command, Math.max(1, width - 6), \"...\");\n\t\t\tconst color = item.status === \"error\" ? colors.error : item.status === \"done\" ? colors.success : colors.warning;\n\t\t\tlines.push(...renderLine(` ${paint(color, marker)} ${paint(colors.dim, command)}`, width));\n\t\t}\n\t\tif (state.busy && !state.streamingText && !state.processItems.some((item) => item.type === \"thinking\")) {\n\t\t\tconst frame = SPINNER_FRAMES[state.spinnerFrame % SPINNER_FRAMES.length] ?? SPINNER_FRAMES[0];\n\t\t\tlines.push(\n\t\t\t\t...renderLine(\n\t\t\t\t\t` ${paint(colors.accent, `${frame} ${translate(state.locale ?? DEFAULT_LOCALE, \"thinking\")}`)}`,\n\t\t\t\t\twidth,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tif (hasProcess) lines.push(\" \");\n\t\tif (state.streamingText) {\n\t\t\tif (lines.length > 0 && lines.at(-1) !== \" \") lines.push(\" \");\n\t\t\tlines.push(...new Markdown(state.streamingText, { paddingX: 2, theme: markdownTheme }).render(width));\n\t\t}\n\t\tconst hasActivity = state.status || state.queue.length > 0 || state.error;\n\t\tif (hasActivity) {\n\t\t\tif (lines.length > 0) lines.push(\" \");\n\t\t\tlines.push(...renderLine(paint(colors.dim, translate(state.locale ?? DEFAULT_LOCALE, \"activity\"), true), width));\n\t\t\tif (state.status) lines.push(...renderLine(` ${paint(colors.dim, state.status)}`, width));\n\t\t\tif (state.queue.length > 0) {\n\t\t\t\tlines.push(\n\t\t\t\t\t...renderLine(\n\t\t\t\t\t\t` ${paint(colors.dim, translate(state.locale ?? DEFAULT_LOCALE, \"queue\", String(state.queue.length)))}`,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tfor (const prompt of state.queue) lines.push(...new Text(` ${prompt}`).render(width));\n\t\t\t}\n\t\t\tif (state.error)\n\t\t\t\tlines.push(\n\t\t\t\t\t...new Text(\n\t\t\t\t\t\t` ${paint(colors.error, `${translate(state.locale ?? DEFAULT_LOCALE, \"errorPrefix\")}: ${state.error}`, true)}`,\n\t\t\t\t\t).render(width),\n\t\t\t\t);\n\t\t}\n\t\tconst rendered = lines.flatMap((line) => new Text(line).render(width));\n\t\treturn rendered.length > 0 ? rendered : [\"\"];\n\t}\n}\n\nexport class InteractiveComposer implements Component {\n\tprivate readonly readState: () => InteractiveViewState;\n\n\tconstructor(readState: () => InteractiveViewState) {\n\t\tthis.readState = readState;\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst state = this.readState();\n\t\tconst colors = paletteFor(state.theme);\n\t\tconst locale = state.locale ?? DEFAULT_LOCALE;\n\t\tconst copy =\n\t\t\twidth >= 56\n\t\t\t\t? `/ ${translate(locale, \"commands\")} Tab ${translate(locale, \"complete\")}`\n\t\t\t\t: `/ ${translate(locale, \"commands\")}`;\n\t\treturn renderLine(paint(colors.dim, copy), width);\n\t}\n}\n\nexport class InteractiveFooter implements Component {\n\tprivate readonly readState: () => InteractiveViewState;\n\n\tconstructor(readState: () => InteractiveViewState) {\n\t\tthis.readState = readState;\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst state = this.readState();\n\t\tconst colors = paletteFor(state.theme);\n\t\tconst activity = activityLabel(state);\n\t\tconst left = paint(activity.color, `* ${activity.text}`, true);\n\t\tconst context = paint(\n\t\t\tcolors.dim,\n\t\t\t`${translate(state.locale ?? DEFAULT_LOCALE, \"messages\", String(state.messageItems.length))} ${translate(state.locale ?? DEFAULT_LOCALE, \"context\")} ${formatTokenCount(state.usage.estimatedContextTokens)}/${formatTokenCount(state.usage.contextWindow)} ${translate(state.locale ?? DEFAULT_LOCALE, \"total\")} ${formatTokenCount(state.usage.totalTokens)} ${translate(state.locale ?? DEFAULT_LOCALE, \"tokens\")}`,\n\t\t);\n\t\tconst plan = state.planMode;\n\t\tconst planLabel = plan?.pending ? \"plan: pending\" : plan?.active ? \"plan: ON\" : \"plan: off\";\n\t\tconst model = paint(colors.dim, `${state.model} ${state.theme}`);\n\t\tconst right = plan ? `${paint(plan.active ? colors.accent : colors.dim, planLabel)} ${model}` : model;\n\t\tconst status = width >= 60 ? alignEnds(`${left} ${context}`, right, width) : `${left} ${right}`;\n\t\tconst pasteImageShortcut = state.pasteImageShortcut ?? (process.platform === \"win32\" ? \"Alt+V\" : \"Ctrl+V\");\n\t\tconst hints =\n\t\t\twidth >= 60\n\t\t\t\t? `Enter ${translate(state.locale ?? DEFAULT_LOCALE, \"send\")} ${pasteImageShortcut} ${translate(state.locale ?? DEFAULT_LOCALE, \"pasteImage\")} Alt+P Plan Shift+Tab ${translate(state.locale ?? DEFAULT_LOCALE, \"thinkingShortcut\")} Esc ${translate(state.locale ?? DEFAULT_LOCALE, \"cancel\")} Ctrl+O ${translate(state.locale ?? DEFAULT_LOCALE, \"model\")}`\n\t\t\t\t: `Enter ${translate(state.locale ?? DEFAULT_LOCALE, \"send\")} ${pasteImageShortcut} ${translate(state.locale ?? DEFAULT_LOCALE, \"imageShortcut\")}`;\n\t\treturn [...renderLine(status, width), ...renderLine(paint(colors.dim, hints), width)];\n\t}\n}\n\nfunction formatTokenCount(value: number): string {\n\tif (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}m`;\n\tif (value >= 1_000) return `${(value / 1_000).toFixed(1)}k`;\n\treturn String(value);\n}\n\nexport interface AutocompleteMenuState {\n\treadonly items: readonly AutocompleteItem[];\n\treadonly index: number;\n}\n\nexport class AutocompleteMenu implements Component {\n\tprivate readonly readState: () => AutocompleteMenuState;\n\n\tconstructor(readState: () => AutocompleteMenuState) {\n\t\tthis.readState = readState;\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst state = this.readState();\n\t\tconst maxVisible = 6;\n\t\tconst start = Math.min(\n\t\t\tMath.max(0, state.index - Math.floor(maxVisible / 2)),\n\t\t\tMath.max(0, state.items.length - maxVisible),\n\t\t);\n\t\tconst items = state.items.slice(start, start + maxVisible);\n\t\treturn new SelectionPanel({\n\t\t\ttitle: \"Suggestions\",\n\t\t\trows: items.map((item) => `${item.label}${item.description ? ` - ${item.description}` : \"\"}`),\n\t\t\tselectedIndex: state.index - start,\n\t\t\tposition: state.index + 1,\n\t\t\ttotal: state.items.length,\n\t\t}).render(width);\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-state.d.ts","sourceRoot":"","sources":["../../src/modes/interactive-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG1E,MAAM,MAAM,kBAAkB,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9D;IACA,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAClC,CAAC;AAIL,MAAM,MAAM,sBAAsB,GAC/B;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAA;CAAE,GACtD;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;CAC7C,CAAC;AAEL,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACrD,QAAQ,CAAC,YAAY,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACzD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;CAC7B;AAUD,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4B;IACzD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA0C;IAC7E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgC;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,KAAK,CAYX;IAEF,IAAI,KAAK,IAAI,gBAAgB,CAqB5B;IAED,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAI3C,oBAAoB,IAAI,IAAI;IAU5B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAIxC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAI3C,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAInC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAIjC,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAInC,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAK9D,cAAc,IAAI,OAAO;IAMzB,qBAAqB,IAAI,IAAI;IAM7B,iBAAiB,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI;IAarD,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAuErC,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,sBAAsB;IAwB9B,OAAO,CAAC,eAAe;IA2CvB,OAAO,CAAC,gBAAgB;CASxB"}
1
+ {"version":3,"file":"interactive-state.d.ts","sourceRoot":"","sources":["../../src/modes/interactive-state.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,6 @@
1
1
  import { computeEditsDiff } from "../core/tools/edit-diff.js";
2
2
  function textOf(message) {
3
- return message.content
4
- .filter((content) => content.type === "text")
5
- .map((content) => content.text)
6
- .join("");
3
+ return message.content.map((content) => (content.type === "text" ? content.text : "")).join("");
7
4
  }
8
5
  export class InteractiveProjection {
9
6
  messages = [];