@code-yeongyu/senpi 2026.7.9-2 → 2026.7.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/CHANGELOG.md +1 -25
  2. package/README.md +1 -1
  3. package/dist/cli/args.js +3 -3
  4. package/dist/cli/args.js.map +1 -1
  5. package/dist/cli/config-selector.d.ts +2 -4
  6. package/dist/cli/config-selector.d.ts.map +1 -1
  7. package/dist/cli/config-selector.js +1 -1
  8. package/dist/cli/config-selector.js.map +1 -1
  9. package/dist/core/agent-session.d.ts +3 -18
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +36 -153
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/compaction/compaction.d.ts +2 -1
  14. package/dist/core/compaction/compaction.d.ts.map +1 -1
  15. package/dist/core/compaction/compaction.js +79 -54
  16. package/dist/core/compaction/compaction.js.map +1 -1
  17. package/dist/core/extensions/builtin/goal/continuation.js +1 -1
  18. package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
  19. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  20. package/dist/core/extensions/builtin/goal/index.js +0 -1
  21. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  22. package/dist/core/extensions/builtin/import-repro.d.ts.map +1 -1
  23. package/dist/core/extensions/builtin/import-repro.js +6 -100
  24. package/dist/core/extensions/builtin/import-repro.js.map +1 -1
  25. package/dist/core/extensions/builtin/mcp/connection.d.ts +0 -1
  26. package/dist/core/extensions/builtin/mcp/connection.d.ts.map +1 -1
  27. package/dist/core/extensions/builtin/mcp/connection.js +0 -15
  28. package/dist/core/extensions/builtin/mcp/connection.js.map +1 -1
  29. package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
  30. package/dist/core/extensions/builtin/mcp/service.js +1 -3
  31. package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
  32. package/dist/core/extensions/index.d.ts +1 -1
  33. package/dist/core/extensions/index.d.ts.map +1 -1
  34. package/dist/core/extensions/index.js.map +1 -1
  35. package/dist/core/extensions/runner.d.ts +3 -4
  36. package/dist/core/extensions/runner.d.ts.map +1 -1
  37. package/dist/core/extensions/runner.js +24 -30
  38. package/dist/core/extensions/runner.js.map +1 -1
  39. package/dist/core/extensions/types.d.ts +3 -23
  40. package/dist/core/extensions/types.d.ts.map +1 -1
  41. package/dist/core/extensions/types.js.map +1 -1
  42. package/dist/core/model-registry.d.ts +0 -3
  43. package/dist/core/model-registry.d.ts.map +1 -1
  44. package/dist/core/model-registry.js +3 -20
  45. package/dist/core/model-registry.js.map +1 -1
  46. package/dist/core/package-manager.d.ts +1 -4
  47. package/dist/core/package-manager.d.ts.map +1 -1
  48. package/dist/core/package-manager.js +26 -68
  49. package/dist/core/package-manager.js.map +1 -1
  50. package/dist/core/resource-loader.d.ts +2 -2
  51. package/dist/core/resource-loader.d.ts.map +1 -1
  52. package/dist/core/resource-loader.js +7 -6
  53. package/dist/core/resource-loader.js.map +1 -1
  54. package/dist/core/sdk.d.ts +1 -1
  55. package/dist/core/sdk.d.ts.map +1 -1
  56. package/dist/core/sdk.js +2 -9
  57. package/dist/core/sdk.js.map +1 -1
  58. package/dist/core/session-manager.d.ts.map +1 -1
  59. package/dist/core/session-manager.js +2 -11
  60. package/dist/core/session-manager.js.map +1 -1
  61. package/dist/core/settings-manager.d.ts +0 -5
  62. package/dist/core/settings-manager.d.ts.map +1 -1
  63. package/dist/core/settings-manager.js +0 -8
  64. package/dist/core/settings-manager.js.map +1 -1
  65. package/dist/core/slash-commands.d.ts +0 -1
  66. package/dist/core/slash-commands.d.ts.map +1 -1
  67. package/dist/core/slash-commands.js +3 -3
  68. package/dist/core/slash-commands.js.map +1 -1
  69. package/dist/index.d.ts +1 -1
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js.map +1 -1
  72. package/dist/main.d.ts +2 -2
  73. package/dist/main.d.ts.map +1 -1
  74. package/dist/main.js +0 -1
  75. package/dist/main.js.map +1 -1
  76. package/dist/modes/interactive/components/config-selector.d.ts +3 -34
  77. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  78. package/dist/modes/interactive/components/config-selector.js +24 -272
  79. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  80. package/dist/modes/interactive/components/footer.d.ts +0 -4
  81. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  82. package/dist/modes/interactive/components/footer.js +2 -5
  83. package/dist/modes/interactive/components/footer.js.map +1 -1
  84. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -3
  85. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  86. package/dist/modes/interactive/components/oauth-selector.js +6 -16
  87. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  88. package/dist/modes/interactive/components/settings-selector.d.ts +0 -2
  89. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  90. package/dist/modes/interactive/components/settings-selector.js +0 -10
  91. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  92. package/dist/modes/interactive/interactive-mode.d.ts +0 -10
  93. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  94. package/dist/modes/interactive/interactive-mode.js +37 -261
  95. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  96. package/dist/modes/print-mode.js +1 -1
  97. package/dist/modes/print-mode.js.map +1 -1
  98. package/dist/modes/rpc/rpc-client.d.ts +6 -6
  99. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  100. package/dist/modes/rpc/rpc-client.js +3 -3
  101. package/dist/modes/rpc/rpc-client.js.map +1 -1
  102. package/dist/package-manager-cli.d.ts +2 -2
  103. package/dist/package-manager-cli.d.ts.map +1 -1
  104. package/dist/package-manager-cli.js +17 -64
  105. package/dist/package-manager-cli.js.map +1 -1
  106. package/dist/utils/clipboard-image.js +1 -1
  107. package/dist/utils/clipboard-image.js.map +1 -1
  108. package/docs/extensions.md +9 -33
  109. package/docs/models.md +4 -4
  110. package/docs/packages.md +10 -7
  111. package/docs/rpc.md +3 -13
  112. package/docs/sdk.md +0 -22
  113. package/docs/settings.md +0 -1
  114. package/docs/usage.md +1 -1
  115. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  116. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  117. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  118. package/examples/extensions/gondolin/package-lock.json +2 -2
  119. package/examples/extensions/gondolin/package.json +1 -1
  120. package/examples/extensions/reload-runtime.ts +2 -2
  121. package/examples/extensions/sandbox/package-lock.json +2 -2
  122. package/examples/extensions/sandbox/package.json +1 -1
  123. package/examples/extensions/with-deps/package-lock.json +2 -2
  124. package/examples/extensions/with-deps/package.json +1 -1
  125. package/examples/sdk/README.md +1 -1
  126. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  127. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  128. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +2 -37
  129. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  130. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.d.ts.map +1 -1
  131. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.js +0 -2
  132. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.js.map +1 -1
  133. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.d.ts +0 -1
  134. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.d.ts.map +1 -1
  135. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.js +0 -7
  136. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.js.map +1 -1
  137. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts +4 -18
  138. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
  139. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js +37 -72
  140. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
  141. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts +0 -2
  142. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  143. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js.map +1 -1
  144. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +0 -2
  145. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
  146. package/node_modules/@earendil-works/pi-agent-core/dist/index.js +0 -2
  147. package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
  148. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  149. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  150. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +1 -2
  151. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  152. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +1 -1
  153. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  154. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -1
  155. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js +1 -4
  156. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
  157. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +195 -446
  158. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  159. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts +0 -84
  160. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts.map +1 -1
  161. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js +0 -72
  162. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js.map +1 -1
  163. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js +4 -4
  164. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js.map +1 -1
  165. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts +0 -63
  166. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts.map +1 -1
  167. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js +0 -54
  168. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js.map +1 -1
  169. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts +0 -84
  170. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts.map +1 -1
  171. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js +0 -72
  172. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js.map +1 -1
  173. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +63 -138
  174. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
  175. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +76 -136
  176. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
  177. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts +0 -77
  178. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  179. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js +0 -71
  180. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  181. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.d.ts +44 -0
  182. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -1
  183. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.js +45 -9
  184. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -1
  185. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.d.ts +44 -0
  186. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -1
  187. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.js +45 -9
  188. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -1
  189. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.d.ts +44 -0
  190. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -1
  191. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.js +45 -9
  192. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -1
  193. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  194. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +0 -3
  195. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  196. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  197. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  198. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  199. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +1 -22
  200. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  201. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  202. package/npm-shrinkwrap.json +14 -14
  203. package/package.json +6 -6
  204. package/dist/core/cache-stats.d.ts +0 -49
  205. package/dist/core/cache-stats.d.ts.map +0 -1
  206. package/dist/core/cache-stats.js +0 -101
  207. package/dist/core/cache-stats.js.map +0 -1
@@ -81,94 +81,12 @@ function decodeExportedHtml(html) {
81
81
  const lines = [header, ...sessionData.entries].map((entry) => JSON.stringify(entry));
82
82
  return { header, jsonl: `${lines.join("\n")}\n` };
83
83
  }
84
- function escapeJsonString(value) {
85
- return JSON.stringify(value).slice(1, -1);
86
- }
87
- function escapeRegExp(value) {
88
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
89
- }
90
- function trimTrailingPathSeparators(value) {
91
- return value.replace(/[\\/]+$/, "");
92
- }
93
- function getPathTailName(value) {
94
- const trimmed = trimTrailingPathSeparators(value);
95
- return trimmed.split(/[\\/]/).filter(Boolean).at(-1) ?? "";
96
- }
97
- function getWindowsDrivePathParts(value) {
98
- const trimmed = trimTrailingPathSeparators(value);
99
- const driveMatch = trimmed.match(/^([A-Za-z]):[\\/](.*)$/);
100
- if (driveMatch) {
101
- return { drive: driveMatch[1].toUpperCase(), rest: driveMatch[2].replace(/[\\/]+/g, "/") };
102
- }
103
- const msysMatch = trimmed.match(/^\/([A-Za-z])\/(.*)$/);
104
- if (msysMatch) {
105
- return { drive: msysMatch[1].toUpperCase(), rest: msysMatch[2].replace(/[\\/]+/g, "/") };
106
- }
107
- return undefined;
108
- }
109
- function getCwdRewriteVariants(sourceCwd) {
110
- const trimmed = trimTrailingPathSeparators(sourceCwd);
111
- const variants = new Set();
112
- if (trimmed)
113
- variants.add(trimmed);
114
- const driveParts = getWindowsDrivePathParts(trimmed);
115
- if (driveParts) {
116
- const rest = driveParts.rest.replace(/^\/+|\/+$/g, "");
117
- const backslashRest = rest.replace(/\//g, "\\");
118
- variants.add(`${driveParts.drive}:\\${backslashRest}`);
119
- variants.add(`${driveParts.drive}:/${rest}`);
120
- variants.add(`/${driveParts.drive.toLowerCase()}/${rest}`);
121
- variants.add(`/${driveParts.drive}/${rest}`);
122
- }
123
- return Array.from(variants)
124
- .filter(Boolean)
125
- .sort((a, b) => b.length - a.length);
126
- }
127
- function getCiWorkdirName(sourceCwd) {
128
- const name = getPathTailName(sourceCwd);
129
- return /^pi-ci-[0-9a-f]{32}$/i.test(name) ? name : undefined;
130
- }
131
- function detectSessionPlatform(cwd) {
132
- if (/^[A-Za-z]:[\\/]/.test(cwd) || /^\/[A-Za-z]\//.test(cwd))
133
- return "windows";
134
- if (cwd.startsWith("/"))
135
- return "unix";
136
- return "unknown";
137
- }
138
- function getLocalPlatform() {
139
- return process.platform === "win32" ? "windows" : "unix";
140
- }
141
- function getPlatformContinuationNotice(sourceCwd) {
142
- const sourcePlatform = detectSessionPlatform(sourceCwd);
143
- const localPlatform = getLocalPlatform();
144
- if (sourcePlatform === "unknown" || sourcePlatform === localPlatform)
145
- return undefined;
146
- if (localPlatform === "unix") {
147
- return "This session was continued on a non-Windows machine; paths are now Unix style.";
148
- }
149
- return "This session was continued on a Windows machine; paths are now Windows style.";
150
- }
151
- /** Rewrite occurrences of the recorded CI cwd (JSON-escaped) to the target cwd. */
84
+ /** Rewrite all occurrences of the recorded cwd (JSON-escaped) to the target cwd. */
152
85
  function rewriteSessionCwd(raw, sourceCwd, targetCwd) {
153
- const target = escapeJsonString(targetCwd);
154
- let rewritten = raw;
155
- for (const sourceVariant of getCwdRewriteVariants(sourceCwd)) {
156
- if (sourceVariant === targetCwd)
157
- continue;
158
- rewritten = rewritten.split(escapeJsonString(sourceVariant)).join(target);
159
- }
160
- const ciWorkdirName = getCiWorkdirName(sourceCwd);
161
- if (ciWorkdirName) {
162
- const escapedName = escapeRegExp(ciWorkdirName);
163
- const windowsPathPatterns = [
164
- new RegExp(`[A-Za-z]:(?:[^"\\r\\n])*?${escapedName}`, "g"),
165
- new RegExp(`/[A-Za-z]/(?:[^"\\r\\n])*?${escapedName}`, "g"),
166
- ];
167
- for (const pattern of windowsPathPatterns) {
168
- rewritten = rewritten.replace(pattern, target);
169
- }
170
- }
171
- return rewritten;
86
+ if (sourceCwd === targetCwd)
87
+ return raw;
88
+ const escapeJson = (value) => JSON.stringify(value).slice(1, -1);
89
+ return raw.split(escapeJson(sourceCwd)).join(escapeJson(targetCwd));
172
90
  }
173
91
  async function fetchText(url) {
174
92
  const response = await fetch(url, { headers: { Accept: "application/vnd.github+json" } });
@@ -259,7 +177,6 @@ export default function (pi) {
259
177
  decoded = parsedRef.path.endsWith(".html") ? decodeExportedHtml(raw) : parseSessionJsonl(raw);
260
178
  sourceName = basename(parsedRef.path).replace(/\.html$/, ".jsonl");
261
179
  }
262
- const platformNotice = getPlatformContinuationNotice(decoded.header.cwd);
263
180
  const rewritten = rewriteSessionCwd(decoded.jsonl, decoded.header.cwd, targetCwd);
264
181
  const destination = join(sessionDir, sourceName);
265
182
  if (existsSync(destination)) {
@@ -271,18 +188,7 @@ export default function (pi) {
271
188
  }
272
189
  writeFileSync(destination, rewritten);
273
190
  ctx.ui.notify(`Imported session ${decoded.header.id} (cwd ${decoded.header.cwd} -> ${targetCwd})`, "info");
274
- await ctx.switchSession(destination, {
275
- withSession: async (nextCtx) => {
276
- if (!platformNotice)
277
- return;
278
- await nextCtx.sendMessage({
279
- customType: "import-repro",
280
- content: platformNotice,
281
- display: true,
282
- details: { sourceCwd: decoded.header.cwd, targetCwd },
283
- }, { triggerTurn: false });
284
- },
285
- });
191
+ await ctx.switchSession(destination);
286
192
  }
287
193
  catch (error) {
288
194
  ctx.ui.notify(`ir: ${error instanceof Error ? error.message : String(error)}`, "error");
@@ -1 +1 @@
1
- {"version":3,"file":"import-repro.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/import-repro.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Import a pi session shared as a gist by the issue-analysis CI workflow\n * (.github/workflows/issue-analysis.yml) and switch to it.\n *\n * The CI job runs in a high-entropy checkout directory; this command rewrites\n * the recorded cwd to the local checkout, installs the session file into the\n * current session directory, and switches to it.\n *\n * Usage:\n * /ir b4d100022aefb12f25dd2d8485e0a82a\n * /ir https://gist.github.com/mitsuhiko/b4d100022aefb12f25dd2d8485e0a82a\n * /ir https://pi.dev/session/#b4d100022aefb12f25dd2d8485e0a82a\n * /ir https://github.com/earendil-works/pi/issues/123\n *\n * pi \"/ir <gist-id>\"\n */\n\nimport { Buffer } from \"node:buffer\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { basename, isAbsolute, join, resolve } from \"node:path\";\nimport type { ExtensionAPI, ExtensionCommandContext } from \"../types.ts\";\n\nconst GIST_ID_RE = /^[0-9a-fA-F]{20,}$/;\nconst GIST_URL_RE = /^https:\\/\\/gist\\.github\\.com\\/(?:[^/]+\\/)?([0-9a-fA-F]{20,})(?:[/#?].*)?$/;\nconst SHARE_URL_RE = /^https:\\/\\/pi\\.dev\\/session\\/#([0-9a-fA-F]{20,})(?:[/#?].*)?$/;\nconst ISSUE_URL_RE = /^https:\\/\\/github\\.com\\/([^/]+)\\/([^/]+)\\/issues\\/(\\d+)(?:[/#?].*)?$/;\nconst GIST_URL_IN_TEXT_RE = /https:\\/\\/gist\\.github\\.com\\/(?:[^/\\s]+\\/)?([0-9a-fA-F]{20,})\\b/g;\nconst SESSION_DATA_RE = /<script id=\"session-data\" type=\"application\\/json\">([^<]+)<\\/script>/;\n\ninterface SessionHeader {\n\ttype: \"session\";\n\tid: string;\n\tcwd: string;\n\t[key: string]: unknown;\n}\n\ninterface ExportedSessionData {\n\theader: SessionHeader | null;\n\tentries: Array<Record<string, unknown>>;\n}\n\ninterface GistFile {\n\tfilename?: string;\n\traw_url?: string;\n\tcontent?: string;\n\ttruncated?: boolean;\n}\n\ninterface GistResponse {\n\tfiles?: Record<string, GistFile>;\n}\n\ninterface IssueComment {\n\tbody?: string | null;\n\tuser?: { login?: string } | null;\n}\n\nfunction parseRef(\n\tref: string,\n\tcwd: string,\n):\n\t| { type: \"gist\"; id: string }\n\t| { type: \"file\"; path: string }\n\t| { type: \"issue\"; owner: string; repo: string; issue: string } {\n\tif (ref.endsWith(\".html\") || ref.endsWith(\".jsonl\")) {\n\t\treturn { type: \"file\", path: isAbsolute(ref) ? ref : resolve(cwd, ref) };\n\t}\n\n\tconst shareMatch = ref.match(SHARE_URL_RE);\n\tif (shareMatch) return { type: \"gist\", id: shareMatch[1] };\n\n\tconst gistMatch = ref.match(GIST_URL_RE);\n\tif (gistMatch) return { type: \"gist\", id: gistMatch[1] };\n\n\tconst issueMatch = ref.match(ISSUE_URL_RE);\n\tif (issueMatch) return { type: \"issue\", owner: issueMatch[1], repo: issueMatch[2], issue: issueMatch[3] };\n\n\tif (GIST_ID_RE.test(ref)) return { type: \"gist\", id: ref };\n\n\tthrow new Error(`expected a gist ID, gist URL, pi.dev share URL, issue URL, .html file, or .jsonl file: ${ref}`);\n}\n\nfunction parseSessionJsonl(raw: string): { header: SessionHeader; jsonl: string } {\n\tconst newlineIndex = raw.indexOf(\"\\n\");\n\tconst firstLine = newlineIndex === -1 ? raw : raw.slice(0, newlineIndex);\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(firstLine);\n\t} catch {\n\t\tthrow new Error(\"first line of session file is not valid JSON\");\n\t}\n\tconst header = parsed as Partial<SessionHeader>;\n\tif (\n\t\theader.type !== \"session\" ||\n\t\ttypeof header.id !== \"string\" ||\n\t\ttypeof header.cwd !== \"string\" ||\n\t\theader.cwd === \"\"\n\t) {\n\t\tthrow new Error(\"session file has no valid session header with a cwd\");\n\t}\n\treturn { header: header as SessionHeader, jsonl: raw };\n}\n\nfunction decodeExportedHtml(html: string): { header: SessionHeader; jsonl: string } {\n\tconst match = html.match(SESSION_DATA_RE);\n\tif (!match) throw new Error(\"HTML does not contain embedded pi session data\");\n\n\tlet data: unknown;\n\ttry {\n\t\tdata = JSON.parse(Buffer.from(match[1], \"base64\").toString(\"utf8\"));\n\t} catch {\n\t\tthrow new Error(\"embedded pi session data is not valid JSON\");\n\t}\n\n\tconst sessionData = data as Partial<ExportedSessionData>;\n\tconst header = sessionData.header;\n\tif (header?.type !== \"session\" || typeof header.id !== \"string\" || typeof header.cwd !== \"string\") {\n\t\tthrow new Error(\"embedded pi session data has no valid session header\");\n\t}\n\tif (!Array.isArray(sessionData.entries)) {\n\t\tthrow new Error(\"embedded pi session data has no entries array\");\n\t}\n\n\tconst lines = [header, ...sessionData.entries].map((entry) => JSON.stringify(entry));\n\treturn { header, jsonl: `${lines.join(\"\\n\")}\\n` };\n}\n\ntype SessionPlatform = \"windows\" | \"unix\" | \"unknown\";\n\nfunction escapeJsonString(value: string): string {\n\treturn JSON.stringify(value).slice(1, -1);\n}\n\nfunction escapeRegExp(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction trimTrailingPathSeparators(value: string): string {\n\treturn value.replace(/[\\\\/]+$/, \"\");\n}\n\nfunction getPathTailName(value: string): string {\n\tconst trimmed = trimTrailingPathSeparators(value);\n\treturn trimmed.split(/[\\\\/]/).filter(Boolean).at(-1) ?? \"\";\n}\n\nfunction getWindowsDrivePathParts(value: string): { drive: string; rest: string } | undefined {\n\tconst trimmed = trimTrailingPathSeparators(value);\n\tconst driveMatch = trimmed.match(/^([A-Za-z]):[\\\\/](.*)$/);\n\tif (driveMatch) {\n\t\treturn { drive: driveMatch[1].toUpperCase(), rest: driveMatch[2].replace(/[\\\\/]+/g, \"/\") };\n\t}\n\n\tconst msysMatch = trimmed.match(/^\\/([A-Za-z])\\/(.*)$/);\n\tif (msysMatch) {\n\t\treturn { drive: msysMatch[1].toUpperCase(), rest: msysMatch[2].replace(/[\\\\/]+/g, \"/\") };\n\t}\n\n\treturn undefined;\n}\n\nfunction getCwdRewriteVariants(sourceCwd: string): string[] {\n\tconst trimmed = trimTrailingPathSeparators(sourceCwd);\n\tconst variants = new Set<string>();\n\tif (trimmed) variants.add(trimmed);\n\n\tconst driveParts = getWindowsDrivePathParts(trimmed);\n\tif (driveParts) {\n\t\tconst rest = driveParts.rest.replace(/^\\/+|\\/+$/g, \"\");\n\t\tconst backslashRest = rest.replace(/\\//g, \"\\\\\");\n\t\tvariants.add(`${driveParts.drive}:\\\\${backslashRest}`);\n\t\tvariants.add(`${driveParts.drive}:/${rest}`);\n\t\tvariants.add(`/${driveParts.drive.toLowerCase()}/${rest}`);\n\t\tvariants.add(`/${driveParts.drive}/${rest}`);\n\t}\n\n\treturn Array.from(variants)\n\t\t.filter(Boolean)\n\t\t.sort((a, b) => b.length - a.length);\n}\n\nfunction getCiWorkdirName(sourceCwd: string): string | undefined {\n\tconst name = getPathTailName(sourceCwd);\n\treturn /^pi-ci-[0-9a-f]{32}$/i.test(name) ? name : undefined;\n}\n\nfunction detectSessionPlatform(cwd: string): SessionPlatform {\n\tif (/^[A-Za-z]:[\\\\/]/.test(cwd) || /^\\/[A-Za-z]\\//.test(cwd)) return \"windows\";\n\tif (cwd.startsWith(\"/\")) return \"unix\";\n\treturn \"unknown\";\n}\n\nfunction getLocalPlatform(): Exclude<SessionPlatform, \"unknown\"> {\n\treturn process.platform === \"win32\" ? \"windows\" : \"unix\";\n}\n\nfunction getPlatformContinuationNotice(sourceCwd: string): string | undefined {\n\tconst sourcePlatform = detectSessionPlatform(sourceCwd);\n\tconst localPlatform = getLocalPlatform();\n\tif (sourcePlatform === \"unknown\" || sourcePlatform === localPlatform) return undefined;\n\tif (localPlatform === \"unix\") {\n\t\treturn \"This session was continued on a non-Windows machine; paths are now Unix style.\";\n\t}\n\treturn \"This session was continued on a Windows machine; paths are now Windows style.\";\n}\n\n/** Rewrite occurrences of the recorded CI cwd (JSON-escaped) to the target cwd. */\nfunction rewriteSessionCwd(raw: string, sourceCwd: string, targetCwd: string): string {\n\tconst target = escapeJsonString(targetCwd);\n\tlet rewritten = raw;\n\n\tfor (const sourceVariant of getCwdRewriteVariants(sourceCwd)) {\n\t\tif (sourceVariant === targetCwd) continue;\n\t\trewritten = rewritten.split(escapeJsonString(sourceVariant)).join(target);\n\t}\n\n\tconst ciWorkdirName = getCiWorkdirName(sourceCwd);\n\tif (ciWorkdirName) {\n\t\tconst escapedName = escapeRegExp(ciWorkdirName);\n\t\tconst windowsPathPatterns = [\n\t\t\tnew RegExp(`[A-Za-z]:(?:[^\"\\\\r\\\\n])*?${escapedName}`, \"g\"),\n\t\t\tnew RegExp(`/[A-Za-z]/(?:[^\"\\\\r\\\\n])*?${escapedName}`, \"g\"),\n\t\t];\n\t\tfor (const pattern of windowsPathPatterns) {\n\t\t\trewritten = rewritten.replace(pattern, target);\n\t\t}\n\t}\n\n\treturn rewritten;\n}\n\nasync function fetchText(url: string): Promise<string> {\n\tconst response = await fetch(url, { headers: { Accept: \"application/vnd.github+json\" } });\n\tif (!response.ok) {\n\t\tthrow new Error(`failed to fetch ${url}: HTTP ${response.status}`);\n\t}\n\treturn await response.text();\n}\n\nasync function readGistFile(file: GistFile): Promise<string> {\n\tif (file.content && !file.truncated) return file.content;\n\tif (!file.raw_url) throw new Error(`gist file ${file.filename ?? \"<unknown>\"} has no raw URL`);\n\treturn await fetchText(file.raw_url);\n}\n\nasync function findIssueGistId(owner: string, repo: string, issue: string): Promise<string> {\n\tconst gistIds: string[] = [];\n\tlet page = 1;\n\twhile (true) {\n\t\tconst response = await fetch(\n\t\t\t`https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/issues/${encodeURIComponent(issue)}/comments?per_page=100&page=${page}`,\n\t\t\t{ headers: { Accept: \"application/vnd.github+json\", \"X-GitHub-Api-Version\": \"2022-11-28\" } },\n\t\t);\n\t\tif (!response.ok) throw new Error(`failed to fetch issue comments: HTTP ${response.status}`);\n\n\t\tconst comments = (await response.json()) as IssueComment[];\n\t\tfor (const comment of comments) {\n\t\t\tif (comment.user?.login !== \"github-actions[bot]\") continue;\n\t\t\tfor (const match of (comment.body ?? \"\").matchAll(GIST_URL_IN_TEXT_RE)) {\n\t\t\t\tgistIds.push(match[1]);\n\t\t\t}\n\t\t}\n\n\t\tif (comments.length < 100) break;\n\t\tpage++;\n\t}\n\n\tconst gistId = gistIds.at(-1);\n\tif (!gistId) throw new Error(`no github-actions gist link found in comments on ${owner}/${repo}#${issue}`);\n\treturn gistId;\n}\n\nasync function fetchGistSession(gistId: string): Promise<{ header: SessionHeader; jsonl: string }> {\n\tconst response = await fetch(`https://api.github.com/gists/${gistId}`, {\n\t\theaders: {\n\t\t\tAccept: \"application/vnd.github+json\",\n\t\t\t\"X-GitHub-Api-Version\": \"2022-11-28\",\n\t\t},\n\t});\n\tif (!response.ok) throw new Error(`failed to fetch gist ${gistId}: HTTP ${response.status}`);\n\n\tconst gist = (await response.json()) as GistResponse;\n\tconst files = Object.values(gist.files ?? {});\n\tconst jsonlFile = files.find((file) => file.filename?.endsWith(\".jsonl\"));\n\tif (jsonlFile) return parseSessionJsonl(await readGistFile(jsonlFile));\n\n\tconst htmlFile = files.find((file) => file.filename?.endsWith(\".html\"));\n\tif (htmlFile) return decodeExportedHtml(await readGistFile(htmlFile));\n\n\tthrow new Error(`gist ${gistId} has no .jsonl or .html session file`);\n}\n\nexport default function (pi: ExtensionAPI) {\n\tpi.registerCommand(\"ir\", {\n\t\tdescription: \"Import a CI issue-analysis session from a gist ID, share URL, or issue URL and switch to it\",\n\t\thandler: async (args: string, ctx: ExtensionCommandContext) => {\n\t\t\tconst ref = args.trim();\n\t\t\tif (!ref) {\n\t\t\t\tctx.ui.notify(\"Usage: /ir <gist-id | gist-url | pi.dev/session URL | issue URL>\", \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst targetCwd = ctx.sessionManager.getCwd();\n\t\t\t\tconst sessionDir = ctx.sessionManager.getSessionDir();\n\t\t\t\tconst parsedRef = parseRef(ref, targetCwd);\n\n\t\t\t\tctx.ui.notify(`Importing repro session from ${ref}...`, \"info\");\n\n\t\t\t\tlet sourceName: string;\n\t\t\t\tlet decoded: { header: SessionHeader; jsonl: string };\n\t\t\t\tif (parsedRef.type === \"gist\") {\n\t\t\t\t\tdecoded = await fetchGistSession(parsedRef.id);\n\t\t\t\t\tsourceName = `${parsedRef.id}.jsonl`;\n\t\t\t\t} else if (parsedRef.type === \"issue\") {\n\t\t\t\t\tconst gistId = await findIssueGistId(parsedRef.owner, parsedRef.repo, parsedRef.issue);\n\t\t\t\t\tdecoded = await fetchGistSession(gistId);\n\t\t\t\t\tsourceName = `${gistId}.jsonl`;\n\t\t\t\t} else {\n\t\t\t\t\tif (!existsSync(parsedRef.path)) throw new Error(`session file not found: ${parsedRef.path}`);\n\t\t\t\t\tconst raw = readFileSync(parsedRef.path, \"utf8\");\n\t\t\t\t\tdecoded = parsedRef.path.endsWith(\".html\") ? decodeExportedHtml(raw) : parseSessionJsonl(raw);\n\t\t\t\t\tsourceName = basename(parsedRef.path).replace(/\\.html$/, \".jsonl\");\n\t\t\t\t}\n\n\t\t\t\tconst platformNotice = getPlatformContinuationNotice(decoded.header.cwd);\n\t\t\t\tconst rewritten = rewriteSessionCwd(decoded.jsonl, decoded.header.cwd, targetCwd);\n\t\t\t\tconst destination = join(sessionDir, sourceName);\n\t\t\t\tif (existsSync(destination)) {\n\t\t\t\t\tconst overwrite = await ctx.ui.confirm(\n\t\t\t\t\t\t\"Session already imported\",\n\t\t\t\t\t\t`Overwrite ${destination}? Local changes to that session will be lost.`,\n\t\t\t\t\t);\n\t\t\t\t\tif (!overwrite) {\n\t\t\t\t\t\tctx.ui.notify(\"Import cancelled\", \"warning\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\twriteFileSync(destination, rewritten);\n\n\t\t\t\tctx.ui.notify(`Imported session ${decoded.header.id} (cwd ${decoded.header.cwd} -> ${targetCwd})`, \"info\");\n\t\t\t\tawait ctx.switchSession(destination, {\n\t\t\t\t\twithSession: async (nextCtx) => {\n\t\t\t\t\t\tif (!platformNotice) return;\n\t\t\t\t\t\tawait nextCtx.sendMessage(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcustomType: \"import-repro\",\n\t\t\t\t\t\t\t\tcontent: platformNotice,\n\t\t\t\t\t\t\t\tdisplay: true,\n\t\t\t\t\t\t\t\tdetails: { sourceCwd: decoded.header.cwd, targetCwd },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ triggerTurn: false },\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tctx.ui.notify(`ir: ${error instanceof Error ? error.message : String(error)}`, \"error\");\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
1
+ {"version":3,"file":"import-repro.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/import-repro.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Import a pi session shared as a gist by the issue-analysis CI workflow\n * (.github/workflows/issue-analysis.yml) and switch to it.\n *\n * The CI job runs in a high-entropy checkout directory; this command rewrites\n * the recorded cwd to the local checkout, installs the session file into the\n * current session directory, and switches to it.\n *\n * Usage:\n * /ir b4d100022aefb12f25dd2d8485e0a82a\n * /ir https://gist.github.com/mitsuhiko/b4d100022aefb12f25dd2d8485e0a82a\n * /ir https://pi.dev/session/#b4d100022aefb12f25dd2d8485e0a82a\n * /ir https://github.com/earendil-works/pi/issues/123\n *\n * pi \"/ir <gist-id>\"\n */\n\nimport { Buffer } from \"node:buffer\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { basename, isAbsolute, join, resolve } from \"node:path\";\nimport type { ExtensionAPI, ExtensionCommandContext } from \"../types.ts\";\n\nconst GIST_ID_RE = /^[0-9a-fA-F]{20,}$/;\nconst GIST_URL_RE = /^https:\\/\\/gist\\.github\\.com\\/(?:[^/]+\\/)?([0-9a-fA-F]{20,})(?:[/#?].*)?$/;\nconst SHARE_URL_RE = /^https:\\/\\/pi\\.dev\\/session\\/#([0-9a-fA-F]{20,})(?:[/#?].*)?$/;\nconst ISSUE_URL_RE = /^https:\\/\\/github\\.com\\/([^/]+)\\/([^/]+)\\/issues\\/(\\d+)(?:[/#?].*)?$/;\nconst GIST_URL_IN_TEXT_RE = /https:\\/\\/gist\\.github\\.com\\/(?:[^/\\s]+\\/)?([0-9a-fA-F]{20,})\\b/g;\nconst SESSION_DATA_RE = /<script id=\"session-data\" type=\"application\\/json\">([^<]+)<\\/script>/;\n\ninterface SessionHeader {\n\ttype: \"session\";\n\tid: string;\n\tcwd: string;\n\t[key: string]: unknown;\n}\n\ninterface ExportedSessionData {\n\theader: SessionHeader | null;\n\tentries: Array<Record<string, unknown>>;\n}\n\ninterface GistFile {\n\tfilename?: string;\n\traw_url?: string;\n\tcontent?: string;\n\ttruncated?: boolean;\n}\n\ninterface GistResponse {\n\tfiles?: Record<string, GistFile>;\n}\n\ninterface IssueComment {\n\tbody?: string | null;\n\tuser?: { login?: string } | null;\n}\n\nfunction parseRef(\n\tref: string,\n\tcwd: string,\n):\n\t| { type: \"gist\"; id: string }\n\t| { type: \"file\"; path: string }\n\t| { type: \"issue\"; owner: string; repo: string; issue: string } {\n\tif (ref.endsWith(\".html\") || ref.endsWith(\".jsonl\")) {\n\t\treturn { type: \"file\", path: isAbsolute(ref) ? ref : resolve(cwd, ref) };\n\t}\n\n\tconst shareMatch = ref.match(SHARE_URL_RE);\n\tif (shareMatch) return { type: \"gist\", id: shareMatch[1] };\n\n\tconst gistMatch = ref.match(GIST_URL_RE);\n\tif (gistMatch) return { type: \"gist\", id: gistMatch[1] };\n\n\tconst issueMatch = ref.match(ISSUE_URL_RE);\n\tif (issueMatch) return { type: \"issue\", owner: issueMatch[1], repo: issueMatch[2], issue: issueMatch[3] };\n\n\tif (GIST_ID_RE.test(ref)) return { type: \"gist\", id: ref };\n\n\tthrow new Error(`expected a gist ID, gist URL, pi.dev share URL, issue URL, .html file, or .jsonl file: ${ref}`);\n}\n\nfunction parseSessionJsonl(raw: string): { header: SessionHeader; jsonl: string } {\n\tconst newlineIndex = raw.indexOf(\"\\n\");\n\tconst firstLine = newlineIndex === -1 ? raw : raw.slice(0, newlineIndex);\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(firstLine);\n\t} catch {\n\t\tthrow new Error(\"first line of session file is not valid JSON\");\n\t}\n\tconst header = parsed as Partial<SessionHeader>;\n\tif (\n\t\theader.type !== \"session\" ||\n\t\ttypeof header.id !== \"string\" ||\n\t\ttypeof header.cwd !== \"string\" ||\n\t\theader.cwd === \"\"\n\t) {\n\t\tthrow new Error(\"session file has no valid session header with a cwd\");\n\t}\n\treturn { header: header as SessionHeader, jsonl: raw };\n}\n\nfunction decodeExportedHtml(html: string): { header: SessionHeader; jsonl: string } {\n\tconst match = html.match(SESSION_DATA_RE);\n\tif (!match) throw new Error(\"HTML does not contain embedded pi session data\");\n\n\tlet data: unknown;\n\ttry {\n\t\tdata = JSON.parse(Buffer.from(match[1], \"base64\").toString(\"utf8\"));\n\t} catch {\n\t\tthrow new Error(\"embedded pi session data is not valid JSON\");\n\t}\n\n\tconst sessionData = data as Partial<ExportedSessionData>;\n\tconst header = sessionData.header;\n\tif (header?.type !== \"session\" || typeof header.id !== \"string\" || typeof header.cwd !== \"string\") {\n\t\tthrow new Error(\"embedded pi session data has no valid session header\");\n\t}\n\tif (!Array.isArray(sessionData.entries)) {\n\t\tthrow new Error(\"embedded pi session data has no entries array\");\n\t}\n\n\tconst lines = [header, ...sessionData.entries].map((entry) => JSON.stringify(entry));\n\treturn { header, jsonl: `${lines.join(\"\\n\")}\\n` };\n}\n\n/** Rewrite all occurrences of the recorded cwd (JSON-escaped) to the target cwd. */\nfunction rewriteSessionCwd(raw: string, sourceCwd: string, targetCwd: string): string {\n\tif (sourceCwd === targetCwd) return raw;\n\tconst escapeJson = (value: string) => JSON.stringify(value).slice(1, -1);\n\treturn raw.split(escapeJson(sourceCwd)).join(escapeJson(targetCwd));\n}\n\nasync function fetchText(url: string): Promise<string> {\n\tconst response = await fetch(url, { headers: { Accept: \"application/vnd.github+json\" } });\n\tif (!response.ok) {\n\t\tthrow new Error(`failed to fetch ${url}: HTTP ${response.status}`);\n\t}\n\treturn await response.text();\n}\n\nasync function readGistFile(file: GistFile): Promise<string> {\n\tif (file.content && !file.truncated) return file.content;\n\tif (!file.raw_url) throw new Error(`gist file ${file.filename ?? \"<unknown>\"} has no raw URL`);\n\treturn await fetchText(file.raw_url);\n}\n\nasync function findIssueGistId(owner: string, repo: string, issue: string): Promise<string> {\n\tconst gistIds: string[] = [];\n\tlet page = 1;\n\twhile (true) {\n\t\tconst response = await fetch(\n\t\t\t`https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/issues/${encodeURIComponent(issue)}/comments?per_page=100&page=${page}`,\n\t\t\t{ headers: { Accept: \"application/vnd.github+json\", \"X-GitHub-Api-Version\": \"2022-11-28\" } },\n\t\t);\n\t\tif (!response.ok) throw new Error(`failed to fetch issue comments: HTTP ${response.status}`);\n\n\t\tconst comments = (await response.json()) as IssueComment[];\n\t\tfor (const comment of comments) {\n\t\t\tif (comment.user?.login !== \"github-actions[bot]\") continue;\n\t\t\tfor (const match of (comment.body ?? \"\").matchAll(GIST_URL_IN_TEXT_RE)) {\n\t\t\t\tgistIds.push(match[1]);\n\t\t\t}\n\t\t}\n\n\t\tif (comments.length < 100) break;\n\t\tpage++;\n\t}\n\n\tconst gistId = gistIds.at(-1);\n\tif (!gistId) throw new Error(`no github-actions gist link found in comments on ${owner}/${repo}#${issue}`);\n\treturn gistId;\n}\n\nasync function fetchGistSession(gistId: string): Promise<{ header: SessionHeader; jsonl: string }> {\n\tconst response = await fetch(`https://api.github.com/gists/${gistId}`, {\n\t\theaders: {\n\t\t\tAccept: \"application/vnd.github+json\",\n\t\t\t\"X-GitHub-Api-Version\": \"2022-11-28\",\n\t\t},\n\t});\n\tif (!response.ok) throw new Error(`failed to fetch gist ${gistId}: HTTP ${response.status}`);\n\n\tconst gist = (await response.json()) as GistResponse;\n\tconst files = Object.values(gist.files ?? {});\n\tconst jsonlFile = files.find((file) => file.filename?.endsWith(\".jsonl\"));\n\tif (jsonlFile) return parseSessionJsonl(await readGistFile(jsonlFile));\n\n\tconst htmlFile = files.find((file) => file.filename?.endsWith(\".html\"));\n\tif (htmlFile) return decodeExportedHtml(await readGistFile(htmlFile));\n\n\tthrow new Error(`gist ${gistId} has no .jsonl or .html session file`);\n}\n\nexport default function (pi: ExtensionAPI) {\n\tpi.registerCommand(\"ir\", {\n\t\tdescription: \"Import a CI issue-analysis session from a gist ID, share URL, or issue URL and switch to it\",\n\t\thandler: async (args: string, ctx: ExtensionCommandContext) => {\n\t\t\tconst ref = args.trim();\n\t\t\tif (!ref) {\n\t\t\t\tctx.ui.notify(\"Usage: /ir <gist-id | gist-url | pi.dev/session URL | issue URL>\", \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst targetCwd = ctx.sessionManager.getCwd();\n\t\t\t\tconst sessionDir = ctx.sessionManager.getSessionDir();\n\t\t\t\tconst parsedRef = parseRef(ref, targetCwd);\n\n\t\t\t\tctx.ui.notify(`Importing repro session from ${ref}...`, \"info\");\n\n\t\t\t\tlet sourceName: string;\n\t\t\t\tlet decoded: { header: SessionHeader; jsonl: string };\n\t\t\t\tif (parsedRef.type === \"gist\") {\n\t\t\t\t\tdecoded = await fetchGistSession(parsedRef.id);\n\t\t\t\t\tsourceName = `${parsedRef.id}.jsonl`;\n\t\t\t\t} else if (parsedRef.type === \"issue\") {\n\t\t\t\t\tconst gistId = await findIssueGistId(parsedRef.owner, parsedRef.repo, parsedRef.issue);\n\t\t\t\t\tdecoded = await fetchGistSession(gistId);\n\t\t\t\t\tsourceName = `${gistId}.jsonl`;\n\t\t\t\t} else {\n\t\t\t\t\tif (!existsSync(parsedRef.path)) throw new Error(`session file not found: ${parsedRef.path}`);\n\t\t\t\t\tconst raw = readFileSync(parsedRef.path, \"utf8\");\n\t\t\t\t\tdecoded = parsedRef.path.endsWith(\".html\") ? decodeExportedHtml(raw) : parseSessionJsonl(raw);\n\t\t\t\t\tsourceName = basename(parsedRef.path).replace(/\\.html$/, \".jsonl\");\n\t\t\t\t}\n\n\t\t\t\tconst rewritten = rewriteSessionCwd(decoded.jsonl, decoded.header.cwd, targetCwd);\n\t\t\t\tconst destination = join(sessionDir, sourceName);\n\t\t\t\tif (existsSync(destination)) {\n\t\t\t\t\tconst overwrite = await ctx.ui.confirm(\n\t\t\t\t\t\t\"Session already imported\",\n\t\t\t\t\t\t`Overwrite ${destination}? Local changes to that session will be lost.`,\n\t\t\t\t\t);\n\t\t\t\t\tif (!overwrite) {\n\t\t\t\t\t\tctx.ui.notify(\"Import cancelled\", \"warning\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\twriteFileSync(destination, rewritten);\n\n\t\t\t\tctx.ui.notify(`Imported session ${decoded.header.id} (cwd ${decoded.header.cwd} -> ${targetCwd})`, \"info\");\n\t\t\t\tawait ctx.switchSession(destination);\n\t\t\t} catch (error) {\n\t\t\t\tctx.ui.notify(`ir: ${error instanceof Error ? error.message : String(error)}`, \"error\");\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
@@ -8,7 +8,6 @@ export declare class ServerConnection {
8
8
  get state(): ServerConnectionState;
9
9
  get lastError(): Error | undefined;
10
10
  get generation(): number;
11
- refreshCapturedDiagnostics(): void;
12
11
  get client(): Client;
13
12
  getRootPid(): number | null;
14
13
  connect(): Promise<Client>;
@@ -1 +1 @@
1
- {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/connection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGxE,OAAO,KAAK,EACX,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACrB,iCAAiC,EACjC,iCAAiC,EACjC,MAAM,uBAAuB,CAAC;AAe/B,YAAY,EACX,uBAAuB,EACvB,qBAAqB,EACrB,iCAAiC,EACjC,iCAAiC,GACjC,MAAM,uBAAuB,CAAC;AAE/B,qBAAa,gBAAgB;;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAe5B,YAAY,OAAO,EAAE,uBAAuB,EAO3C;IAED,IAAI,KAAK,IAAI,qBAAqB,CAEjC;IACD,IAAI,SAAS,IAAI,KAAK,GAAG,SAAS,CAEjC;IACD,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,0BAA0B,IAAI,IAAI,CAajC;IAED,IAAI,MAAM,IAAI,MAAM,CAQnB;IAED,UAAU,IAAI,MAAM,GAAG,IAAI,CAE1B;IACD,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAgBzB;IAEK,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAS7B;IAED,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAM9B;IAED,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAMvB;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAK7B;IAED,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAE/B;IACD,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAEjC;IACD,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAEjC;IACD,2BAA2B,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAE/C;IAED,gBAAgB,IAAI,IAAI,CAMvB;IAED,aAAa,CAAC,QAAQ,EAAE,wBAAwB,CAAC,iCAAiC,CAAC,GAAG,MAAM,IAAI,CAG/F;IAED,cAAc,CAAC,QAAQ,EAAE,wBAAwB,CAAC,iCAAiC,CAAC,GAAG,MAAM,IAAI,CAGhG;CA6ID"}
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/connection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGxE,OAAO,KAAK,EACX,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACrB,iCAAiC,EACjC,iCAAiC,EACjC,MAAM,uBAAuB,CAAC;AAe/B,YAAY,EACX,uBAAuB,EACvB,qBAAqB,EACrB,iCAAiC,EACjC,iCAAiC,GACjC,MAAM,uBAAuB,CAAC;AAE/B,qBAAa,gBAAgB;;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAe5B,YAAY,OAAO,EAAE,uBAAuB,EAO3C;IAED,IAAI,KAAK,IAAI,qBAAqB,CAEjC;IACD,IAAI,SAAS,IAAI,KAAK,GAAG,SAAS,CAEjC;IACD,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,MAAM,IAAI,MAAM,CAQnB;IAED,UAAU,IAAI,MAAM,GAAG,IAAI,CAE1B;IACD,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAgBzB;IAEK,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAS7B;IAED,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAM9B;IAED,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAMvB;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAK7B;IAED,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAE/B;IACD,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAEjC;IACD,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAEjC;IACD,2BAA2B,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAE/C;IAED,gBAAgB,IAAI,IAAI,CAMvB;IAED,aAAa,CAAC,QAAQ,EAAE,wBAAwB,CAAC,iCAAiC,CAAC,GAAG,MAAM,IAAI,CAG/F;IAED,cAAc,CAAC,QAAQ,EAAE,wBAAwB,CAAC,iCAAiC,CAAC,GAAG,MAAM,IAAI,CAGhG;CA6ID"}
@@ -38,21 +38,6 @@ export class ServerConnection {
38
38
  get generation() {
39
39
  return this.#generation;
40
40
  }
41
- refreshCapturedDiagnostics() {
42
- const current = this.#lastError;
43
- if (current === undefined)
44
- return;
45
- const capturedError = diagnoseCapturedMcpConnectFailure({
46
- config: this.#config,
47
- cause: current,
48
- env: this.#env,
49
- logger: this.#logger,
50
- serverName: this.serverName,
51
- });
52
- if (capturedError !== null && capturedError.message !== current.message) {
53
- this.#lastError = capturedError;
54
- }
55
- }
56
41
  get client() {
57
42
  if (this.#connection === undefined) {
58
43
  throw new ConnectError(`MCP server ${this.serverName} is not connected`, {
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/connection.ts"],"names":[],"mappings":"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","sourcesContent":["import { UnauthorizedError } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { OAuthFlowError } from \"./auth/oauth-errors.ts\";\nimport type { McpOAuthProvider } from \"./auth/oauth-provider.ts\";\nimport type {\n\tServerConnectionListener,\n\tServerConnectionOptions,\n\tServerConnectionState,\n\tServerConnectionStateChangedEvent,\n\tServerConnectionToolsChangedEvent,\n} from \"./connection-types.ts\";\nimport { diagnoseCapturedMcpConnectFailure, diagnoseMcpConnectFailure } from \"./diagnose.ts\";\nimport { ConnectError } from \"./errors.ts\";\nimport type { McpLogger } from \"./log.ts\";\nimport { subscribeMcpServerLogging } from \"./logging.ts\";\nimport { subscribeMcpListChanged } from \"./notifications.ts\";\nimport { subscribeMcpResourceUpdated } from \"./resources.ts\";\nimport {\n\tconnectMcpTransport,\n\tcreateMcpTransport,\n\ttype McpTransportConnection,\n\tshutdownMcpTransport,\n} from \"./transport.ts\";\nimport { type McpAsyncErrorSink, wrapAsync } from \"./wrap.ts\";\n\nexport type {\n\tServerConnectionOptions,\n\tServerConnectionState,\n\tServerConnectionStateChangedEvent,\n\tServerConnectionToolsChangedEvent,\n} from \"./connection-types.ts\";\n\nexport class ServerConnection {\n\treadonly serverName: string;\n\treadonly #logger: McpLogger;\n\treadonly #env: Record<string, string | undefined> | undefined;\n\treadonly #config: ServerConnectionOptions[\"config\"];\n\treadonly #authProvider: McpOAuthProvider | undefined;\n\t#state: ServerConnectionState;\n\t#generation = 0;\n\t#connection: McpTransportConnection | undefined;\n\t#pendingConnection: McpTransportConnection | undefined;\n\t#pendingConnect: Promise<Client> | undefined;\n\t#lastError: Error | undefined;\n\treadonly #stateListeners = new Set<ServerConnectionListener<ServerConnectionStateChangedEvent>>();\n\treadonly #toolsListeners = new Set<ServerConnectionListener<ServerConnectionToolsChangedEvent>>();\n\treadonly #shutdownConnections = new Map<McpTransportConnection, Promise<void>>();\n\n\tconstructor(options: ServerConnectionOptions) {\n\t\tthis.serverName = options.serverName;\n\t\tthis.#config = options.config;\n\t\tthis.#logger = options.logger;\n\t\tthis.#env = options.env;\n\t\tthis.#authProvider = options.authProvider;\n\t\tthis.#state = options.config.enabled ? \"idle\" : \"disabled\";\n\t}\n\n\tget state(): ServerConnectionState {\n\t\treturn this.#state;\n\t}\n\tget lastError(): Error | undefined {\n\t\treturn this.#lastError;\n\t}\n\tget generation(): number {\n\t\treturn this.#generation;\n\t}\n\n\trefreshCapturedDiagnostics(): void {\n\t\tconst current = this.#lastError;\n\t\tif (current === undefined) return;\n\t\tconst capturedError = diagnoseCapturedMcpConnectFailure({\n\t\t\tconfig: this.#config,\n\t\t\tcause: current,\n\t\t\tenv: this.#env,\n\t\t\tlogger: this.#logger,\n\t\t\tserverName: this.serverName,\n\t\t});\n\t\tif (capturedError !== null && capturedError.message !== current.message) {\n\t\t\tthis.#lastError = capturedError;\n\t\t}\n\t}\n\n\tget client(): Client {\n\t\tif (this.#connection === undefined) {\n\t\t\tthrow new ConnectError(`MCP server ${this.serverName} is not connected`, {\n\t\t\t\tphase: \"client\",\n\t\t\t\tserverName: this.serverName,\n\t\t\t});\n\t\t}\n\t\treturn this.#connection.client;\n\t}\n\n\tgetRootPid(): number | null {\n\t\treturn this.#connection?.getRootPid() ?? null;\n\t}\n\tconnect(): Promise<Client> {\n\t\tif (this.#state === \"disabled\") {\n\t\t\treturn Promise.reject(this.#connectError(`MCP server ${this.serverName} is disabled`, \"connect\"));\n\t\t}\n\t\tif (this.#state === \"connected\") return Promise.resolve(this.client);\n\t\tif (this.#pendingConnect) return this.#pendingConnect;\n\n\t\tconst generation = this.#generation;\n\t\tconst connection = this.#createTransportConnection(generation);\n\t\tthis.#pendingConnection = connection;\n\t\tthis.#setState(\"connecting\");\n\t\tthis.#pendingConnect = this.#connectTransport(connection, generation).finally(() => {\n\t\t\tif (this.#pendingConnect !== undefined && generation === this.#generation) this.#pendingConnect = undefined;\n\t\t\tif (this.#pendingConnection === connection) this.#pendingConnection = undefined;\n\t\t});\n\t\treturn this.#pendingConnect;\n\t}\n\n\tasync renew(): Promise<Client> {\n\t\tif (this.#state === \"disabled\") {\n\t\t\tthrow this.#connectError(`MCP server ${this.serverName} is disabled`, \"renew\");\n\t\t}\n\t\tthis.#generation++;\n\t\tthis.#pendingConnect = undefined;\n\t\tthis.#setState(\"idle\");\n\t\tawait this.#disposeOwnedConnections();\n\t\treturn this.connect();\n\t}\n\n\tbumpGeneration(): Promise<void> {\n\t\tthis.#generation++;\n\t\tthis.#pendingConnect = undefined;\n\t\tthis.#lastError = undefined;\n\t\tif (this.#state !== \"disabled\") this.#setState(\"idle\");\n\t\treturn this.#disposeOwnedConnections();\n\t}\n\n\tdisable(): Promise<void> {\n\t\tthis.#generation++;\n\t\tthis.#pendingConnect = undefined;\n\t\tthis.#lastError = undefined;\n\t\tthis.#setState(\"disabled\");\n\t\treturn this.#disposeOwnedConnections();\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tthis.#generation++;\n\t\tthis.#pendingConnect = undefined;\n\t\tthis.#setState(\"disabled\");\n\t\tawait this.#disposeOwnedConnections();\n\t}\n\n\tmarkDegraded(error: Error): void {\n\t\tthis.#markFailure(\"degraded\", error);\n\t}\n\tmarkSuspended(error?: Error): void {\n\t\tthis.#markFailure(\"suspended\", error);\n\t}\n\tmarkNeedsAuth(error?: Error): void {\n\t\tthis.#markFailure(\"needs_auth\", error);\n\t}\n\tmarkNeedsClientRegistration(error?: Error): void {\n\t\tthis.#markFailure(\"needs_client_registration\", error);\n\t}\n\n\tmarkToolsChanged(): void {\n\t\tthis.#emit(this.#toolsListeners, {\n\t\t\ttype: \"tools_changed\",\n\t\t\tserverName: this.serverName,\n\t\t\tgeneration: this.#generation,\n\t\t});\n\t}\n\n\tonStateChange(listener: ServerConnectionListener<ServerConnectionStateChangedEvent>): () => void {\n\t\tthis.#stateListeners.add(listener);\n\t\treturn () => this.#stateListeners.delete(listener);\n\t}\n\n\tonToolsChanged(listener: ServerConnectionListener<ServerConnectionToolsChangedEvent>): () => void {\n\t\tthis.#toolsListeners.add(listener);\n\t\treturn () => this.#toolsListeners.delete(listener);\n\t}\n\n\t#createTransportConnection(generation: number): McpTransportConnection {\n\t\tconst connection = createMcpTransport({\n\t\t\tauthProvider: this.#authProvider,\n\t\t\tconfig: this.#config,\n\t\t\tenv: this.#env,\n\t\t\tlogger: this.#logger,\n\t\t\tserverName: this.serverName,\n\t\t});\n\t\tconnection.transport.onclose = wrapAsync(\n\t\t\t\"connection.transport.onclose\",\n\t\t\t() => {\n\t\t\t\tif (this.#shutdownConnections.has(connection)) return;\n\t\t\t\tif (connection === this.#pendingConnection && this.#state === \"connecting\") {\n\t\t\t\t\tconst closeError = this.#connectError(`MCP server ${this.serverName} transport closed`, \"close\", true);\n\t\t\t\t\tconst capturedError = diagnoseCapturedMcpConnectFailure({\n\t\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\t\tcause: closeError,\n\t\t\t\t\t\tenv: this.#env,\n\t\t\t\t\t\tlogger: this.#logger,\n\t\t\t\t\t\tserverName: this.serverName,\n\t\t\t\t\t});\n\t\t\t\t\tif (capturedError !== null) this.markDegraded(capturedError);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (connection !== this.#connection && connection !== this.#pendingConnection) return;\n\t\t\t\tif (generation === this.#generation && this.#state !== \"disabled\") {\n\t\t\t\t\tthis.markDegraded(this.#connectError(`MCP server ${this.serverName} transport closed`, \"close\", true));\n\t\t\t\t}\n\t\t\t},\n\t\t\tthis.#sink,\n\t\t);\n\t\treturn connection;\n\t}\n\n\tasync #connectTransport(connection: McpTransportConnection, generation: number): Promise<Client> {\n\t\ttry {\n\t\t\tawait connectMcpTransport(connection);\n\t\t} catch (error) {\n\t\t\tif (this.#pendingConnection === connection) this.#pendingConnection = undefined;\n\t\t\tawait this.#shutdown(connection);\n\t\t\tif (generation !== this.#generation || this.#state === \"disabled\") {\n\t\t\t\tthrow this.#connectError(`MCP server ${this.serverName} connect was superseded`, \"connect\", true);\n\t\t\t}\n\t\t\tif (isNeedsAuthError(error)) {\n\t\t\t\tconst authError = error instanceof Error ? error : new Error(String(error));\n\t\t\t\tthis.markNeedsAuth(authError);\n\t\t\t\tthrow authError;\n\t\t\t}\n\t\t\tconst connectError = await diagnoseMcpConnectFailure({\n\t\t\t\tconfig: this.#config,\n\t\t\t\tcause: error instanceof Error ? error : new Error(String(error)),\n\t\t\t\tenv: this.#env,\n\t\t\t\tlogger: this.#logger,\n\t\t\t\tserverName: this.serverName,\n\t\t\t});\n\t\t\tthis.markDegraded(connectError);\n\t\t\tthrow connectError;\n\t\t}\n\t\tif (generation !== this.#generation || this.#state === \"disabled\") {\n\t\t\tawait this.#shutdown(connection);\n\t\t\tthrow this.#connectError(`MCP server ${this.serverName} connect was superseded`, \"connect\", true);\n\t\t}\n\t\tif (this.#pendingConnection === connection) this.#pendingConnection = undefined;\n\t\tthis.#connection = connection;\n\t\tthis.#lastError = undefined;\n\t\t// Subscribe to list_changed on the fresh client (even if the server never\n\t\t// declared the capability) so dynamic catalog updates reach the service.\n\t\tsubscribeMcpListChanged(connection.client, () => this.markToolsChanged());\n\t\t// Resource updates ride the same refresh path: the service re-collects the\n\t\t// catalog (tools AND resources) on tools-changed.\n\t\tsubscribeMcpResourceUpdated(connection.client, () => this.markToolsChanged());\n\t\t// Server logging notifications (todo 42): RFC-5424 → the per-server\n\t\t// logger, filtered by config.logLevel, burst-capped.\n\t\tsubscribeMcpServerLogging(connection.client, { logLevel: this.#config.logLevel, logger: this.#logger });\n\t\tthis.#setState(\"connected\");\n\t\tthis.markToolsChanged();\n\t\treturn connection.client;\n\t}\n\n\tasync #disposeOwnedConnections(): Promise<void> {\n\t\tconst connections = new Set<McpTransportConnection>();\n\t\tconst connection = this.#connection;\n\t\tthis.#connection = undefined;\n\t\tif (connection !== undefined) connections.add(connection);\n\t\tconst pendingConnection = this.#pendingConnection;\n\t\tthis.#pendingConnection = undefined;\n\t\tif (pendingConnection !== undefined) connections.add(pendingConnection);\n\t\tawait Promise.all([...connections].map((item) => this.#shutdown(item)));\n\t}\n\n\tasync #shutdown(connection: McpTransportConnection): Promise<void> {\n\t\tconst pending = this.#shutdownConnections.get(connection);\n\t\tif (pending !== undefined) {\n\t\t\tawait pending;\n\t\t\treturn;\n\t\t}\n\t\tconst shutdown = (async () => {\n\t\t\tawait shutdownMcpTransport(connection);\n\t\t})();\n\t\tthis.#shutdownConnections.set(connection, shutdown);\n\t\ttry {\n\t\t\tawait shutdown;\n\t\t} finally {\n\t\t\tthis.#shutdownConnections.delete(connection);\n\t\t}\n\t}\n\n\t#setState(state: ServerConnectionState, error?: Error): void {\n\t\tif (this.#state === state) return;\n\t\tconst previousState = this.#state;\n\t\tthis.#state = state;\n\t\tthis.#emit(this.#stateListeners, {\n\t\t\ttype: \"state_changed\",\n\t\t\tserverName: this.serverName,\n\t\t\tpreviousState,\n\t\t\tstate,\n\t\t\tgeneration: this.#generation,\n\t\t\terror,\n\t\t});\n\t}\n\n\t#emit<TEvent>(listeners: Set<ServerConnectionListener<TEvent>>, event: TEvent): void {\n\t\tfor (const listener of listeners) {\n\t\t\tvoid wrapAsync(\"connection.event\", listener, this.#sink)(event);\n\t\t}\n\t}\n\n\t#markFailure(state: ServerConnectionState, error: Error | undefined): void {\n\t\tthis.#lastError = error;\n\t\tthis.#setState(state, error);\n\t}\n\n\t#connectError(message: string, phase: string, retriable?: true, cause?: unknown): ConnectError {\n\t\treturn new ConnectError(message, { cause, phase, retriable, serverName: this.serverName });\n\t}\n\n\tget #sink(): McpAsyncErrorSink {\n\t\treturn { logger: this.#logger };\n\t}\n}\n\nfunction isNeedsAuthError(error: unknown, depth = 0): boolean {\n\tif (error instanceof UnauthorizedError) return true;\n\tif (error instanceof OAuthFlowError) return error.terminal;\n\t// connectMcpTransport wraps the SDK error in a ConnectError; unwrap the cause.\n\tif (depth < 5 && error !== null && typeof error === \"object\" && \"cause\" in error) {\n\t\treturn isNeedsAuthError((error as { cause?: unknown }).cause, depth + 1);\n\t}\n\treturn false;\n}\n"]}
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/connection.ts"],"names":[],"mappings":"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","sourcesContent":["import { UnauthorizedError } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { OAuthFlowError } from \"./auth/oauth-errors.ts\";\nimport type { McpOAuthProvider } from \"./auth/oauth-provider.ts\";\nimport type {\n\tServerConnectionListener,\n\tServerConnectionOptions,\n\tServerConnectionState,\n\tServerConnectionStateChangedEvent,\n\tServerConnectionToolsChangedEvent,\n} from \"./connection-types.ts\";\nimport { diagnoseCapturedMcpConnectFailure, diagnoseMcpConnectFailure } from \"./diagnose.ts\";\nimport { ConnectError } from \"./errors.ts\";\nimport type { McpLogger } from \"./log.ts\";\nimport { subscribeMcpServerLogging } from \"./logging.ts\";\nimport { subscribeMcpListChanged } from \"./notifications.ts\";\nimport { subscribeMcpResourceUpdated } from \"./resources.ts\";\nimport {\n\tconnectMcpTransport,\n\tcreateMcpTransport,\n\ttype McpTransportConnection,\n\tshutdownMcpTransport,\n} from \"./transport.ts\";\nimport { type McpAsyncErrorSink, wrapAsync } from \"./wrap.ts\";\n\nexport type {\n\tServerConnectionOptions,\n\tServerConnectionState,\n\tServerConnectionStateChangedEvent,\n\tServerConnectionToolsChangedEvent,\n} from \"./connection-types.ts\";\n\nexport class ServerConnection {\n\treadonly serverName: string;\n\treadonly #logger: McpLogger;\n\treadonly #env: Record<string, string | undefined> | undefined;\n\treadonly #config: ServerConnectionOptions[\"config\"];\n\treadonly #authProvider: McpOAuthProvider | undefined;\n\t#state: ServerConnectionState;\n\t#generation = 0;\n\t#connection: McpTransportConnection | undefined;\n\t#pendingConnection: McpTransportConnection | undefined;\n\t#pendingConnect: Promise<Client> | undefined;\n\t#lastError: Error | undefined;\n\treadonly #stateListeners = new Set<ServerConnectionListener<ServerConnectionStateChangedEvent>>();\n\treadonly #toolsListeners = new Set<ServerConnectionListener<ServerConnectionToolsChangedEvent>>();\n\treadonly #shutdownConnections = new Map<McpTransportConnection, Promise<void>>();\n\n\tconstructor(options: ServerConnectionOptions) {\n\t\tthis.serverName = options.serverName;\n\t\tthis.#config = options.config;\n\t\tthis.#logger = options.logger;\n\t\tthis.#env = options.env;\n\t\tthis.#authProvider = options.authProvider;\n\t\tthis.#state = options.config.enabled ? \"idle\" : \"disabled\";\n\t}\n\n\tget state(): ServerConnectionState {\n\t\treturn this.#state;\n\t}\n\tget lastError(): Error | undefined {\n\t\treturn this.#lastError;\n\t}\n\tget generation(): number {\n\t\treturn this.#generation;\n\t}\n\n\tget client(): Client {\n\t\tif (this.#connection === undefined) {\n\t\t\tthrow new ConnectError(`MCP server ${this.serverName} is not connected`, {\n\t\t\t\tphase: \"client\",\n\t\t\t\tserverName: this.serverName,\n\t\t\t});\n\t\t}\n\t\treturn this.#connection.client;\n\t}\n\n\tgetRootPid(): number | null {\n\t\treturn this.#connection?.getRootPid() ?? null;\n\t}\n\tconnect(): Promise<Client> {\n\t\tif (this.#state === \"disabled\") {\n\t\t\treturn Promise.reject(this.#connectError(`MCP server ${this.serverName} is disabled`, \"connect\"));\n\t\t}\n\t\tif (this.#state === \"connected\") return Promise.resolve(this.client);\n\t\tif (this.#pendingConnect) return this.#pendingConnect;\n\n\t\tconst generation = this.#generation;\n\t\tconst connection = this.#createTransportConnection(generation);\n\t\tthis.#pendingConnection = connection;\n\t\tthis.#setState(\"connecting\");\n\t\tthis.#pendingConnect = this.#connectTransport(connection, generation).finally(() => {\n\t\t\tif (this.#pendingConnect !== undefined && generation === this.#generation) this.#pendingConnect = undefined;\n\t\t\tif (this.#pendingConnection === connection) this.#pendingConnection = undefined;\n\t\t});\n\t\treturn this.#pendingConnect;\n\t}\n\n\tasync renew(): Promise<Client> {\n\t\tif (this.#state === \"disabled\") {\n\t\t\tthrow this.#connectError(`MCP server ${this.serverName} is disabled`, \"renew\");\n\t\t}\n\t\tthis.#generation++;\n\t\tthis.#pendingConnect = undefined;\n\t\tthis.#setState(\"idle\");\n\t\tawait this.#disposeOwnedConnections();\n\t\treturn this.connect();\n\t}\n\n\tbumpGeneration(): Promise<void> {\n\t\tthis.#generation++;\n\t\tthis.#pendingConnect = undefined;\n\t\tthis.#lastError = undefined;\n\t\tif (this.#state !== \"disabled\") this.#setState(\"idle\");\n\t\treturn this.#disposeOwnedConnections();\n\t}\n\n\tdisable(): Promise<void> {\n\t\tthis.#generation++;\n\t\tthis.#pendingConnect = undefined;\n\t\tthis.#lastError = undefined;\n\t\tthis.#setState(\"disabled\");\n\t\treturn this.#disposeOwnedConnections();\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tthis.#generation++;\n\t\tthis.#pendingConnect = undefined;\n\t\tthis.#setState(\"disabled\");\n\t\tawait this.#disposeOwnedConnections();\n\t}\n\n\tmarkDegraded(error: Error): void {\n\t\tthis.#markFailure(\"degraded\", error);\n\t}\n\tmarkSuspended(error?: Error): void {\n\t\tthis.#markFailure(\"suspended\", error);\n\t}\n\tmarkNeedsAuth(error?: Error): void {\n\t\tthis.#markFailure(\"needs_auth\", error);\n\t}\n\tmarkNeedsClientRegistration(error?: Error): void {\n\t\tthis.#markFailure(\"needs_client_registration\", error);\n\t}\n\n\tmarkToolsChanged(): void {\n\t\tthis.#emit(this.#toolsListeners, {\n\t\t\ttype: \"tools_changed\",\n\t\t\tserverName: this.serverName,\n\t\t\tgeneration: this.#generation,\n\t\t});\n\t}\n\n\tonStateChange(listener: ServerConnectionListener<ServerConnectionStateChangedEvent>): () => void {\n\t\tthis.#stateListeners.add(listener);\n\t\treturn () => this.#stateListeners.delete(listener);\n\t}\n\n\tonToolsChanged(listener: ServerConnectionListener<ServerConnectionToolsChangedEvent>): () => void {\n\t\tthis.#toolsListeners.add(listener);\n\t\treturn () => this.#toolsListeners.delete(listener);\n\t}\n\n\t#createTransportConnection(generation: number): McpTransportConnection {\n\t\tconst connection = createMcpTransport({\n\t\t\tauthProvider: this.#authProvider,\n\t\t\tconfig: this.#config,\n\t\t\tenv: this.#env,\n\t\t\tlogger: this.#logger,\n\t\t\tserverName: this.serverName,\n\t\t});\n\t\tconnection.transport.onclose = wrapAsync(\n\t\t\t\"connection.transport.onclose\",\n\t\t\t() => {\n\t\t\t\tif (this.#shutdownConnections.has(connection)) return;\n\t\t\t\tif (connection === this.#pendingConnection && this.#state === \"connecting\") {\n\t\t\t\t\tconst closeError = this.#connectError(`MCP server ${this.serverName} transport closed`, \"close\", true);\n\t\t\t\t\tconst capturedError = diagnoseCapturedMcpConnectFailure({\n\t\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\t\tcause: closeError,\n\t\t\t\t\t\tenv: this.#env,\n\t\t\t\t\t\tlogger: this.#logger,\n\t\t\t\t\t\tserverName: this.serverName,\n\t\t\t\t\t});\n\t\t\t\t\tif (capturedError !== null) this.markDegraded(capturedError);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (connection !== this.#connection && connection !== this.#pendingConnection) return;\n\t\t\t\tif (generation === this.#generation && this.#state !== \"disabled\") {\n\t\t\t\t\tthis.markDegraded(this.#connectError(`MCP server ${this.serverName} transport closed`, \"close\", true));\n\t\t\t\t}\n\t\t\t},\n\t\t\tthis.#sink,\n\t\t);\n\t\treturn connection;\n\t}\n\n\tasync #connectTransport(connection: McpTransportConnection, generation: number): Promise<Client> {\n\t\ttry {\n\t\t\tawait connectMcpTransport(connection);\n\t\t} catch (error) {\n\t\t\tif (this.#pendingConnection === connection) this.#pendingConnection = undefined;\n\t\t\tawait this.#shutdown(connection);\n\t\t\tif (generation !== this.#generation || this.#state === \"disabled\") {\n\t\t\t\tthrow this.#connectError(`MCP server ${this.serverName} connect was superseded`, \"connect\", true);\n\t\t\t}\n\t\t\tif (isNeedsAuthError(error)) {\n\t\t\t\tconst authError = error instanceof Error ? error : new Error(String(error));\n\t\t\t\tthis.markNeedsAuth(authError);\n\t\t\t\tthrow authError;\n\t\t\t}\n\t\t\tconst connectError = await diagnoseMcpConnectFailure({\n\t\t\t\tconfig: this.#config,\n\t\t\t\tcause: error instanceof Error ? error : new Error(String(error)),\n\t\t\t\tenv: this.#env,\n\t\t\t\tlogger: this.#logger,\n\t\t\t\tserverName: this.serverName,\n\t\t\t});\n\t\t\tthis.markDegraded(connectError);\n\t\t\tthrow connectError;\n\t\t}\n\t\tif (generation !== this.#generation || this.#state === \"disabled\") {\n\t\t\tawait this.#shutdown(connection);\n\t\t\tthrow this.#connectError(`MCP server ${this.serverName} connect was superseded`, \"connect\", true);\n\t\t}\n\t\tif (this.#pendingConnection === connection) this.#pendingConnection = undefined;\n\t\tthis.#connection = connection;\n\t\tthis.#lastError = undefined;\n\t\t// Subscribe to list_changed on the fresh client (even if the server never\n\t\t// declared the capability) so dynamic catalog updates reach the service.\n\t\tsubscribeMcpListChanged(connection.client, () => this.markToolsChanged());\n\t\t// Resource updates ride the same refresh path: the service re-collects the\n\t\t// catalog (tools AND resources) on tools-changed.\n\t\tsubscribeMcpResourceUpdated(connection.client, () => this.markToolsChanged());\n\t\t// Server logging notifications (todo 42): RFC-5424 → the per-server\n\t\t// logger, filtered by config.logLevel, burst-capped.\n\t\tsubscribeMcpServerLogging(connection.client, { logLevel: this.#config.logLevel, logger: this.#logger });\n\t\tthis.#setState(\"connected\");\n\t\tthis.markToolsChanged();\n\t\treturn connection.client;\n\t}\n\n\tasync #disposeOwnedConnections(): Promise<void> {\n\t\tconst connections = new Set<McpTransportConnection>();\n\t\tconst connection = this.#connection;\n\t\tthis.#connection = undefined;\n\t\tif (connection !== undefined) connections.add(connection);\n\t\tconst pendingConnection = this.#pendingConnection;\n\t\tthis.#pendingConnection = undefined;\n\t\tif (pendingConnection !== undefined) connections.add(pendingConnection);\n\t\tawait Promise.all([...connections].map((item) => this.#shutdown(item)));\n\t}\n\n\tasync #shutdown(connection: McpTransportConnection): Promise<void> {\n\t\tconst pending = this.#shutdownConnections.get(connection);\n\t\tif (pending !== undefined) {\n\t\t\tawait pending;\n\t\t\treturn;\n\t\t}\n\t\tconst shutdown = (async () => {\n\t\t\tawait shutdownMcpTransport(connection);\n\t\t})();\n\t\tthis.#shutdownConnections.set(connection, shutdown);\n\t\ttry {\n\t\t\tawait shutdown;\n\t\t} finally {\n\t\t\tthis.#shutdownConnections.delete(connection);\n\t\t}\n\t}\n\n\t#setState(state: ServerConnectionState, error?: Error): void {\n\t\tif (this.#state === state) return;\n\t\tconst previousState = this.#state;\n\t\tthis.#state = state;\n\t\tthis.#emit(this.#stateListeners, {\n\t\t\ttype: \"state_changed\",\n\t\t\tserverName: this.serverName,\n\t\t\tpreviousState,\n\t\t\tstate,\n\t\t\tgeneration: this.#generation,\n\t\t\terror,\n\t\t});\n\t}\n\n\t#emit<TEvent>(listeners: Set<ServerConnectionListener<TEvent>>, event: TEvent): void {\n\t\tfor (const listener of listeners) {\n\t\t\tvoid wrapAsync(\"connection.event\", listener, this.#sink)(event);\n\t\t}\n\t}\n\n\t#markFailure(state: ServerConnectionState, error: Error | undefined): void {\n\t\tthis.#lastError = error;\n\t\tthis.#setState(state, error);\n\t}\n\n\t#connectError(message: string, phase: string, retriable?: true, cause?: unknown): ConnectError {\n\t\treturn new ConnectError(message, { cause, phase, retriable, serverName: this.serverName });\n\t}\n\n\tget #sink(): McpAsyncErrorSink {\n\t\treturn { logger: this.#logger };\n\t}\n}\n\nfunction isNeedsAuthError(error: unknown, depth = 0): boolean {\n\tif (error instanceof UnauthorizedError) return true;\n\tif (error instanceof OAuthFlowError) return error.terminal;\n\t// connectMcpTransport wraps the SDK error in a ConnectError; unwrap the cause.\n\tif (depth < 5 && error !== null && typeof error === \"object\" && \"cause\" in error) {\n\t\treturn isNeedsAuthError((error as { cause?: unknown }).cause, depth + 1);\n\t}\n\treturn false;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/service.ts"],"names":[],"mappings":"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"}
@@ -354,9 +354,7 @@ export class McpService {
354
354
  return this.rehydrateActiveToolsFromHistory(messages);
355
355
  }
356
356
  #serverSnapshot(name) {
357
- const connection = this.getConnection(name);
358
- connection?.refreshCapturedDiagnostics();
359
- return buildMcpServerSnapshot(name, this.#config?.servers[name], connection, this.#entryForName(name));
357
+ return buildMcpServerSnapshot(name, this.#config?.servers[name], this.getConnection(name), this.#entryForName(name));
360
358
  }
361
359
  #entryForName(name) {
362
360
  const key = this.#connectionKeysByName.get(name);
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/service.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionAPI, SessionShutdownEvent, SessionStartEvent } from \"../../types.ts\";\nimport { detectLiteralBearerWarnings, resolveServerAuth } from \"./auth/context.ts\";\nimport { collectToolCatalog } from \"./catalog.ts\";\nimport { getValidCachedServer, readMcpCatalogCache } from \"./catalog-cache.ts\";\nimport { loadMcpConfig, resolveSkillMcpServer, visitSpawnableMcpServers } from \"./config.ts\";\nimport type { McpServerConfig, ResolvedMcpConfig, ResolvedMcpServer } from \"./config-schema.ts\";\nimport { ServerConnection } from \"./connection.ts\";\nimport { mapMcpCatalogNames } from \"./expose/register.ts\";\nimport type { McpSessionRegistration } from \"./expose/session.ts\";\nimport type { McpServerExposureStatus } from \"./expose/status.ts\";\nimport { cleanupMcpOutputArtifacts } from \"./guard/output-guard.ts\";\nimport { markMcpConnectionNeedsAuth } from \"./health.ts\";\nimport { configureMcpConnectionLifecycle, disposeMcpConnectionLifecycle } from \"./idle.ts\";\nimport { createMcpLogger } from \"./log.ts\";\nimport {\n\tbuildMcpTombstoneDefinition,\n\tcreateMcpListChangeCoalescer,\n\tdiffMcpToolNames,\n\tformatMcpListChangedDelta,\n} from \"./notifications.ts\";\nimport { configureMcpReconnect, disposeMcpReconnect, reconnectMcpNow } from \"./reconnect.ts\";\nimport type { McpResourceServer } from \"./resources.ts\";\nimport { getMcpServiceExposureStatus } from \"./service-exposure.ts\";\nimport { registerMcpServiceDirectTools } from \"./service-register.ts\";\nimport { buildMcpServerSnapshot } from \"./service-snapshot.ts\";\nimport type {\n\tMcpConnectionEntry,\n\tMcpDisposeReason,\n\tMcpServerSnapshot,\n\tMcpServiceSnapshot,\n\tMcpSessionContext,\n\tMcpSessionOptions,\n} from \"./service-types.ts\";\nimport {\n\tconnectAndRefreshMcpCatalog,\n\tignoreStartupNeedsAuth,\n\traceMcpStartupConnect,\n\tshouldRaceMcpStartup,\n} from \"./startup-race.ts\";\n\nexport { registerToolsPreservingActiveSet } from \"./active-set.ts\";\n\nexport class McpService {\n\t#disposed = false;\n\t#disposeCount = 0;\n\t#lastDisposeReason: McpDisposeReason | null = null;\n\t#sessionContext: McpSessionContext | null = null;\n\t#sessionStartCount = 0;\n\t#lastSessionStartReason: SessionStartEvent[\"reason\"] | null = null;\n\t#toolRefreshGeneration = 0;\n\t#config: ResolvedMcpConfig | null = null;\n\t#authAgentDir: string | undefined;\n\t#authEnv: Record<string, string | undefined> | undefined;\n\treadonly #pendingAuth = new Map<string, import(\"./auth/oauth-provider.ts\").McpOAuthProvider>();\n\t#refreshActiveSetWhenNoTools = false;\n\t#tierBRegistration: McpSessionRegistration | undefined;\n\t#historyScanned = false;\n\t#sessionOptions: McpSessionOptions = {};\n\t#pi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\"> | undefined;\n\treadonly #connections = new Map<string, McpConnectionEntry>();\n\treadonly #connectionKeysByName = new Map<string, string>();\n\n\tasync attachSession(\n\t\tevent: SessionStartEvent,\n\t\tctx: McpSessionContext,\n\t\t_pi?: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\t\toptions: McpSessionOptions = {},\n\t): Promise<void> {\n\t\tthis.#sessionContext = ctx;\n\t\tthis.#sessionStartCount += 1;\n\t\tthis.#lastSessionStartReason = event.reason;\n\t\tconst config = loadMcpConfig({\n\t\t\tagentDir: options.agentDir,\n\t\t\tcwd: ctx.cwd,\n\t\t\tenv: options.env,\n\t\t\tprojectTrusted: options.projectTrusted ?? ctx.isProjectTrusted(),\n\t\t});\n\t\tthis.#config = config;\n\t\tthis.#pi = _pi;\n\t\tthis.#authAgentDir = options.agentDir;\n\t\tthis.#authEnv = options.env;\n\t\tthis.#sessionOptions = options;\n\t\tconst toolRefreshGeneration = this.#toolRefreshGeneration + 1;\n\t\tthis.#toolRefreshGeneration = toolRefreshGeneration;\n\t\tawait this.#syncFromConfig(config, options, event.reason !== \"reload\", _pi, toolRefreshGeneration);\n\t\tif (_pi !== undefined) await this.#registerDirectTools(_pi);\n\t\t// Replay promotion markers from the (possibly resumed) session history\n\t\t// BEFORE the first turn: the request tool snapshot is taken before the\n\t\t// per-turn context event fires, so the context-event replay alone lands\n\t\t// one turn late. Doing it here puts restored tools on the very first\n\t\t// wire payload after a --continue/resume.\n\t\tif (_pi !== undefined) this.#rehydrateFromSessionHistory(ctx);\n\t}\n\n\t/**\n\t * Register skill-declared MCP servers (todo 37). Skill servers are forced\n\t * into search mode with no directTools, so their catalogs register with\n\t * ZERO active tools until activateSkillMcpTools reveals them. A name\n\t * collision with a system-configured server keeps the system config and\n\t * returns a warning (system wins).\n\t */\n\tasync attachSkillMcpServers(\n\t\tdeclared: ReadonlyMap<string, { raw: Parameters<typeof resolveSkillMcpServer>[1]; sourcePath: string }>,\n\t): Promise<string[]> {\n\t\tconst config = this.#config;\n\t\tconst pi = this.#pi;\n\t\tif (config === null || pi === undefined) return [];\n\t\tconst warnings: string[] = [];\n\t\tlet added = 0;\n\t\tfor (const [name, decl] of declared) {\n\t\t\tconst existing = config.servers[name];\n\t\t\tif (existing !== undefined && existing.source !== \"skill\") {\n\t\t\t\twarnings.push(\n\t\t\t\t\t`MCP server '${name}' from skill ${decl.sourcePath} collides with the ${existing.source} config; system config wins.`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst resolved = resolveSkillMcpServer(name, decl.raw, decl.sourcePath);\n\t\t\tif (existing !== undefined && existing.configHash === resolved.configHash) continue;\n\t\t\tconfig.servers[name] = resolved;\n\t\t\tadded += 1;\n\t\t}\n\t\tif (added > 0) {\n\t\t\tconst toolRefreshGeneration = this.#toolRefreshGeneration + 1;\n\t\t\tthis.#toolRefreshGeneration = toolRefreshGeneration;\n\t\t\tawait this.#syncFromConfig(config, this.#sessionOptions, false, pi, toolRefreshGeneration);\n\t\t\tawait this.#registerDirectTools(pi);\n\t\t}\n\t\treturn warnings;\n\t}\n\n\t/** Registered searchable catalog (mapped name + server-side tool name),\n\t * used by the skills loader to compute activation targets. */\n\tgetTierBSearchable(): ReadonlyArray<{ name: string; toolName: string; server: string }> {\n\t\treturn this.#tierBRegistration?.searchable ?? [];\n\t}\n\n\t/** Connected servers that list prompts (todo 40), for slash registration. */\n\tgetMcpPromptServers(): readonly import(\"./prompts.ts\").McpPromptServer[] {\n\t\treturn this.#tierBRegistration?.promptServers ?? [];\n\t}\n\n\t/** Connected servers that list resources (todo 39), for mention expansion. */\n\tgetMcpResourceServers(): readonly McpResourceServer[] {\n\t\treturn this.#tierBRegistration?.resourceServers ?? [];\n\t}\n\n\t/** Reveal skill-owned tools (todo 37): activation is effective the next\n\t * turn, exactly like an mcp_search promotion. Unknown names are ignored. */\n\tactivateSkillMcpTools(names: readonly string[]): void {\n\t\tthis.#tierBRegistration?.activate(names);\n\t}\n\n\t#rehydrateFromSessionHistory(ctx: McpSessionContext): void {\n\t\tconst entries = ctx.sessionManager?.getEntries() ?? [];\n\t\tif (entries.length === 0) return;\n\t\tthis.rehydrateActiveToolsFromHistory(entries);\n\t}\n\n\tasync handleSessionShutdown(event: SessionShutdownEvent): Promise<void> {\n\t\tif (shouldDisposeMcpService(event.reason)) await this.dispose(event.reason);\n\t}\n\n\tasync dispose(reason: McpDisposeReason): Promise<void> {\n\t\tif (this.#disposed) return;\n\t\tthis.#disposed = true;\n\t\tthis.#disposeCount += 1;\n\t\tthis.#lastDisposeReason = reason;\n\t\tthis.#sessionContext = null;\n\t\tthis.#config = null;\n\t\tconst entries = [...this.#connections.values()];\n\t\tthis.#connections.clear();\n\t\tthis.#connectionKeysByName.clear();\n\t\tawait Promise.all(entries.map((entry) => disposeEntryConnection(entry)));\n\t\tawait cleanupMcpOutputArtifacts();\n\t}\n\n\tisDisposed(): boolean {\n\t\treturn this.#disposed;\n\t}\n\n\tgetConnection(name: string): ServerConnection | undefined {\n\t\tconst key = this.#connectionKeysByName.get(name);\n\t\treturn key === undefined ? undefined : this.#connections.get(key)?.connection;\n\t}\n\n\tasync reconnectServer(name: string): Promise<void> {\n\t\tconst entry = this.#entryForName(name);\n\t\tif (entry === undefined) throw new Error(`Unknown MCP server: ${name || \"<missing>\"}`);\n\t\tawait reconnectMcpNow(entry.connection);\n\t}\n\n\tgetServerSnapshots(): McpServerSnapshot[] {\n\t\tconst names = new Set<string>(Object.keys(this.#config?.servers ?? {}));\n\t\tfor (const entry of this.#connections.values()) names.add(entry.name);\n\t\treturn [...names].sort().map((name) => this.#serverSnapshot(name));\n\t}\n\n\tgetLogLines(name: string, maxLines: number): string[] {\n\t\tconst key = this.#connectionKeysByName.get(name);\n\t\tconst lines = key === undefined ? [] : (this.#connections.get(key)?.logger.getRingBuffer() ?? []);\n\t\treturn lines.slice(Math.max(0, lines.length - maxLines));\n\t}\n\n\tasync getServerExposureStatus(name: string): Promise<McpServerExposureStatus> {\n\t\treturn await getMcpServiceExposureStatus(name, this.#config, this.#entryForName(name));\n\t}\n\n\trecordCall(name: string, elapsedMs: number, failed: boolean): void {\n\t\tconst key = this.#connectionKeysByName.get(name);\n\t\tconst entry = key === undefined ? undefined : this.#connections.get(key);\n\t\tif (entry === undefined) return;\n\t\tentry.counters.callCount += 1;\n\t\tentry.counters.totalLatencyMs += elapsedMs;\n\t\tif (failed) entry.counters.errorCount += 1;\n\t}\n\n\tgetSnapshot(): McpServiceSnapshot {\n\t\treturn {\n\t\t\tdisposed: this.#disposed,\n\t\t\tdisposeCount: this.#disposeCount,\n\t\t\tlastDisposeReason: this.#lastDisposeReason,\n\t\t\tsessionStartCount: this.#sessionStartCount,\n\t\t\tlastSessionStartReason: this.#lastSessionStartReason,\n\t\t\thasSessionContext: this.#sessionContext !== null,\n\t\t\tconnectionCount: this.#connections.size,\n\t\t};\n\t}\n\n\tasync #syncFromConfig(\n\t\tconfig: ResolvedMcpConfig,\n\t\toptions: McpSessionOptions,\n\t\tuseCache: boolean,\n\t\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\"> | undefined,\n\t\ttoolRefreshGeneration: number,\n\t): Promise<void> {\n\t\tconst cache = await readMcpCatalogCache(options.agentDir);\n\t\tconst hadConnectionsBeforeSync = this.#connections.size > 0;\n\t\tthis.#refreshActiveSetWhenNoTools = Object.keys(config.servers).length > 0 || hadConnectionsBeforeSync;\n\t\tconst wanted = new Map<string, ResolvedMcpServer>();\n\t\tvisitSpawnableMcpServers(config, (name, server) => {\n\t\t\twanted.set(name, server);\n\t\t});\n\t\tconst disposals: Promise<void>[] = [];\n\t\tfor (const entry of this.#connections.values()) {\n\t\t\tconst server = wanted.get(entry.name);\n\t\t\tconst key = server?.configHash === undefined ? undefined : `${entry.name}\\0${server.configHash}`;\n\t\t\tif (key === entry.key) continue;\n\t\t\tthis.#connections.delete(entry.key);\n\t\t\tthis.#connectionKeysByName.delete(entry.name);\n\t\t\tdisposals.push(disposeEntryConnection(entry));\n\t\t}\n\t\tawait Promise.all(disposals);\n\n\t\tconst connects: Promise<void>[] = [];\n\t\tfor (const [name, server] of wanted) {\n\t\t\tif (server.config === undefined || server.configHash === undefined) continue;\n\t\t\tconst key = `${name}\\0${server.configHash}`;\n\t\t\tif (this.#connections.has(key)) continue;\n\t\t\tconst logger = createMcpLogger(name, { logDir: options.logDir });\n\t\t\tconst authPlan = resolveServerAuth({\n\t\t\t\tagentDir: options.agentDir,\n\t\t\t\tconfig: server.config,\n\t\t\t\tenv: options.env,\n\t\t\t\tlogger,\n\t\t\t\tserverName: name,\n\t\t\t});\n\t\t\tfor (const warning of detectLiteralBearerWarnings(name, server.config)) logger.warn(warning);\n\t\t\tconst connection = new ServerConnection({\n\t\t\t\tauthProvider: authPlan.provider,\n\t\t\t\tconfig: server.config,\n\t\t\t\tenv: options.env,\n\t\t\t\tlogger,\n\t\t\t\tserverName: name,\n\t\t\t});\n\t\t\tconst cachedCatalog = useCache ? getValidCachedServer(cache, name, server.configHash) : undefined;\n\t\t\tconst entry: McpConnectionEntry = {\n\t\t\t\tagentDir: options.agentDir,\n\t\t\t\tauthPlan,\n\t\t\t\tcacheRefreshedAfterConnect: false,\n\t\t\t\tcachedCatalog,\n\t\t\t\tkey,\n\t\t\t\tname,\n\t\t\t\tconfigHash: server.configHash,\n\t\t\t\tconnection,\n\t\t\t\tlogger,\n\t\t\t\tcreatedAtMs: Date.now(),\n\t\t\t\tcounters: { callCount: 0, errorCount: 0, totalLatencyMs: 0, reconnectCount: 0 },\n\t\t\t};\n\t\t\tconfigureMcpConnectionLifecycle(connection, server.config, logger);\n\t\t\tconfigureMcpReconnect({\n\t\t\t\tconnection,\n\t\t\t\tlogger,\n\t\t\t\treconnect: async () => {\n\t\t\t\t\tentry.counters.reconnectCount += 1;\n\t\t\t\t\tentry.cacheRefreshedAfterConnect = false;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait entry.authPlan?.refresh?.ensureFresh();\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconst authError = markMcpConnectionNeedsAuth(entry.connection, error);\n\t\t\t\t\t\tif (authError !== undefined) {\n\t\t\t\t\t\t\tentry.logger.warn(authError.message);\n\t\t\t\t\t\t\tthrow authError;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\tawait entry.connection.renew();\n\t\t\t\t\tawait connectAndRefreshMcpCatalog(entry, server.config);\n\t\t\t\t},\n\t\t\t\tshouldReconnect: () => !this.#disposed && this.#entryForName(name) === entry,\n\t\t\t});\n\t\t\tthis.#connections.set(key, entry);\n\t\t\tthis.#connectionKeysByName.set(name, key);\n\t\t\tthis.#wireListChanged(entry);\n\t\t\tif (shouldRaceMcpStartup(server.config.lifecycle)) {\n\t\t\t\tconnects.push(\n\t\t\t\t\traceMcpStartupConnect({\n\t\t\t\t\t\tentry,\n\t\t\t\t\t\tpi,\n\t\t\t\t\t\tregisterDirectTools: (targetPi) => this.#registerDirectTools(targetPi),\n\t\t\t\t\t\tserverConfig: server.config,\n\t\t\t\t\t\tshouldRefreshTools: () => !this.#disposed && this.#toolRefreshGeneration === toolRefreshGeneration,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else if (cachedCatalog === undefined) {\n\t\t\t\tconnects.push(ignoreStartupNeedsAuth(entry, connectAndRefreshMcpCatalog(entry, server.config)));\n\t\t\t}\n\t\t}\n\t\tawait Promise.all(connects);\n\t}\n\n\t#wireListChanged(entry: McpConnectionEntry): void {\n\t\tconst sink = { logger: { error: (message: string, data?: unknown) => entry.logger.error(message, data) } };\n\t\tconst coalescer = createMcpListChangeCoalescer({\n\t\t\tonRefresh: () => this.#handleServerToolsChanged(entry),\n\t\t\tscope: `mcp.list_changed.${entry.name}`,\n\t\t\tsink,\n\t\t});\n\t\tconst unsubscribe = entry.connection.onToolsChanged(() => coalescer.notify());\n\t\tentry.disposeListChanged = () => {\n\t\t\tunsubscribe();\n\t\t\tcoalescer.dispose();\n\t\t};\n\t}\n\n\t// Re-list a server on a coalesced list_changed and re-register: added tools\n\t// enter INACTIVE (registerToolsPreservingActiveSet keeps the active set), and\n\t// removed tools are tombstoned so a stale call fails cleanly.\n\tasync #handleServerToolsChanged(entry: McpConnectionEntry): Promise<void> {\n\t\tconst pi = this.#pi;\n\t\tconst config = this.#config;\n\t\tif (pi === undefined || config === null) return;\n\t\tconst server = config.servers[entry.name];\n\t\tif (server?.config === undefined || entry.connection.state !== \"connected\") return;\n\t\tconst catalog = await collectToolCatalog(entry.name, entry.connection, server.config, {\n\t\t\tagentDir: entry.agentDir,\n\t\t\toutputGuard: config.settings.outputGuard,\n\t\t});\n\t\tconst newNames = mapMcpCatalogNames(catalog).map(({ name }) => name);\n\t\tconst diff = diffMcpToolNames(entry.knownToolNames ?? newNames, newNames);\n\t\t// Tombstone removed tools BEFORE re-registration so the subsequent\n\t\t// setActiveTools (which excludes them) leaves the tombstones inactive.\n\t\tfor (const removed of diff.removed) pi.registerTool(buildMcpTombstoneDefinition(removed, entry.name));\n\t\tawait this.#registerDirectTools(pi);\n\t\tentry.knownToolNames = newNames;\n\t\tentry.lastListChangedDelta = formatMcpListChangedDelta(diff);\n\t}\n\n\tasync #registerDirectTools(\n\t\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\t): Promise<void> {\n\t\tconst config = this.#config;\n\t\tif (config === null) return;\n\t\tthis.#tierBRegistration = await registerMcpServiceDirectTools(pi, config, this.#connections.values(), {\n\t\t\trefreshActiveSetWhenEmpty: this.#refreshActiveSetWhenNoTools,\n\t\t});\n\t\t// A (re-)registration recomputes the active set from config alone, so any\n\t\t// promotions recorded in history are worth replaying on the next scan.\n\t\tthis.#historyScanned = false;\n\t}\n\n\t/**\n\t * Replay mcp_search activation markers from session history through the\n\t * live tier-B activation path (see tool-search.ts). Returns newly activated\n\t * names; safe to call repeatedly (already-active names are skipped).\n\t */\n\trehydrateActiveToolsFromHistory(messages: readonly unknown[]): string[] {\n\t\tthis.#historyScanned = true;\n\t\treturn this.#tierBRegistration?.rehydrateFromHistory(messages) ?? [];\n\t}\n\n\t/**\n\t * Once-per-registration variant for per-turn context events: scanning the\n\t * full history each turn would cost O(history) JSON serialization, and a\n\t * live session's active set only drifts from history when a (re-)registration\n\t * rebuilt it — so scan once after each registration and skip otherwise.\n\t */\n\tmaybeRehydrateFromHistory(messages: readonly unknown[]): string[] {\n\t\tif (this.#historyScanned) return [];\n\t\treturn this.rehydrateActiveToolsFromHistory(messages);\n\t}\n\n\t#serverSnapshot(name: string): McpServerSnapshot {\n\t\tconst connection = this.getConnection(name);\n\t\tconnection?.refreshCapturedDiagnostics();\n\t\treturn buildMcpServerSnapshot(name, this.#config?.servers[name], connection, this.#entryForName(name));\n\t}\n\n\t#entryForName(name: string): McpConnectionEntry | undefined {\n\t\tconst key = this.#connectionKeysByName.get(name);\n\t\treturn key === undefined ? undefined : this.#connections.get(key);\n\t}\n\n\tgetPendingAuth(): Map<string, import(\"./auth/oauth-provider.ts\").McpOAuthProvider> {\n\t\treturn this.#pendingAuth;\n\t}\n\n\tgetAuthTarget(\n\t\tname: string,\n\t):\n\t\t| { config: McpServerConfig; agentDir?: string; env?: Record<string, string | undefined>; callbackUrl?: string }\n\t\t| undefined {\n\t\tconst server = this.#config?.servers[name];\n\t\tif (server?.config === undefined) return undefined;\n\t\treturn {\n\t\t\tconfig: server.config,\n\t\t\tagentDir: this.#authAgentDir,\n\t\t\tenv: this.#authEnv,\n\t\t\tcallbackUrl: this.#config?.settings.oauthCallbackUrl,\n\t\t};\n\t}\n\n\tgetCachedInstructions(name: string): string | undefined {\n\t\treturn this.#entryForName(name)?.cachedCatalog?.instructions;\n\t}\n\n\t/** Resolved `settings.nativeToolSearch` (auto | true | false | undefined).\n\t * Drives the native provider tool-search adapter gate. */\n\tgetNativeToolSearchSetting(): \"auto\" | boolean | undefined {\n\t\treturn this.#config?.settings.nativeToolSearch;\n\t}\n}\n\nlet service: McpService | null = null;\n\nexport function getMcpService(): McpService {\n\tif (service === null || service.isDisposed()) {\n\t\tservice = new McpService();\n\t}\n\treturn service;\n}\n\nexport function shouldDisposeMcpService(reason: SessionShutdownEvent[\"reason\"]): reason is McpDisposeReason {\n\treturn reason === \"quit\" || reason === \"reload\";\n}\n\nasync function disposeEntryConnection(entry: McpConnectionEntry): Promise<void> {\n\tentry.disposeListChanged?.();\n\tdisposeMcpReconnect(entry.connection);\n\tdisposeMcpConnectionLifecycle(entry.connection);\n\tawait entry.connection.dispose();\n}\n\nexport function resetMcpServiceForTests(): void {\n\tservice = null;\n}\n"]}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/service.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionAPI, SessionShutdownEvent, SessionStartEvent } from \"../../types.ts\";\nimport { detectLiteralBearerWarnings, resolveServerAuth } from \"./auth/context.ts\";\nimport { collectToolCatalog } from \"./catalog.ts\";\nimport { getValidCachedServer, readMcpCatalogCache } from \"./catalog-cache.ts\";\nimport { loadMcpConfig, resolveSkillMcpServer, visitSpawnableMcpServers } from \"./config.ts\";\nimport type { McpServerConfig, ResolvedMcpConfig, ResolvedMcpServer } from \"./config-schema.ts\";\nimport { ServerConnection } from \"./connection.ts\";\nimport { mapMcpCatalogNames } from \"./expose/register.ts\";\nimport type { McpSessionRegistration } from \"./expose/session.ts\";\nimport type { McpServerExposureStatus } from \"./expose/status.ts\";\nimport { cleanupMcpOutputArtifacts } from \"./guard/output-guard.ts\";\nimport { markMcpConnectionNeedsAuth } from \"./health.ts\";\nimport { configureMcpConnectionLifecycle, disposeMcpConnectionLifecycle } from \"./idle.ts\";\nimport { createMcpLogger } from \"./log.ts\";\nimport {\n\tbuildMcpTombstoneDefinition,\n\tcreateMcpListChangeCoalescer,\n\tdiffMcpToolNames,\n\tformatMcpListChangedDelta,\n} from \"./notifications.ts\";\nimport { configureMcpReconnect, disposeMcpReconnect, reconnectMcpNow } from \"./reconnect.ts\";\nimport type { McpResourceServer } from \"./resources.ts\";\nimport { getMcpServiceExposureStatus } from \"./service-exposure.ts\";\nimport { registerMcpServiceDirectTools } from \"./service-register.ts\";\nimport { buildMcpServerSnapshot } from \"./service-snapshot.ts\";\nimport type {\n\tMcpConnectionEntry,\n\tMcpDisposeReason,\n\tMcpServerSnapshot,\n\tMcpServiceSnapshot,\n\tMcpSessionContext,\n\tMcpSessionOptions,\n} from \"./service-types.ts\";\nimport {\n\tconnectAndRefreshMcpCatalog,\n\tignoreStartupNeedsAuth,\n\traceMcpStartupConnect,\n\tshouldRaceMcpStartup,\n} from \"./startup-race.ts\";\n\nexport { registerToolsPreservingActiveSet } from \"./active-set.ts\";\n\nexport class McpService {\n\t#disposed = false;\n\t#disposeCount = 0;\n\t#lastDisposeReason: McpDisposeReason | null = null;\n\t#sessionContext: McpSessionContext | null = null;\n\t#sessionStartCount = 0;\n\t#lastSessionStartReason: SessionStartEvent[\"reason\"] | null = null;\n\t#toolRefreshGeneration = 0;\n\t#config: ResolvedMcpConfig | null = null;\n\t#authAgentDir: string | undefined;\n\t#authEnv: Record<string, string | undefined> | undefined;\n\treadonly #pendingAuth = new Map<string, import(\"./auth/oauth-provider.ts\").McpOAuthProvider>();\n\t#refreshActiveSetWhenNoTools = false;\n\t#tierBRegistration: McpSessionRegistration | undefined;\n\t#historyScanned = false;\n\t#sessionOptions: McpSessionOptions = {};\n\t#pi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\"> | undefined;\n\treadonly #connections = new Map<string, McpConnectionEntry>();\n\treadonly #connectionKeysByName = new Map<string, string>();\n\n\tasync attachSession(\n\t\tevent: SessionStartEvent,\n\t\tctx: McpSessionContext,\n\t\t_pi?: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\t\toptions: McpSessionOptions = {},\n\t): Promise<void> {\n\t\tthis.#sessionContext = ctx;\n\t\tthis.#sessionStartCount += 1;\n\t\tthis.#lastSessionStartReason = event.reason;\n\t\tconst config = loadMcpConfig({\n\t\t\tagentDir: options.agentDir,\n\t\t\tcwd: ctx.cwd,\n\t\t\tenv: options.env,\n\t\t\tprojectTrusted: options.projectTrusted ?? ctx.isProjectTrusted(),\n\t\t});\n\t\tthis.#config = config;\n\t\tthis.#pi = _pi;\n\t\tthis.#authAgentDir = options.agentDir;\n\t\tthis.#authEnv = options.env;\n\t\tthis.#sessionOptions = options;\n\t\tconst toolRefreshGeneration = this.#toolRefreshGeneration + 1;\n\t\tthis.#toolRefreshGeneration = toolRefreshGeneration;\n\t\tawait this.#syncFromConfig(config, options, event.reason !== \"reload\", _pi, toolRefreshGeneration);\n\t\tif (_pi !== undefined) await this.#registerDirectTools(_pi);\n\t\t// Replay promotion markers from the (possibly resumed) session history\n\t\t// BEFORE the first turn: the request tool snapshot is taken before the\n\t\t// per-turn context event fires, so the context-event replay alone lands\n\t\t// one turn late. Doing it here puts restored tools on the very first\n\t\t// wire payload after a --continue/resume.\n\t\tif (_pi !== undefined) this.#rehydrateFromSessionHistory(ctx);\n\t}\n\n\t/**\n\t * Register skill-declared MCP servers (todo 37). Skill servers are forced\n\t * into search mode with no directTools, so their catalogs register with\n\t * ZERO active tools until activateSkillMcpTools reveals them. A name\n\t * collision with a system-configured server keeps the system config and\n\t * returns a warning (system wins).\n\t */\n\tasync attachSkillMcpServers(\n\t\tdeclared: ReadonlyMap<string, { raw: Parameters<typeof resolveSkillMcpServer>[1]; sourcePath: string }>,\n\t): Promise<string[]> {\n\t\tconst config = this.#config;\n\t\tconst pi = this.#pi;\n\t\tif (config === null || pi === undefined) return [];\n\t\tconst warnings: string[] = [];\n\t\tlet added = 0;\n\t\tfor (const [name, decl] of declared) {\n\t\t\tconst existing = config.servers[name];\n\t\t\tif (existing !== undefined && existing.source !== \"skill\") {\n\t\t\t\twarnings.push(\n\t\t\t\t\t`MCP server '${name}' from skill ${decl.sourcePath} collides with the ${existing.source} config; system config wins.`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst resolved = resolveSkillMcpServer(name, decl.raw, decl.sourcePath);\n\t\t\tif (existing !== undefined && existing.configHash === resolved.configHash) continue;\n\t\t\tconfig.servers[name] = resolved;\n\t\t\tadded += 1;\n\t\t}\n\t\tif (added > 0) {\n\t\t\tconst toolRefreshGeneration = this.#toolRefreshGeneration + 1;\n\t\t\tthis.#toolRefreshGeneration = toolRefreshGeneration;\n\t\t\tawait this.#syncFromConfig(config, this.#sessionOptions, false, pi, toolRefreshGeneration);\n\t\t\tawait this.#registerDirectTools(pi);\n\t\t}\n\t\treturn warnings;\n\t}\n\n\t/** Registered searchable catalog (mapped name + server-side tool name),\n\t * used by the skills loader to compute activation targets. */\n\tgetTierBSearchable(): ReadonlyArray<{ name: string; toolName: string; server: string }> {\n\t\treturn this.#tierBRegistration?.searchable ?? [];\n\t}\n\n\t/** Connected servers that list prompts (todo 40), for slash registration. */\n\tgetMcpPromptServers(): readonly import(\"./prompts.ts\").McpPromptServer[] {\n\t\treturn this.#tierBRegistration?.promptServers ?? [];\n\t}\n\n\t/** Connected servers that list resources (todo 39), for mention expansion. */\n\tgetMcpResourceServers(): readonly McpResourceServer[] {\n\t\treturn this.#tierBRegistration?.resourceServers ?? [];\n\t}\n\n\t/** Reveal skill-owned tools (todo 37): activation is effective the next\n\t * turn, exactly like an mcp_search promotion. Unknown names are ignored. */\n\tactivateSkillMcpTools(names: readonly string[]): void {\n\t\tthis.#tierBRegistration?.activate(names);\n\t}\n\n\t#rehydrateFromSessionHistory(ctx: McpSessionContext): void {\n\t\tconst entries = ctx.sessionManager?.getEntries() ?? [];\n\t\tif (entries.length === 0) return;\n\t\tthis.rehydrateActiveToolsFromHistory(entries);\n\t}\n\n\tasync handleSessionShutdown(event: SessionShutdownEvent): Promise<void> {\n\t\tif (shouldDisposeMcpService(event.reason)) await this.dispose(event.reason);\n\t}\n\n\tasync dispose(reason: McpDisposeReason): Promise<void> {\n\t\tif (this.#disposed) return;\n\t\tthis.#disposed = true;\n\t\tthis.#disposeCount += 1;\n\t\tthis.#lastDisposeReason = reason;\n\t\tthis.#sessionContext = null;\n\t\tthis.#config = null;\n\t\tconst entries = [...this.#connections.values()];\n\t\tthis.#connections.clear();\n\t\tthis.#connectionKeysByName.clear();\n\t\tawait Promise.all(entries.map((entry) => disposeEntryConnection(entry)));\n\t\tawait cleanupMcpOutputArtifacts();\n\t}\n\n\tisDisposed(): boolean {\n\t\treturn this.#disposed;\n\t}\n\n\tgetConnection(name: string): ServerConnection | undefined {\n\t\tconst key = this.#connectionKeysByName.get(name);\n\t\treturn key === undefined ? undefined : this.#connections.get(key)?.connection;\n\t}\n\n\tasync reconnectServer(name: string): Promise<void> {\n\t\tconst entry = this.#entryForName(name);\n\t\tif (entry === undefined) throw new Error(`Unknown MCP server: ${name || \"<missing>\"}`);\n\t\tawait reconnectMcpNow(entry.connection);\n\t}\n\n\tgetServerSnapshots(): McpServerSnapshot[] {\n\t\tconst names = new Set<string>(Object.keys(this.#config?.servers ?? {}));\n\t\tfor (const entry of this.#connections.values()) names.add(entry.name);\n\t\treturn [...names].sort().map((name) => this.#serverSnapshot(name));\n\t}\n\n\tgetLogLines(name: string, maxLines: number): string[] {\n\t\tconst key = this.#connectionKeysByName.get(name);\n\t\tconst lines = key === undefined ? [] : (this.#connections.get(key)?.logger.getRingBuffer() ?? []);\n\t\treturn lines.slice(Math.max(0, lines.length - maxLines));\n\t}\n\n\tasync getServerExposureStatus(name: string): Promise<McpServerExposureStatus> {\n\t\treturn await getMcpServiceExposureStatus(name, this.#config, this.#entryForName(name));\n\t}\n\n\trecordCall(name: string, elapsedMs: number, failed: boolean): void {\n\t\tconst key = this.#connectionKeysByName.get(name);\n\t\tconst entry = key === undefined ? undefined : this.#connections.get(key);\n\t\tif (entry === undefined) return;\n\t\tentry.counters.callCount += 1;\n\t\tentry.counters.totalLatencyMs += elapsedMs;\n\t\tif (failed) entry.counters.errorCount += 1;\n\t}\n\n\tgetSnapshot(): McpServiceSnapshot {\n\t\treturn {\n\t\t\tdisposed: this.#disposed,\n\t\t\tdisposeCount: this.#disposeCount,\n\t\t\tlastDisposeReason: this.#lastDisposeReason,\n\t\t\tsessionStartCount: this.#sessionStartCount,\n\t\t\tlastSessionStartReason: this.#lastSessionStartReason,\n\t\t\thasSessionContext: this.#sessionContext !== null,\n\t\t\tconnectionCount: this.#connections.size,\n\t\t};\n\t}\n\n\tasync #syncFromConfig(\n\t\tconfig: ResolvedMcpConfig,\n\t\toptions: McpSessionOptions,\n\t\tuseCache: boolean,\n\t\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\"> | undefined,\n\t\ttoolRefreshGeneration: number,\n\t): Promise<void> {\n\t\tconst cache = await readMcpCatalogCache(options.agentDir);\n\t\tconst hadConnectionsBeforeSync = this.#connections.size > 0;\n\t\tthis.#refreshActiveSetWhenNoTools = Object.keys(config.servers).length > 0 || hadConnectionsBeforeSync;\n\t\tconst wanted = new Map<string, ResolvedMcpServer>();\n\t\tvisitSpawnableMcpServers(config, (name, server) => {\n\t\t\twanted.set(name, server);\n\t\t});\n\t\tconst disposals: Promise<void>[] = [];\n\t\tfor (const entry of this.#connections.values()) {\n\t\t\tconst server = wanted.get(entry.name);\n\t\t\tconst key = server?.configHash === undefined ? undefined : `${entry.name}\\0${server.configHash}`;\n\t\t\tif (key === entry.key) continue;\n\t\t\tthis.#connections.delete(entry.key);\n\t\t\tthis.#connectionKeysByName.delete(entry.name);\n\t\t\tdisposals.push(disposeEntryConnection(entry));\n\t\t}\n\t\tawait Promise.all(disposals);\n\n\t\tconst connects: Promise<void>[] = [];\n\t\tfor (const [name, server] of wanted) {\n\t\t\tif (server.config === undefined || server.configHash === undefined) continue;\n\t\t\tconst key = `${name}\\0${server.configHash}`;\n\t\t\tif (this.#connections.has(key)) continue;\n\t\t\tconst logger = createMcpLogger(name, { logDir: options.logDir });\n\t\t\tconst authPlan = resolveServerAuth({\n\t\t\t\tagentDir: options.agentDir,\n\t\t\t\tconfig: server.config,\n\t\t\t\tenv: options.env,\n\t\t\t\tlogger,\n\t\t\t\tserverName: name,\n\t\t\t});\n\t\t\tfor (const warning of detectLiteralBearerWarnings(name, server.config)) logger.warn(warning);\n\t\t\tconst connection = new ServerConnection({\n\t\t\t\tauthProvider: authPlan.provider,\n\t\t\t\tconfig: server.config,\n\t\t\t\tenv: options.env,\n\t\t\t\tlogger,\n\t\t\t\tserverName: name,\n\t\t\t});\n\t\t\tconst cachedCatalog = useCache ? getValidCachedServer(cache, name, server.configHash) : undefined;\n\t\t\tconst entry: McpConnectionEntry = {\n\t\t\t\tagentDir: options.agentDir,\n\t\t\t\tauthPlan,\n\t\t\t\tcacheRefreshedAfterConnect: false,\n\t\t\t\tcachedCatalog,\n\t\t\t\tkey,\n\t\t\t\tname,\n\t\t\t\tconfigHash: server.configHash,\n\t\t\t\tconnection,\n\t\t\t\tlogger,\n\t\t\t\tcreatedAtMs: Date.now(),\n\t\t\t\tcounters: { callCount: 0, errorCount: 0, totalLatencyMs: 0, reconnectCount: 0 },\n\t\t\t};\n\t\t\tconfigureMcpConnectionLifecycle(connection, server.config, logger);\n\t\t\tconfigureMcpReconnect({\n\t\t\t\tconnection,\n\t\t\t\tlogger,\n\t\t\t\treconnect: async () => {\n\t\t\t\t\tentry.counters.reconnectCount += 1;\n\t\t\t\t\tentry.cacheRefreshedAfterConnect = false;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait entry.authPlan?.refresh?.ensureFresh();\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconst authError = markMcpConnectionNeedsAuth(entry.connection, error);\n\t\t\t\t\t\tif (authError !== undefined) {\n\t\t\t\t\t\t\tentry.logger.warn(authError.message);\n\t\t\t\t\t\t\tthrow authError;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\tawait entry.connection.renew();\n\t\t\t\t\tawait connectAndRefreshMcpCatalog(entry, server.config);\n\t\t\t\t},\n\t\t\t\tshouldReconnect: () => !this.#disposed && this.#entryForName(name) === entry,\n\t\t\t});\n\t\t\tthis.#connections.set(key, entry);\n\t\t\tthis.#connectionKeysByName.set(name, key);\n\t\t\tthis.#wireListChanged(entry);\n\t\t\tif (shouldRaceMcpStartup(server.config.lifecycle)) {\n\t\t\t\tconnects.push(\n\t\t\t\t\traceMcpStartupConnect({\n\t\t\t\t\t\tentry,\n\t\t\t\t\t\tpi,\n\t\t\t\t\t\tregisterDirectTools: (targetPi) => this.#registerDirectTools(targetPi),\n\t\t\t\t\t\tserverConfig: server.config,\n\t\t\t\t\t\tshouldRefreshTools: () => !this.#disposed && this.#toolRefreshGeneration === toolRefreshGeneration,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else if (cachedCatalog === undefined) {\n\t\t\t\tconnects.push(ignoreStartupNeedsAuth(entry, connectAndRefreshMcpCatalog(entry, server.config)));\n\t\t\t}\n\t\t}\n\t\tawait Promise.all(connects);\n\t}\n\n\t#wireListChanged(entry: McpConnectionEntry): void {\n\t\tconst sink = { logger: { error: (message: string, data?: unknown) => entry.logger.error(message, data) } };\n\t\tconst coalescer = createMcpListChangeCoalescer({\n\t\t\tonRefresh: () => this.#handleServerToolsChanged(entry),\n\t\t\tscope: `mcp.list_changed.${entry.name}`,\n\t\t\tsink,\n\t\t});\n\t\tconst unsubscribe = entry.connection.onToolsChanged(() => coalescer.notify());\n\t\tentry.disposeListChanged = () => {\n\t\t\tunsubscribe();\n\t\t\tcoalescer.dispose();\n\t\t};\n\t}\n\n\t// Re-list a server on a coalesced list_changed and re-register: added tools\n\t// enter INACTIVE (registerToolsPreservingActiveSet keeps the active set), and\n\t// removed tools are tombstoned so a stale call fails cleanly.\n\tasync #handleServerToolsChanged(entry: McpConnectionEntry): Promise<void> {\n\t\tconst pi = this.#pi;\n\t\tconst config = this.#config;\n\t\tif (pi === undefined || config === null) return;\n\t\tconst server = config.servers[entry.name];\n\t\tif (server?.config === undefined || entry.connection.state !== \"connected\") return;\n\t\tconst catalog = await collectToolCatalog(entry.name, entry.connection, server.config, {\n\t\t\tagentDir: entry.agentDir,\n\t\t\toutputGuard: config.settings.outputGuard,\n\t\t});\n\t\tconst newNames = mapMcpCatalogNames(catalog).map(({ name }) => name);\n\t\tconst diff = diffMcpToolNames(entry.knownToolNames ?? newNames, newNames);\n\t\t// Tombstone removed tools BEFORE re-registration so the subsequent\n\t\t// setActiveTools (which excludes them) leaves the tombstones inactive.\n\t\tfor (const removed of diff.removed) pi.registerTool(buildMcpTombstoneDefinition(removed, entry.name));\n\t\tawait this.#registerDirectTools(pi);\n\t\tentry.knownToolNames = newNames;\n\t\tentry.lastListChangedDelta = formatMcpListChangedDelta(diff);\n\t}\n\n\tasync #registerDirectTools(\n\t\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\t): Promise<void> {\n\t\tconst config = this.#config;\n\t\tif (config === null) return;\n\t\tthis.#tierBRegistration = await registerMcpServiceDirectTools(pi, config, this.#connections.values(), {\n\t\t\trefreshActiveSetWhenEmpty: this.#refreshActiveSetWhenNoTools,\n\t\t});\n\t\t// A (re-)registration recomputes the active set from config alone, so any\n\t\t// promotions recorded in history are worth replaying on the next scan.\n\t\tthis.#historyScanned = false;\n\t}\n\n\t/**\n\t * Replay mcp_search activation markers from session history through the\n\t * live tier-B activation path (see tool-search.ts). Returns newly activated\n\t * names; safe to call repeatedly (already-active names are skipped).\n\t */\n\trehydrateActiveToolsFromHistory(messages: readonly unknown[]): string[] {\n\t\tthis.#historyScanned = true;\n\t\treturn this.#tierBRegistration?.rehydrateFromHistory(messages) ?? [];\n\t}\n\n\t/**\n\t * Once-per-registration variant for per-turn context events: scanning the\n\t * full history each turn would cost O(history) JSON serialization, and a\n\t * live session's active set only drifts from history when a (re-)registration\n\t * rebuilt it — so scan once after each registration and skip otherwise.\n\t */\n\tmaybeRehydrateFromHistory(messages: readonly unknown[]): string[] {\n\t\tif (this.#historyScanned) return [];\n\t\treturn this.rehydrateActiveToolsFromHistory(messages);\n\t}\n\n\t#serverSnapshot(name: string): McpServerSnapshot {\n\t\treturn buildMcpServerSnapshot(\n\t\t\tname,\n\t\t\tthis.#config?.servers[name],\n\t\t\tthis.getConnection(name),\n\t\t\tthis.#entryForName(name),\n\t\t);\n\t}\n\n\t#entryForName(name: string): McpConnectionEntry | undefined {\n\t\tconst key = this.#connectionKeysByName.get(name);\n\t\treturn key === undefined ? undefined : this.#connections.get(key);\n\t}\n\n\tgetPendingAuth(): Map<string, import(\"./auth/oauth-provider.ts\").McpOAuthProvider> {\n\t\treturn this.#pendingAuth;\n\t}\n\n\tgetAuthTarget(\n\t\tname: string,\n\t):\n\t\t| { config: McpServerConfig; agentDir?: string; env?: Record<string, string | undefined>; callbackUrl?: string }\n\t\t| undefined {\n\t\tconst server = this.#config?.servers[name];\n\t\tif (server?.config === undefined) return undefined;\n\t\treturn {\n\t\t\tconfig: server.config,\n\t\t\tagentDir: this.#authAgentDir,\n\t\t\tenv: this.#authEnv,\n\t\t\tcallbackUrl: this.#config?.settings.oauthCallbackUrl,\n\t\t};\n\t}\n\n\tgetCachedInstructions(name: string): string | undefined {\n\t\treturn this.#entryForName(name)?.cachedCatalog?.instructions;\n\t}\n\n\t/** Resolved `settings.nativeToolSearch` (auto | true | false | undefined).\n\t * Drives the native provider tool-search adapter gate. */\n\tgetNativeToolSearchSetting(): \"auto\" | boolean | undefined {\n\t\treturn this.#config?.settings.nativeToolSearch;\n\t}\n}\n\nlet service: McpService | null = null;\n\nexport function getMcpService(): McpService {\n\tif (service === null || service.isDisposed()) {\n\t\tservice = new McpService();\n\t}\n\treturn service;\n}\n\nexport function shouldDisposeMcpService(reason: SessionShutdownEvent[\"reason\"]): reason is McpDisposeReason {\n\treturn reason === \"quit\" || reason === \"reload\";\n}\n\nasync function disposeEntryConnection(entry: McpConnectionEntry): Promise<void> {\n\tentry.disposeListChanged?.();\n\tdisposeMcpReconnect(entry.connection);\n\tdisposeMcpConnectionLifecycle(entry.connection);\n\tawait entry.connection.dispose();\n}\n\nexport function resetMcpServiceForTests(): void {\n\tservice = null;\n}\n"]}
@@ -6,7 +6,7 @@ export type { SourceInfo } from "../source-info.ts";
6
6
  export { createExtensionRuntime, discoverAndLoadExtensions, loadExtensionFromFactory, loadExtensions, } from "./loader.ts";
7
7
  export type { ExtensionErrorListener, ExtensionToolHookLifecycleEvent, ExtensionToolHookLifecycleObserver, ExtensionToolHookLifecycleStatus, ExtensionToolHookName, ForkHandler, NavigateTreeHandler, NewSessionHandler, ShutdownHandler, SwitchSessionHandler, } from "./runner.ts";
8
8
  export { ExtensionRunner } from "./runner.ts";
9
- export type { AfterProviderResponseEvent, AgentEndEvent, AgentSettledEvent, AgentStartEvent, AgentToolResult, AgentToolUpdateCallback, AppendEntryHandler, AppKeybinding, AutocompleteProviderFactory, BashToolCallEvent, BashToolResultEvent, BeforeAgentStartEvent, BeforeAgentStartEventResult, BeforeProviderHeadersEvent, BeforeProviderRequestEvent, BeforeProviderRequestEventResult, BuildSystemPromptOptions, CompactOptions, ContextEvent, ContextEventResult, ContextUsage, CustomToolCallEvent, CustomToolResultEvent, EditorFactory, EditToolCallEvent, EditToolResultEvent, EntryRenderer, EntryRenderOptions, ExecOptions, ExecResult, ExecuteToolErrorCode, ExecuteToolHandler, ExecuteToolOptions, ExecuteToolResult, ExecuteToolUpdateCallback, Extension, ExtensionActions, ExtensionAPI, ExtensionCommandContext, ExtensionCommandContextActions, ExtensionContext, ExtensionContextActions, ExtensionError, ExtensionEvent, ExtensionFactory, ExtensionFlag, ExtensionHandler, ExtensionMode, ExtensionRuntime, ExtensionShortcut, ExtensionUIContext, ExtensionUIDialogOptions, ExtensionWidgetOptions, FindToolCallEvent, FindToolResultEvent, GetActiveToolsHandler, GetAllToolsHandler, GetCommandsHandler, GetThinkingLevelHandler, GrepToolCallEvent, GrepToolResultEvent, InlineExtension, InputEvent, InputEventResult, InputSource, KeybindingsManager, LoadExtensionsResult, LsToolCallEvent, LsToolResultEvent, MessageEndEvent, MessageRenderer, MessageRenderOptions, MessageStartEvent, MessageUpdateEvent, ModelSelectEvent, ModelSelectEventResult, ModelSelectSource, ProjectTrustContext, ProjectTrustEvent, ProjectTrustEventDecision, ProjectTrustEventResult, ProjectTrustHandler, ProviderConfig, ProviderModelConfig, ReadToolCallEvent, ReadToolResultEvent, RegisteredCommand, RegisteredTool, ReplacedSessionContext, ResolvedCommand, ResourcesDiscoverEvent, ResourcesDiscoverResult, SendMessageHandler, SendUserMessageHandler, SessionBeforeCompactEvent, SessionBeforeCompactResult, SessionBeforeForkEvent, SessionBeforeForkResult, SessionBeforeSwitchEvent, SessionBeforeSwitchResult, SessionBeforeTreeEvent, SessionBeforeTreeResult, SessionCompactEvent, SessionEvent, SessionInfoChangedEvent, SessionShutdownEvent, SessionStartEvent, SessionTreeEvent, SetActiveToolsHandler, SetLabelHandler, SetModelHandler, SetThinkingLevelHandler, SystemPromptChangeEvent, TerminalInputHandler, ToolCallEvent, ToolCallEventResult, ToolDefinition, ToolExecutionEndEvent, ToolExecutionMode, ToolExecutionStartEvent, ToolExecutionUpdateEvent, ToolInfo, ToolRenderResultOptions, ToolResultEvent, ToolResultEventResult, TreePreparation, TurnEndEvent, TurnStartEvent, UserBashEvent, UserBashEventResult, WidgetPlacement, WorkingIndicatorOptions, WriteToolCallEvent, WriteToolResultEvent, } from "./types.ts";
9
+ export type { AfterProviderResponseEvent, AgentEndEvent, AgentStartEvent, AgentToolResult, AgentToolUpdateCallback, AppendEntryHandler, AppKeybinding, AutocompleteProviderFactory, BashToolCallEvent, BashToolResultEvent, BeforeAgentStartEvent, BeforeAgentStartEventResult, BeforeProviderRequestEvent, BeforeProviderRequestEventResult, BuildSystemPromptOptions, CompactOptions, ContextEvent, ContextEventResult, ContextUsage, CustomToolCallEvent, CustomToolResultEvent, EditorFactory, EditToolCallEvent, EditToolResultEvent, EntryRenderer, EntryRenderOptions, ExecOptions, ExecResult, ExecuteToolErrorCode, ExecuteToolHandler, ExecuteToolOptions, ExecuteToolResult, ExecuteToolUpdateCallback, Extension, ExtensionActions, ExtensionAPI, ExtensionCommandContext, ExtensionCommandContextActions, ExtensionContext, ExtensionContextActions, ExtensionError, ExtensionEvent, ExtensionFactory, ExtensionFlag, ExtensionHandler, ExtensionMode, ExtensionRuntime, ExtensionShortcut, ExtensionUIContext, ExtensionUIDialogOptions, ExtensionWidgetOptions, FindToolCallEvent, FindToolResultEvent, GetActiveToolsHandler, GetAllToolsHandler, GetCommandsHandler, GetThinkingLevelHandler, GrepToolCallEvent, GrepToolResultEvent, InputEvent, InputEventResult, InputSource, KeybindingsManager, LoadExtensionsResult, LsToolCallEvent, LsToolResultEvent, MessageEndEvent, MessageRenderer, MessageRenderOptions, MessageStartEvent, MessageUpdateEvent, ModelSelectEvent, ModelSelectEventResult, ModelSelectSource, ProjectTrustContext, ProjectTrustEvent, ProjectTrustEventDecision, ProjectTrustEventResult, ProjectTrustHandler, ProviderConfig, ProviderModelConfig, ReadToolCallEvent, ReadToolResultEvent, RegisteredCommand, RegisteredTool, ReplacedSessionContext, ResolvedCommand, ResourcesDiscoverEvent, ResourcesDiscoverResult, SendMessageHandler, SendUserMessageHandler, SessionBeforeCompactEvent, SessionBeforeCompactResult, SessionBeforeForkEvent, SessionBeforeForkResult, SessionBeforeSwitchEvent, SessionBeforeSwitchResult, SessionBeforeTreeEvent, SessionBeforeTreeResult, SessionCompactEvent, SessionEvent, SessionInfoChangedEvent, SessionShutdownEvent, SessionStartEvent, SessionTreeEvent, SetActiveToolsHandler, SetLabelHandler, SetModelHandler, SetThinkingLevelHandler, SystemPromptChangeEvent, TerminalInputHandler, ToolCallEvent, ToolCallEventResult, ToolDefinition, ToolExecutionEndEvent, ToolExecutionMode, ToolExecutionStartEvent, ToolExecutionUpdateEvent, ToolInfo, ToolRenderResultOptions, ToolResultEvent, ToolResultEventResult, TreePreparation, TurnEndEvent, TurnStartEvent, UserBashEvent, UserBashEventResult, WidgetPlacement, WorkingIndicatorOptions, WriteToolCallEvent, WriteToolResultEvent, } from "./types.ts";
10
10
  export { defineTool, ExecuteToolError, isBashToolResult, isEditToolResult, isFindToolResult, isGrepToolResult, isLsToolResult, isReadToolResult, isToolCallEventType, isWriteToolResult, } from "./types.ts";
11
11
  export { wrapRegisteredTool, wrapRegisteredTools } from "./wrapper.ts";
12
12
  //# sourceMappingURL=index.d.ts.map