@code-yeongyu/senpi 2026.8.3-3 → 2026.8.4-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/dist/core/agent-session.d.ts +2 -0
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +64 -26
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-directive-dedupe.d.ts +26 -0
  7. package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-directive-dedupe.d.ts.map +1 -0
  8. package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-directive-dedupe.js +98 -0
  9. package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-directive-dedupe.js.map +1 -0
  10. package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.d.ts +4 -0
  11. package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.d.ts.map +1 -1
  12. package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.js +2 -0
  13. package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.js.map +1 -1
  14. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts.map +1 -1
  15. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +11 -2
  16. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -1
  17. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.d.ts.map +1 -1
  18. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js +3 -1
  19. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js.map +1 -1
  20. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +2 -1
  21. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
  22. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +126 -26
  23. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
  24. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  25. package/dist/core/extensions/builtin/compaction/index.js +12 -7
  26. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  27. package/dist/core/extensions/builtin/compaction/per-turn-cap.d.ts.map +1 -1
  28. package/dist/core/extensions/builtin/compaction/per-turn-cap.js +4 -1
  29. package/dist/core/extensions/builtin/compaction/per-turn-cap.js.map +1 -1
  30. package/dist/core/extensions/builtin/compaction/retained-message-safety.d.ts +4 -0
  31. package/dist/core/extensions/builtin/compaction/retained-message-safety.d.ts.map +1 -0
  32. package/dist/core/extensions/builtin/compaction/retained-message-safety.js +155 -0
  33. package/dist/core/extensions/builtin/compaction/retained-message-safety.js.map +1 -0
  34. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  35. package/dist/core/extensions/builtin/compaction/speculative.js +21 -13
  36. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  37. package/dist/core/extensions/builtin/goal/cache-warm-renderer.d.ts.map +1 -1
  38. package/dist/core/extensions/builtin/goal/cache-warm-renderer.js +9 -14
  39. package/dist/core/extensions/builtin/goal/cache-warm-renderer.js.map +1 -1
  40. package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts +1 -0
  41. package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts.map +1 -1
  42. package/dist/core/extensions/builtin/goal/continuation-recovery.js +7 -0
  43. package/dist/core/extensions/builtin/goal/continuation-recovery.js.map +1 -1
  44. package/dist/core/extensions/builtin/goal/continuation.d.ts +1 -1
  45. package/dist/core/extensions/builtin/goal/continuation.js +1 -1
  46. package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
  47. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  48. package/dist/core/extensions/builtin/goal/index.js +12 -10
  49. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  50. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts +7 -1
  51. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -1
  52. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +14 -2
  53. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -1
  54. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
  55. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js +14 -1
  56. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js.map +1 -1
  57. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts +1 -0
  58. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts.map +1 -1
  59. package/dist/core/extensions/builtin/gpt-apply-patch/types.js.map +1 -1
  60. package/dist/core/extensions/builtin/loop-guard/renderer.d.ts.map +1 -1
  61. package/dist/core/extensions/builtin/loop-guard/renderer.js +4 -12
  62. package/dist/core/extensions/builtin/loop-guard/renderer.js.map +1 -1
  63. package/dist/core/extensions/builtin/mcp/expose/schema-compat.js +2 -0
  64. package/dist/core/extensions/builtin/mcp/expose/schema-compat.js.map +1 -1
  65. package/dist/core/extensions/builtin/mcp/service.d.ts +4 -0
  66. package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
  67. package/dist/core/extensions/builtin/mcp/service.js +11 -0
  68. package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
  69. package/dist/core/extensions/builtin/rule-activation/index.d.ts +6 -0
  70. package/dist/core/extensions/builtin/rule-activation/index.d.ts.map +1 -0
  71. package/dist/core/extensions/builtin/rule-activation/index.js +10 -0
  72. package/dist/core/extensions/builtin/rule-activation/index.js.map +1 -0
  73. package/dist/core/extensions/builtin/rule-activation/renderer.d.ts +3 -0
  74. package/dist/core/extensions/builtin/rule-activation/renderer.d.ts.map +1 -0
  75. package/dist/core/extensions/builtin/rule-activation/renderer.js +37 -0
  76. package/dist/core/extensions/builtin/rule-activation/renderer.js.map +1 -0
  77. package/dist/core/extensions/builtin/rule-activation/types.d.ts +15 -0
  78. package/dist/core/extensions/builtin/rule-activation/types.d.ts.map +1 -0
  79. package/dist/core/extensions/builtin/rule-activation/types.js +45 -0
  80. package/dist/core/extensions/builtin/rule-activation/types.js.map +1 -0
  81. package/dist/core/extensions/builtin/rules/index.d.ts.map +1 -1
  82. package/dist/core/extensions/builtin/rules/index.js +12 -3
  83. package/dist/core/extensions/builtin/rules/index.js.map +1 -1
  84. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts +1 -1
  85. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
  86. package/dist/core/extensions/builtin/terminal/monitor-notify.js +14 -6
  87. package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -1
  88. package/dist/core/extensions/builtin/ttsr/detectors/repetitive-turns.d.ts +22 -0
  89. package/dist/core/extensions/builtin/ttsr/detectors/repetitive-turns.d.ts.map +1 -0
  90. package/dist/core/extensions/builtin/ttsr/detectors/repetitive-turns.js +93 -0
  91. package/dist/core/extensions/builtin/ttsr/detectors/repetitive-turns.js.map +1 -0
  92. package/dist/core/extensions/builtin/ttsr/index.d.ts.map +1 -1
  93. package/dist/core/extensions/builtin/ttsr/index.js +60 -21
  94. package/dist/core/extensions/builtin/ttsr/index.js.map +1 -1
  95. package/dist/core/extensions/builtin/ttsr/prompts.d.ts +1 -0
  96. package/dist/core/extensions/builtin/ttsr/prompts.d.ts.map +1 -1
  97. package/dist/core/extensions/builtin/ttsr/prompts.js +5 -0
  98. package/dist/core/extensions/builtin/ttsr/prompts.js.map +1 -1
  99. package/dist/core/extensions/builtin/ttsr/repetitive-turns-lane.d.ts +23 -0
  100. package/dist/core/extensions/builtin/ttsr/repetitive-turns-lane.d.ts.map +1 -0
  101. package/dist/core/extensions/builtin/ttsr/repetitive-turns-lane.js +101 -0
  102. package/dist/core/extensions/builtin/ttsr/repetitive-turns-lane.js.map +1 -0
  103. package/dist/core/extensions/builtin/ttsr/stream-remediation.d.ts +15 -0
  104. package/dist/core/extensions/builtin/ttsr/stream-remediation.d.ts.map +1 -0
  105. package/dist/core/extensions/builtin/ttsr/stream-remediation.js +22 -0
  106. package/dist/core/extensions/builtin/ttsr/stream-remediation.js.map +1 -0
  107. package/dist/core/extensions/builtin/ttsr/types.d.ts +1 -1
  108. package/dist/core/extensions/builtin/ttsr/types.d.ts.map +1 -1
  109. package/dist/core/extensions/builtin/ttsr/types.js.map +1 -1
  110. package/dist/core/extensions/notice/adapters.d.ts +15 -0
  111. package/dist/core/extensions/notice/adapters.d.ts.map +1 -0
  112. package/dist/core/extensions/notice/adapters.js +22 -0
  113. package/dist/core/extensions/notice/adapters.js.map +1 -0
  114. package/dist/core/extensions/notice/box.d.ts +8 -0
  115. package/dist/core/extensions/notice/box.d.ts.map +1 -0
  116. package/dist/core/extensions/notice/box.js +17 -0
  117. package/dist/core/extensions/notice/box.js.map +1 -0
  118. package/dist/core/extensions/notice/index.d.ts +4 -0
  119. package/dist/core/extensions/notice/index.d.ts.map +1 -0
  120. package/dist/core/extensions/notice/index.js +3 -0
  121. package/dist/core/extensions/notice/index.js.map +1 -0
  122. package/dist/core/extensions/notice/spec.d.ts +23 -0
  123. package/dist/core/extensions/notice/spec.d.ts.map +1 -0
  124. package/dist/core/extensions/notice/spec.js +2 -0
  125. package/dist/core/extensions/notice/spec.js.map +1 -0
  126. package/dist/core/retry-fallback/settings.d.ts.map +1 -1
  127. package/dist/core/retry-fallback/settings.js +16 -1
  128. package/dist/core/retry-fallback/settings.js.map +1 -1
  129. package/dist/core/retry-fallback/validate.d.ts.map +1 -1
  130. package/dist/core/retry-fallback/validate.js +15 -2
  131. package/dist/core/retry-fallback/validate.js.map +1 -1
  132. package/dist/core/settings-manager.d.ts +7 -0
  133. package/dist/core/settings-manager.d.ts.map +1 -1
  134. package/dist/core/settings-manager.js +13 -0
  135. package/dist/core/settings-manager.js.map +1 -1
  136. package/dist/modes/interactive/components/continuity-notice.d.ts.map +1 -1
  137. package/dist/modes/interactive/components/continuity-notice.js +29 -2
  138. package/dist/modes/interactive/components/continuity-notice.js.map +1 -1
  139. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  140. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  141. package/dist/modes/interactive/interactive-mode.js +42 -7
  142. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  143. package/dist/modes/interactive/interactive-stderr-guard.d.ts.map +1 -1
  144. package/dist/modes/interactive/interactive-stderr-guard.js +37 -0
  145. package/dist/modes/interactive/interactive-stderr-guard.js.map +1 -1
  146. package/docs/providers.md +10 -0
  147. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +28 -0
  148. package/node_modules/@code-yeongyu/senpi-codemode/README.md +13 -3
  149. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  150. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-status.ts +1 -1
  151. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +6 -6
  152. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-runtime.ts +4 -4
  153. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +2 -2
  154. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-snapshot.ts +2 -2
  155. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-request.ts +20 -2
  156. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +17 -2
  157. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +18 -7
  158. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +19 -5
  159. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  160. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +2 -2
  161. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  162. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  163. package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
  164. package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
  165. package/node_modules/@earendil-works/pi-ai/dist/providers/data/groq.json +1 -1
  166. package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
  167. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  168. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  169. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan-cn.json +1 -1
  170. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
  171. package/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -1
  172. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  173. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  174. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  175. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"schema-compat.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/schema-compat.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport { type TSchema, Type } from \"typebox\";\nimport { buildMcpToolName, buildMcpToolNames, type McpToolNameEntry } from \"./naming.ts\";\nimport { collectAllPages, type McpListPage, type McpPaginationResult } from \"./pagination.ts\";\n\nexport type { McpListPage, McpPaginationResult, McpToolNameEntry };\nexport { buildMcpToolName, buildMcpToolNames, collectAllPages };\n\ninterface SchemaConversionResult {\n\tschema: TSchema;\n\twarnings: string[];\n}\n\ninterface OutputSchemaRetryResult {\n\tschema: Record<string, unknown>;\n\twarnings: string[];\n}\n\nexport type McpContentBlock =\n\t| { type: \"text\"; text?: unknown }\n\t| { type: \"image\"; data?: unknown; mimeType?: unknown }\n\t| { type: \"audio\"; data?: unknown; mimeType?: unknown }\n\t| { type: \"resource\"; resource?: unknown }\n\t| { type: \"resource_link\"; uri?: unknown; name?: unknown; description?: unknown; mimeType?: unknown }\n\t| Record<string, unknown>;\n\nexport type McpMappedContentBlock =\n\t| TextContent\n\t| ImageContent\n\t| { type: \"audio\"; data: string; mimeType: string }\n\t| { type: \"resource\"; resource: unknown }\n\t| { type: \"resource_link\"; uri: string; name?: string; description?: string; mimeType?: string };\n\nexport interface McpToolResultLike {\n\tcontent?: McpContentBlock[];\n\tstructuredContent?: unknown;\n\tisError?: boolean;\n}\n\nexport type McpMappedToolResult =\n\t| { ok: true; content: McpMappedContentBlock[] }\n\t| { ok: false; error: { message: string; content: McpMappedContentBlock[] } };\n\nconst PERMISSIVE_OBJECT_SCHEMA = { type: \"object\", properties: {} } as const;\n\nexport function convertJsonSchemaToTypeBox(schema: unknown): SchemaConversionResult {\n\tconst warnings: string[] = [];\n\tconst resolved = resolveRefs(stripTopLevelSchemaKeys(schema), schema, new Set<string>(), warnings);\n\tif (warnings.length > 0) {\n\t\treturn { schema: Type.Unsafe<unknown>({ ...PERMISSIVE_OBJECT_SCHEMA }), warnings };\n\t}\n\tif (!isRecord(resolved)) {\n\t\treturn {\n\t\t\tschema: Type.Unsafe<unknown>({ ...PERMISSIVE_OBJECT_SCHEMA }),\n\t\t\twarnings: [\"MCP schema is not an object; using permissive object schema.\"],\n\t\t};\n\t}\n\treturn { schema: Type.Unsafe<unknown>(resolved), warnings };\n}\n\nexport function prepareOutputSchemaRetry(schema: unknown): OutputSchemaRetryResult {\n\tconst warnings: string[] = [];\n\tconst record: Record<string, unknown> = isRecord(schema) ? { ...schema } : { ...PERMISSIVE_OBJECT_SCHEMA };\n\tif (hasOwn(record, \"$schema\")) {\n\t\tdelete record.$schema;\n\t\twarnings.push(\"Stripped top-level $schema from MCP outputSchema retry.\");\n\t}\n\tif (hasOwn(record, \"additionalProperties\")) {\n\t\tdelete record.additionalProperties;\n\t\twarnings.push(\"Stripped top-level additionalProperties from MCP outputSchema retry.\");\n\t}\n\treturn { schema: record, warnings };\n}\n\nexport function mapMcpToolResult(result: McpToolResultLike): McpMappedToolResult {\n\tconst content = mapMcpContent(result);\n\tif (result.isError === true) {\n\t\treturn { ok: false, error: { message: contentToErrorMessage(content), content } };\n\t}\n\treturn { ok: true, content };\n}\n\nfunction mapMcpContent(result: McpToolResultLike): McpMappedContentBlock[] {\n\tconst content: McpMappedContentBlock[] = [];\n\tfor (const block of result.content ?? []) {\n\t\tcontent.push(mapContentBlock(block));\n\t}\n\tif (result.structuredContent !== undefined) {\n\t\tcontent.push({ type: \"text\", text: stringifyJson(result.structuredContent) });\n\t}\n\tif (content.length === 0) {\n\t\tcontent.push({ type: \"text\", text: \"(empty result)\" });\n\t}\n\treturn content;\n}\n\nfunction mapContentBlock(block: McpContentBlock): McpMappedContentBlock {\n\tif (block.type === \"text\") {\n\t\treturn { type: \"text\", text: typeof block.text === \"string\" ? block.text : stringifyJson(block.text) };\n\t}\n\tif (block.type === \"image\" && typeof block.data === \"string\" && typeof block.mimeType === \"string\") {\n\t\treturn { type: \"image\", data: block.data, mimeType: block.mimeType };\n\t}\n\tif (block.type === \"audio\" && typeof block.data === \"string\" && typeof block.mimeType === \"string\") {\n\t\treturn { type: \"audio\", data: block.data, mimeType: block.mimeType };\n\t}\n\tif (block.type === \"resource\" && hasOwn(block, \"resource\")) {\n\t\treturn { type: \"resource\", resource: block.resource };\n\t}\n\tif (block.type === \"resource_link\" && typeof block.uri === \"string\") {\n\t\treturn {\n\t\t\ttype: \"resource_link\",\n\t\t\turi: block.uri,\n\t\t\t...(typeof block.name === \"string\" ? { name: block.name } : {}),\n\t\t\t...(typeof block.description === \"string\" ? { description: block.description } : {}),\n\t\t\t...(typeof block.mimeType === \"string\" ? { mimeType: block.mimeType } : {}),\n\t\t};\n\t}\n\treturn { type: \"text\", text: stringifyJson(block) };\n}\n\nfunction contentToErrorMessage(content: readonly McpMappedContentBlock[]): string {\n\tconst firstText = content.find((block): block is TextContent => block.type === \"text\");\n\treturn firstText?.text.trim() || \"MCP tool returned an error result.\";\n}\n\nfunction stripTopLevelSchemaKeys(schema: unknown): unknown {\n\tif (!isRecord(schema)) return schema;\n\tconst result = { ...schema };\n\tdelete result.$schema;\n\tdelete result.additionalProperties;\n\treturn result;\n}\n\nfunction resolveRefs(value: unknown, root: unknown, seenRefs: Set<string>, warnings: string[]): unknown {\n\tif (Array.isArray(value)) {\n\t\treturn value.map((entry) => resolveRefs(entry, root, seenRefs, warnings));\n\t}\n\tif (!isRecord(value)) return value;\n\n\tif (typeof value.$ref === \"string\") {\n\t\tconst ref = value.$ref;\n\t\tconst resolved = resolveLocalRef(root, ref);\n\t\tif (resolved === undefined || seenRefs.has(ref)) {\n\t\t\twarnings.push(`MCP schema contains unresolvable $ref '${ref}'; using permissive object schema.`);\n\t\t\treturn { ...PERMISSIVE_OBJECT_SCHEMA };\n\t\t}\n\t\tconst nextSeenRefs = new Set(seenRefs);\n\t\tnextSeenRefs.add(ref);\n\t\treturn resolveRefs(resolved, root, nextSeenRefs, warnings);\n\t}\n\n\tconst result: Record<string, unknown> = {};\n\tfor (const [key, child] of Object.entries(value)) {\n\t\tresult[key] = resolveRefs(child, root, seenRefs, warnings);\n\t}\n\treturn result;\n}\n\nfunction resolveLocalRef(root: unknown, ref: string): unknown {\n\tif (!ref.startsWith(\"#/\")) return undefined;\n\tlet current: unknown = root;\n\tfor (const part of ref\n\t\t.slice(2)\n\t\t.split(\"/\")\n\t\t.map((segment) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))) {\n\t\tif (!isRecord(current) || !(part in current)) return undefined;\n\t\tcurrent = current[part];\n\t}\n\treturn current;\n}\n\nfunction stringifyJson(value: unknown): string {\n\tconst text = JSON.stringify(value);\n\treturn text ?? String(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasOwn(value: Record<string, unknown>, key: string): boolean {\n\treturn Object.getOwnPropertyDescriptor(value, key) !== undefined;\n}\n"]}
1
+ {"version":3,"file":"schema-compat.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/schema-compat.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport { type TSchema, Type } from \"typebox\";\nimport { buildMcpToolName, buildMcpToolNames, type McpToolNameEntry } from \"./naming.ts\";\nimport { collectAllPages, type McpListPage, type McpPaginationResult } from \"./pagination.ts\";\n\nexport type { McpListPage, McpPaginationResult, McpToolNameEntry };\nexport { buildMcpToolName, buildMcpToolNames, collectAllPages };\n\ninterface SchemaConversionResult {\n\tschema: TSchema;\n\twarnings: string[];\n}\n\ninterface OutputSchemaRetryResult {\n\tschema: Record<string, unknown>;\n\twarnings: string[];\n}\n\nexport type McpContentBlock =\n\t| { type: \"text\"; text?: unknown }\n\t| { type: \"image\"; data?: unknown; mimeType?: unknown }\n\t| { type: \"audio\"; data?: unknown; mimeType?: unknown }\n\t| { type: \"resource\"; resource?: unknown }\n\t| { type: \"resource_link\"; uri?: unknown; name?: unknown; description?: unknown; mimeType?: unknown }\n\t| Record<string, unknown>;\n\nexport type McpMappedContentBlock =\n\t| TextContent\n\t| ImageContent\n\t| { type: \"audio\"; data: string; mimeType: string }\n\t| { type: \"resource\"; resource: unknown }\n\t| { type: \"resource_link\"; uri: string; name?: string; description?: string; mimeType?: string };\n\nexport interface McpToolResultLike {\n\tcontent?: McpContentBlock[];\n\tstructuredContent?: unknown;\n\tisError?: boolean;\n}\n\nexport type McpMappedToolResult =\n\t| { ok: true; content: McpMappedContentBlock[] }\n\t| { ok: false; error: { message: string; content: McpMappedContentBlock[] } };\n\nconst PERMISSIVE_OBJECT_SCHEMA = { type: \"object\", properties: {} } as const;\n\nexport function convertJsonSchemaToTypeBox(schema: unknown): SchemaConversionResult {\n\tconst warnings: string[] = [];\n\tconst resolved = resolveRefs(stripTopLevelSchemaKeys(schema), schema, new Set<string>(), warnings);\n\tif (warnings.length > 0) {\n\t\treturn { schema: Type.Unsafe<unknown>({ ...PERMISSIVE_OBJECT_SCHEMA }), warnings };\n\t}\n\tif (!isRecord(resolved)) {\n\t\treturn {\n\t\t\tschema: Type.Unsafe<unknown>({ ...PERMISSIVE_OBJECT_SCHEMA }),\n\t\t\twarnings: [\"MCP schema is not an object; using permissive object schema.\"],\n\t\t};\n\t}\n\treturn { schema: Type.Unsafe<unknown>(resolved), warnings };\n}\n\nexport function prepareOutputSchemaRetry(schema: unknown): OutputSchemaRetryResult {\n\tconst warnings: string[] = [];\n\tconst record: Record<string, unknown> = isRecord(schema) ? { ...schema } : { ...PERMISSIVE_OBJECT_SCHEMA };\n\tif (hasOwn(record, \"$schema\")) {\n\t\tdelete record.$schema;\n\t\twarnings.push(\"Stripped top-level $schema from MCP outputSchema retry.\");\n\t}\n\tif (hasOwn(record, \"additionalProperties\")) {\n\t\tdelete record.additionalProperties;\n\t\twarnings.push(\"Stripped top-level additionalProperties from MCP outputSchema retry.\");\n\t}\n\treturn { schema: record, warnings };\n}\n\nexport function mapMcpToolResult(result: McpToolResultLike): McpMappedToolResult {\n\tconst content = mapMcpContent(result);\n\tif (result.isError === true) {\n\t\treturn { ok: false, error: { message: contentToErrorMessage(content), content } };\n\t}\n\treturn { ok: true, content };\n}\n\nfunction mapMcpContent(result: McpToolResultLike): McpMappedContentBlock[] {\n\tconst content: McpMappedContentBlock[] = [];\n\tfor (const block of result.content ?? []) {\n\t\tcontent.push(mapContentBlock(block));\n\t}\n\tif (result.structuredContent !== undefined) {\n\t\tcontent.push({ type: \"text\", text: stringifyJson(result.structuredContent) });\n\t}\n\tif (content.length === 0) {\n\t\tcontent.push({ type: \"text\", text: \"(empty result)\" });\n\t}\n\treturn content;\n}\n\nfunction mapContentBlock(block: McpContentBlock): McpMappedContentBlock {\n\tif (block.type === \"text\") {\n\t\treturn { type: \"text\", text: typeof block.text === \"string\" ? block.text : stringifyJson(block.text) };\n\t}\n\tif (block.type === \"image\" && typeof block.data === \"string\" && typeof block.mimeType === \"string\") {\n\t\treturn { type: \"image\", data: block.data, mimeType: block.mimeType };\n\t}\n\tif (block.type === \"audio\" && typeof block.data === \"string\" && typeof block.mimeType === \"string\") {\n\t\treturn { type: \"audio\", data: block.data, mimeType: block.mimeType };\n\t}\n\tif (block.type === \"resource\" && hasOwn(block, \"resource\")) {\n\t\treturn { type: \"resource\", resource: block.resource };\n\t}\n\tif (block.type === \"resource_link\" && typeof block.uri === \"string\") {\n\t\treturn {\n\t\t\ttype: \"resource_link\",\n\t\t\turi: block.uri,\n\t\t\t...(typeof block.name === \"string\" ? { name: block.name } : {}),\n\t\t\t...(typeof block.description === \"string\" ? { description: block.description } : {}),\n\t\t\t...(typeof block.mimeType === \"string\" ? { mimeType: block.mimeType } : {}),\n\t\t};\n\t}\n\treturn { type: \"text\", text: stringifyJson(block) };\n}\n\nfunction contentToErrorMessage(content: readonly McpMappedContentBlock[]): string {\n\tconst firstText = content.find((block): block is TextContent => block.type === \"text\");\n\treturn firstText?.text.trim() || \"MCP tool returned an error result.\";\n}\n\nfunction stripTopLevelSchemaKeys(schema: unknown): unknown {\n\tif (!isRecord(schema)) return schema;\n\tconst result = { ...schema };\n\tdelete result.$schema;\n\tdelete result.additionalProperties;\n\treturn result;\n}\n\nfunction resolveRefs(value: unknown, root: unknown, seenRefs: Set<string>, warnings: string[]): unknown {\n\tif (Array.isArray(value)) {\n\t\treturn value.map((entry) => resolveRefs(entry, root, seenRefs, warnings));\n\t}\n\tif (!isRecord(value)) return value;\n\n\tif (typeof value.$ref === \"string\") {\n\t\tconst ref = value.$ref;\n\t\tconst resolved = resolveLocalRef(root, ref);\n\t\tif (resolved === undefined || seenRefs.has(ref)) {\n\t\t\twarnings.push(`MCP schema contains unresolvable $ref '${ref}'; using permissive object schema.`);\n\t\t\treturn { ...PERMISSIVE_OBJECT_SCHEMA };\n\t\t}\n\t\tconst nextSeenRefs = new Set(seenRefs);\n\t\tnextSeenRefs.add(ref);\n\t\treturn resolveRefs(resolved, root, nextSeenRefs, warnings);\n\t}\n\n\tconst result: Record<string, unknown> = {};\n\tfor (const [key, child] of Object.entries(value)) {\n\t\tif (key === \"type\" && child === null) continue;\n\t\tresult[key] = resolveRefs(child, root, seenRefs, warnings);\n\t}\n\treturn result;\n}\n\nfunction resolveLocalRef(root: unknown, ref: string): unknown {\n\tif (!ref.startsWith(\"#/\")) return undefined;\n\tlet current: unknown = root;\n\tfor (const part of ref\n\t\t.slice(2)\n\t\t.split(\"/\")\n\t\t.map((segment) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))) {\n\t\tif (!isRecord(current) || !(part in current)) return undefined;\n\t\tcurrent = current[part];\n\t}\n\treturn current;\n}\n\nfunction stringifyJson(value: unknown): string {\n\tconst text = JSON.stringify(value);\n\treturn text ?? String(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasOwn(value: Record<string, unknown>, key: string): boolean {\n\treturn Object.getOwnPropertyDescriptor(value, key) !== undefined;\n}\n"]}
@@ -33,6 +33,10 @@ export declare class McpService {
33
33
  getMcpPromptServers(): readonly import("./prompts.ts").McpPromptServer[];
34
34
  /** Connected servers that list resources (todo 39), for mention expansion. */
35
35
  getMcpResourceServers(): readonly McpResourceServer[];
36
+ /** Subscribe to completed catalog registrations. Consumers must inspect the
37
+ * resulting snapshot because tool, resource, and prompt catalogs can become
38
+ * available in different startup-race generations. */
39
+ onMcpRegistrationChanged(listener: () => void): () => void;
36
40
  /** Reveal skill-owned tools (todo 37): activation is effective the next
37
41
  * turn, exactly like an tool_search promotion. Unknown names are ignored. */
38
42
  activateSkillMcpTools(names: readonly string[]): void;
@@ -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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"}
@@ -33,6 +33,7 @@ export class McpService {
33
33
  #pendingAuth = new Map();
34
34
  #interactiveAuthServers = new Set();
35
35
  #promptCommandNames = new Set();
36
+ #registrationListeners = new Set();
36
37
  #refreshActiveSetWhenNoTools = false;
37
38
  #tierBRegistration;
38
39
  #historyScanned = false;
@@ -129,6 +130,13 @@ export class McpService {
129
130
  getMcpResourceServers() {
130
131
  return this.#tierBRegistration?.resourceServers ?? [];
131
132
  }
133
+ /** Subscribe to completed catalog registrations. Consumers must inspect the
134
+ * resulting snapshot because tool, resource, and prompt catalogs can become
135
+ * available in different startup-race generations. */
136
+ onMcpRegistrationChanged(listener) {
137
+ this.#registrationListeners.add(listener);
138
+ return () => this.#registrationListeners.delete(listener);
139
+ }
132
140
  /** Reveal skill-owned tools (todo 37): activation is effective the next
133
141
  * turn, exactly like an tool_search promotion. Unknown names are ignored. */
134
142
  activateSkillMcpTools(names) {
@@ -157,6 +165,7 @@ export class McpService {
157
165
  this.#pendingAuth.clear();
158
166
  this.#interactiveAuthServers.clear();
159
167
  this.#promptCommandNames.clear();
168
+ this.#registrationListeners.clear();
160
169
  this.#wireStatusBySession.clear();
161
170
  this.#latestWireStatus = { servers: [] };
162
171
  const entries = [...this.#connections.values()];
@@ -386,6 +395,8 @@ export class McpService {
386
395
  this.#tierBRegistration = await registerMcpServiceDirectTools(pi, config, this.#connections.values(), {
387
396
  refreshActiveSetWhenEmpty: this.#refreshActiveSetWhenNoTools,
388
397
  });
398
+ for (const listener of this.#registrationListeners)
399
+ listener();
389
400
  // A (re-)registration recomputes the active set from config alone, so any
390
401
  // promotions recorded in history are worth replaying on the next scan.
391
402
  this.#historyScanned = false;
@@ -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 { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { ExtensionAPI, ExtensionUIContext, SessionShutdownEvent, SessionStartEvent } from \"../../types.ts\";\nimport { detectLiteralBearerWarnings, resolveAuthMode, resolveServerAuth } from \"./auth/context.ts\";\nimport { collectToolCatalog } from \"./catalog.ts\";\nimport { getValidCachedServer, readMcpCatalogCache } from \"./catalog-cache.ts\";\nimport { loadMcpConfig, mergeExtensionMcpServers, resolveSkillMcpServer, visitSpawnableMcpServers } from \"./config.ts\";\nimport type { McpServerConfig, ResolvedMcpConfig, ResolvedMcpServer } from \"./config-schema.ts\";\nimport { ServerConnection } from \"./connection.ts\";\nimport { collectAllPages } from \"./expose/pagination.ts\";\nimport { mapMcpCatalogNames } from \"./expose/register.ts\";\nimport type { McpSessionRegistration } from \"./expose/session.ts\";\nimport type { McpServerExposureStatus } from \"./expose/status.ts\";\nimport { cleanupMcpOutputArtifacts, McpOutputArtifacts } from \"./guard/output-guard.ts\";\nimport { markMcpConnectionNeedsAuth } from \"./health.ts\";\nimport { configureMcpConnectionLifecycle, disposeMcpConnectionLifecycle } from \"./idle.ts\";\nimport { refreshMcpInstructionsForSession } from \"./instructions.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\tMcpWireAuthStatus,\n\tMcpWireJsonValue,\n\tMcpWireResource,\n\tMcpWireResourceTemplate,\n\tMcpWireServerInfo,\n\tMcpWireStatusServer,\n\tMcpWireStatusSnapshot,\n\tMcpWireTool,\n} from \"./service-types.ts\";\nimport {\n\tconnectAndRefreshMcpCatalog,\n\traceMcpStartupConnect,\n\tresolveMcpStartupTimeoutMs,\n\tshouldRaceMcpStartup,\n} from \"./startup-race.ts\";\n\ntype ListedTool = Awaited<ReturnType<Client[\"listTools\"]>>[\"tools\"][number];\ntype ListedResource = Awaited<ReturnType<Client[\"listResources\"]>>[\"resources\"][number];\ntype ListedResourceTemplate = Awaited<ReturnType<Client[\"listResourceTemplates\"]>>[\"resourceTemplates\"][number];\ntype McpElicitationUi = Pick<ExtensionUIContext, \"input\" | \"select\" | \"confirm\">;\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\t#elicitationUiProvider: (() => McpElicitationUi | undefined) | undefined;\n\t#mcpInstructions = \"\";\n\treadonly #pendingAuth = new Map<string, import(\"./auth/oauth-provider.ts\").McpOAuthProvider>();\n\treadonly #interactiveAuthServers = new Set<string>();\n\treadonly #promptCommandNames = new Set<string>();\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\t#attachQueue: Promise<void> = Promise.resolve();\n\t#latestWireStatus: McpWireStatusSnapshot = { servers: [] };\n\treadonly #wireStatusBySession = new Map<string, McpWireStatusSnapshot>();\n\treadonly #connections = new Map<string, McpConnectionEntry>();\n\treadonly #connectionKeysByName = new Map<string, string>();\n\treadonly #outputArtifacts = new McpOutputArtifacts();\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\tconst attach = this.#attachQueue.then(async () => {\n\t\t\tthis.#sessionContext = ctx;\n\t\t\tthis.#sessionStartCount += 1;\n\t\t\tthis.#lastSessionStartReason = event.reason;\n\t\t\tconst config = loadMcpConfig({\n\t\t\t\tagentDir: options.agentDir,\n\t\t\t\tcwd: ctx.cwd,\n\t\t\t\tenv: options.env,\n\t\t\t\tprojectTrusted: options.projectTrusted ?? ctx.isProjectTrusted(),\n\t\t\t});\n\t\t\tmergeExtensionMcpServers(config, ctx.getRegisteredMcpServers?.() ?? []);\n\t\t\tthis.#config = config;\n\t\t\tthis.#pi = _pi;\n\t\t\tthis.#authAgentDir = options.agentDir;\n\t\t\tthis.#authEnv = options.env;\n\t\t\tthis.#sessionOptions = options;\n\t\t\tconst toolRefreshGeneration = this.#toolRefreshGeneration + 1;\n\t\t\tthis.#toolRefreshGeneration = toolRefreshGeneration;\n\t\t\tawait this.#syncFromConfig(config, options, event.reason !== \"reload\", _pi, toolRefreshGeneration);\n\t\t\tif (_pi !== undefined) await this.#registerDirectTools(_pi);\n\t\t\t// Replay promotion markers from the (possibly resumed) session history\n\t\t\t// BEFORE the first turn: the request tool snapshot is taken before the\n\t\t\t// per-turn context event fires, so the context-event replay alone lands\n\t\t\t// one turn late. Doing it here puts restored tools on the very first\n\t\t\t// wire payload after a --continue/resume.\n\t\t\tif (_pi !== undefined) this.#rehydrateFromSessionHistory(ctx);\n\t\t\tif (shouldCaptureWireStatus(ctx)) await this.#captureWireStatus(ctx.sessionManager?.getSessionId?.());\n\t\t});\n\t\tthis.#attachQueue = attach.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\tawait attach;\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\tif (this.#sessionContext !== null && shouldCaptureWireStatus(this.#sessionContext)) {\n\t\t\t\tawait this.#captureWireStatus(this.#sessionContext.sessionManager?.getSessionId?.());\n\t\t\t}\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 tool_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\tthis.#elicitationUiProvider = undefined;\n\t\tthis.#mcpInstructions = \"\";\n\t\tthis.#pendingAuth.clear();\n\t\tthis.#interactiveAuthServers.clear();\n\t\tthis.#promptCommandNames.clear();\n\t\tthis.#wireStatusBySession.clear();\n\t\tthis.#latestWireStatus = { servers: [] };\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(this.#outputArtifacts);\n\t}\n\n\tgetMcpOutputArtifacts(): McpOutputArtifacts {\n\t\treturn this.#outputArtifacts;\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\t/**\n\t * Return the attach-time inventory captured for one session. This is the\n\t * handoff consumed by the app-server's session-owned adapter; it deliberately\n\t * does not expose or derive from the lifecycle-only server snapshots.\n\t */\n\tgetWireStatusSnapshot(sessionId?: string): McpWireStatusSnapshot {\n\t\treturn sessionId === undefined\n\t\t\t? this.#latestWireStatus\n\t\t\t: (this.#wireStatusBySession.get(sessionId) ?? { servers: [] });\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\telicitationUiProvider: () => this.getMcpElicitationUi(),\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\tartifacts: this.#outputArtifacts,\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\t// Every startup connect is bounded by the startup race and continues in\n\t\t\t// the background past the deadline (eager/keep-alive always; a cold lazy\n\t\t\t// server that has no cached catalog also races so a slow/wedged server\n\t\t\t// never gates attachSession -> before_agent_start -> the first turn).\n\t\t\t// A cached lazy server needs no startup connect: its tools come from the\n\t\t\t// cache and it connects on demand at tool-call time.\n\t\t\tif (shouldRaceMcpStartup(server.config.lifecycle) || cachedCatalog === undefined) {\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: async (targetPi) => {\n\t\t\t\t\t\t\tawait this.#registerDirectTools(targetPi);\n\t\t\t\t\t\t\t// A raced attach ran its history replay before this catalog\n\t\t\t\t\t\t\t// existed; replay now so restored tools still land on the\n\t\t\t\t\t\t\t// first turn's payload (idempotent: already-active names skip).\n\t\t\t\t\t\t\tif (this.#sessionContext !== null) this.#rehydrateFromSessionHistory(this.#sessionContext);\n\t\t\t\t\t\t\t// The session instructions block was likewise captured at attach\n\t\t\t\t\t\t\t// time, before this server connected; rebuild it so the first\n\t\t\t\t\t\t\t// turn carries this server's instructions after a raced connect.\n\t\t\t\t\t\t\trefreshMcpInstructionsForSession(this);\n\t\t\t\t\t\t},\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\tdeadlineMs: resolveMcpStartupTimeoutMs(server.config.startupTimeoutMs),\n\t\t\t\t\t}),\n\t\t\t\t);\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 tool_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\tasync #captureWireStatus(sessionId: string | undefined): Promise<void> {\n\t\tconst config = this.#config;\n\t\tif (config === null) return;\n\t\tconst servers = await Promise.all(\n\t\t\tObject.keys(config.servers)\n\t\t\t\t.sort()\n\t\t\t\t.map((name) => this.#captureWireStatusServer(name, config.servers[name])),\n\t\t);\n\t\tconst snapshot: McpWireStatusSnapshot = { servers };\n\t\tthis.#latestWireStatus = snapshot;\n\t\tif (sessionId !== undefined) this.#wireStatusBySession.set(sessionId, snapshot);\n\t}\n\n\tasync #captureWireStatusServer(name: string, server: ResolvedMcpServer | undefined): Promise<McpWireStatusServer> {\n\t\tconst entry = this.#entryForName(name);\n\t\tconst connection = entry?.connection;\n\t\tconst connected = connection?.state === \"connected\";\n\t\tconst cached = entry?.cachedCatalog;\n\t\tlet tools = cached?.tools ?? [];\n\t\tlet resources = cached?.resources ?? [];\n\t\tlet resourceTemplates: ListedResourceTemplate[] = [];\n\t\tlet serverInfo: McpWireServerInfo | null = null;\n\n\t\tif (connected && connection !== undefined) {\n\t\t\tconst client = connection.client;\n\t\t\tconst version = client.getServerVersion();\n\t\t\tif (version !== undefined) serverInfo = mapWireServerInfo(version);\n\t\t\tif (cached === undefined) {\n\t\t\t\ttry {\n\t\t\t\t\ttools = (\n\t\t\t\t\t\tawait collectAllPages<ListedTool>((cursor) =>\n\t\t\t\t\t\t\tclient.listTools(cursor === undefined ? {} : { cursor }),\n\t\t\t\t\t\t)\n\t\t\t\t\t).items;\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tif (!(error instanceof Error)) throw error;\n\t\t\t\t\ttools = [];\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tresources = (\n\t\t\t\t\t\tawait collectAllPages<ListedResource>((cursor) =>\n\t\t\t\t\t\t\tclient.listResources(cursor === undefined ? {} : { cursor }),\n\t\t\t\t\t\t)\n\t\t\t\t\t).items;\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tif (!(error instanceof Error)) throw error;\n\t\t\t\t\tresources = [];\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tresourceTemplates = (\n\t\t\t\t\tawait collectAllPages<ListedResourceTemplate>((cursor) =>\n\t\t\t\t\t\tclient.listResourceTemplates(cursor === undefined ? {} : { cursor }),\n\t\t\t\t\t)\n\t\t\t\t).items;\n\t\t\t} catch (error: unknown) {\n\t\t\t\tif (!(error instanceof Error)) throw error;\n\t\t\t\tresourceTemplates = [];\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tname,\n\t\t\tserverInfo,\n\t\t\ttools: tools.map(mapWireTool),\n\t\t\tresources: resources.map(mapWireResource),\n\t\t\tresourceTemplates: resourceTemplates.map(mapWireResourceTemplate),\n\t\t\tauthStatus: wireAuthStatus(entry, server),\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\tsetMcpInstructions(instructions: string): void {\n\t\tthis.#mcpInstructions = instructions;\n\t}\n\n\tgetMcpInstructions(): string {\n\t\treturn this.#mcpInstructions;\n\t}\n\n\tsetMcpElicitationUiProvider(provider: (() => McpElicitationUi | undefined) | undefined): void {\n\t\tthis.#elicitationUiProvider = provider;\n\t}\n\n\tgetMcpElicitationUi(): McpElicitationUi | undefined {\n\t\treturn this.#elicitationUiProvider?.();\n\t}\n\n\tisMcpPromptCommandRegistered(name: string): boolean {\n\t\treturn this.#promptCommandNames.has(name);\n\t}\n\n\tmarkMcpPromptCommandRegistered(name: string): void {\n\t\tthis.#promptCommandNames.add(name);\n\t}\n\n\tbeginInteractiveAuth(serverName: string): boolean {\n\t\tif (this.#interactiveAuthServers.has(serverName)) return false;\n\t\tthis.#interactiveAuthServers.add(serverName);\n\t\treturn true;\n\t}\n\n\tendInteractiveAuth(serverName: string): void {\n\t\tthis.#interactiveAuthServers.delete(serverName);\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\nfunction wireAuthStatus(\n\tentry: McpConnectionEntry | undefined,\n\tserver: ResolvedMcpServer | undefined,\n): McpWireAuthStatus {\n\tconst mode = entry?.authPlan?.mode ?? (server?.config === undefined ? \"none\" : resolveAuthMode(server.config));\n\tswitch (mode) {\n\t\tcase \"none\":\n\t\t\treturn \"unsupported\";\n\t\tcase \"bearer\":\n\t\t\treturn entry?.connection.state === \"needs_auth\" ? \"notLoggedIn\" : \"bearerToken\";\n\t\tcase \"oauth\":\n\t\t\treturn entry?.authPlan?.provider?.tokens() === undefined ? \"notLoggedIn\" : \"oAuth\";\n\t\tdefault:\n\t\t\treturn assertNever(mode);\n\t}\n}\n\nfunction shouldCaptureWireStatus(ctx: McpSessionContext): boolean {\n\treturn ctx.mode === \"app-server\";\n}\n\nfunction mapWireServerInfo(info: NonNullable<ReturnType<Client[\"getServerVersion\"]>>): McpWireServerInfo {\n\treturn {\n\t\tname: info.name,\n\t\ttitle: info.title ?? null,\n\t\tversion: info.version,\n\t\tdescription: info.description ?? null,\n\t\ticons: info.icons?.map(toWireJsonValue) ?? null,\n\t\twebsiteUrl: info.websiteUrl ?? null,\n\t};\n}\n\nfunction mapWireTool(tool: ListedTool): McpWireTool {\n\treturn {\n\t\tname: tool.name,\n\t\t...(tool.title === undefined ? {} : { title: tool.title }),\n\t\t...(tool.description === undefined ? {} : { description: tool.description }),\n\t\tinputSchema: toWireJsonValue(tool.inputSchema),\n\t\t...(tool.outputSchema === undefined ? {} : { outputSchema: toWireJsonValue(tool.outputSchema) }),\n\t\t...(tool.annotations === undefined ? {} : { annotations: toWireJsonValue(tool.annotations) }),\n\t\t...(tool.icons === undefined ? {} : { icons: tool.icons.map(toWireJsonValue) }),\n\t\t...(tool._meta === undefined ? {} : { _meta: toWireJsonValue(tool._meta) }),\n\t};\n}\n\nfunction mapWireResource(resource: ListedResource): McpWireResource {\n\treturn {\n\t\turi: resource.uri,\n\t\tname: resource.name,\n\t\t...(resource.title === undefined ? {} : { title: resource.title }),\n\t\t...(resource.description === undefined ? {} : { description: resource.description }),\n\t\t...(resource.mimeType === undefined ? {} : { mimeType: resource.mimeType }),\n\t\t...(resource.size === undefined ? {} : { size: resource.size }),\n\t\t...(resource.annotations === undefined ? {} : { annotations: toWireJsonValue(resource.annotations) }),\n\t\t...(resource.icons === undefined ? {} : { icons: resource.icons.map(toWireJsonValue) }),\n\t\t...(resource._meta === undefined ? {} : { _meta: toWireJsonValue(resource._meta) }),\n\t};\n}\n\nfunction mapWireResourceTemplate(template: ListedResourceTemplate): McpWireResourceTemplate {\n\treturn {\n\t\turiTemplate: template.uriTemplate,\n\t\tname: template.name,\n\t\t...(template.title === undefined ? {} : { title: template.title }),\n\t\t...(template.description === undefined ? {} : { description: template.description }),\n\t\t...(template.mimeType === undefined ? {} : { mimeType: template.mimeType }),\n\t\t...(template.annotations === undefined ? {} : { annotations: toWireJsonValue(template.annotations) }),\n\t\t...(template.icons === undefined ? {} : { icons: template.icons.map(toWireJsonValue) }),\n\t\t...(template._meta === undefined ? {} : { _meta: toWireJsonValue(template._meta) }),\n\t};\n}\n\nfunction toWireJsonValue(value: unknown): McpWireJsonValue {\n\tif (value === null || typeof value === \"boolean\" || typeof value === \"number\" || typeof value === \"string\") {\n\t\treturn value;\n\t}\n\tif (Array.isArray(value)) return value.map(toWireJsonValue);\n\tif (isRecord(value)) {\n\t\tconst object: Record<string, McpWireJsonValue | undefined> = {};\n\t\tfor (const [key, child] of Object.entries(value)) object[key] = toWireJsonValue(child);\n\t\treturn object;\n\t}\n\treturn null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction assertNever(value: never): never {\n\tthrow new Error(`Unhandled MCP auth mode: ${JSON.stringify(value)}`);\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 { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { ExtensionAPI, ExtensionUIContext, SessionShutdownEvent, SessionStartEvent } from \"../../types.ts\";\nimport { detectLiteralBearerWarnings, resolveAuthMode, resolveServerAuth } from \"./auth/context.ts\";\nimport { collectToolCatalog } from \"./catalog.ts\";\nimport { getValidCachedServer, readMcpCatalogCache } from \"./catalog-cache.ts\";\nimport { loadMcpConfig, mergeExtensionMcpServers, resolveSkillMcpServer, visitSpawnableMcpServers } from \"./config.ts\";\nimport type { McpServerConfig, ResolvedMcpConfig, ResolvedMcpServer } from \"./config-schema.ts\";\nimport { ServerConnection } from \"./connection.ts\";\nimport { collectAllPages } from \"./expose/pagination.ts\";\nimport { mapMcpCatalogNames } from \"./expose/register.ts\";\nimport type { McpSessionRegistration } from \"./expose/session.ts\";\nimport type { McpServerExposureStatus } from \"./expose/status.ts\";\nimport { cleanupMcpOutputArtifacts, McpOutputArtifacts } from \"./guard/output-guard.ts\";\nimport { markMcpConnectionNeedsAuth } from \"./health.ts\";\nimport { configureMcpConnectionLifecycle, disposeMcpConnectionLifecycle } from \"./idle.ts\";\nimport { refreshMcpInstructionsForSession } from \"./instructions.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\tMcpWireAuthStatus,\n\tMcpWireJsonValue,\n\tMcpWireResource,\n\tMcpWireResourceTemplate,\n\tMcpWireServerInfo,\n\tMcpWireStatusServer,\n\tMcpWireStatusSnapshot,\n\tMcpWireTool,\n} from \"./service-types.ts\";\nimport {\n\tconnectAndRefreshMcpCatalog,\n\traceMcpStartupConnect,\n\tresolveMcpStartupTimeoutMs,\n\tshouldRaceMcpStartup,\n} from \"./startup-race.ts\";\n\ntype ListedTool = Awaited<ReturnType<Client[\"listTools\"]>>[\"tools\"][number];\ntype ListedResource = Awaited<ReturnType<Client[\"listResources\"]>>[\"resources\"][number];\ntype ListedResourceTemplate = Awaited<ReturnType<Client[\"listResourceTemplates\"]>>[\"resourceTemplates\"][number];\ntype McpElicitationUi = Pick<ExtensionUIContext, \"input\" | \"select\" | \"confirm\">;\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\t#elicitationUiProvider: (() => McpElicitationUi | undefined) | undefined;\n\t#mcpInstructions = \"\";\n\treadonly #pendingAuth = new Map<string, import(\"./auth/oauth-provider.ts\").McpOAuthProvider>();\n\treadonly #interactiveAuthServers = new Set<string>();\n\treadonly #promptCommandNames = new Set<string>();\n\treadonly #registrationListeners = new Set<() => void>();\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\t#attachQueue: Promise<void> = Promise.resolve();\n\t#latestWireStatus: McpWireStatusSnapshot = { servers: [] };\n\treadonly #wireStatusBySession = new Map<string, McpWireStatusSnapshot>();\n\treadonly #connections = new Map<string, McpConnectionEntry>();\n\treadonly #connectionKeysByName = new Map<string, string>();\n\treadonly #outputArtifacts = new McpOutputArtifacts();\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\tconst attach = this.#attachQueue.then(async () => {\n\t\t\tthis.#sessionContext = ctx;\n\t\t\tthis.#sessionStartCount += 1;\n\t\t\tthis.#lastSessionStartReason = event.reason;\n\t\t\tconst config = loadMcpConfig({\n\t\t\t\tagentDir: options.agentDir,\n\t\t\t\tcwd: ctx.cwd,\n\t\t\t\tenv: options.env,\n\t\t\t\tprojectTrusted: options.projectTrusted ?? ctx.isProjectTrusted(),\n\t\t\t});\n\t\t\tmergeExtensionMcpServers(config, ctx.getRegisteredMcpServers?.() ?? []);\n\t\t\tthis.#config = config;\n\t\t\tthis.#pi = _pi;\n\t\t\tthis.#authAgentDir = options.agentDir;\n\t\t\tthis.#authEnv = options.env;\n\t\t\tthis.#sessionOptions = options;\n\t\t\tconst toolRefreshGeneration = this.#toolRefreshGeneration + 1;\n\t\t\tthis.#toolRefreshGeneration = toolRefreshGeneration;\n\t\t\tawait this.#syncFromConfig(config, options, event.reason !== \"reload\", _pi, toolRefreshGeneration);\n\t\t\tif (_pi !== undefined) await this.#registerDirectTools(_pi);\n\t\t\t// Replay promotion markers from the (possibly resumed) session history\n\t\t\t// BEFORE the first turn: the request tool snapshot is taken before the\n\t\t\t// per-turn context event fires, so the context-event replay alone lands\n\t\t\t// one turn late. Doing it here puts restored tools on the very first\n\t\t\t// wire payload after a --continue/resume.\n\t\t\tif (_pi !== undefined) this.#rehydrateFromSessionHistory(ctx);\n\t\t\tif (shouldCaptureWireStatus(ctx)) await this.#captureWireStatus(ctx.sessionManager?.getSessionId?.());\n\t\t});\n\t\tthis.#attachQueue = attach.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\tawait attach;\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\tif (this.#sessionContext !== null && shouldCaptureWireStatus(this.#sessionContext)) {\n\t\t\t\tawait this.#captureWireStatus(this.#sessionContext.sessionManager?.getSessionId?.());\n\t\t\t}\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/** Subscribe to completed catalog registrations. Consumers must inspect the\n\t * resulting snapshot because tool, resource, and prompt catalogs can become\n\t * available in different startup-race generations. */\n\tonMcpRegistrationChanged(listener: () => void): () => void {\n\t\tthis.#registrationListeners.add(listener);\n\t\treturn () => this.#registrationListeners.delete(listener);\n\t}\n\n\t/** Reveal skill-owned tools (todo 37): activation is effective the next\n\t * turn, exactly like an tool_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\tthis.#elicitationUiProvider = undefined;\n\t\tthis.#mcpInstructions = \"\";\n\t\tthis.#pendingAuth.clear();\n\t\tthis.#interactiveAuthServers.clear();\n\t\tthis.#promptCommandNames.clear();\n\t\tthis.#registrationListeners.clear();\n\t\tthis.#wireStatusBySession.clear();\n\t\tthis.#latestWireStatus = { servers: [] };\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(this.#outputArtifacts);\n\t}\n\n\tgetMcpOutputArtifacts(): McpOutputArtifacts {\n\t\treturn this.#outputArtifacts;\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\t/**\n\t * Return the attach-time inventory captured for one session. This is the\n\t * handoff consumed by the app-server's session-owned adapter; it deliberately\n\t * does not expose or derive from the lifecycle-only server snapshots.\n\t */\n\tgetWireStatusSnapshot(sessionId?: string): McpWireStatusSnapshot {\n\t\treturn sessionId === undefined\n\t\t\t? this.#latestWireStatus\n\t\t\t: (this.#wireStatusBySession.get(sessionId) ?? { servers: [] });\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\telicitationUiProvider: () => this.getMcpElicitationUi(),\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\tartifacts: this.#outputArtifacts,\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\t// Every startup connect is bounded by the startup race and continues in\n\t\t\t// the background past the deadline (eager/keep-alive always; a cold lazy\n\t\t\t// server that has no cached catalog also races so a slow/wedged server\n\t\t\t// never gates attachSession -> before_agent_start -> the first turn).\n\t\t\t// A cached lazy server needs no startup connect: its tools come from the\n\t\t\t// cache and it connects on demand at tool-call time.\n\t\t\tif (shouldRaceMcpStartup(server.config.lifecycle) || cachedCatalog === undefined) {\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: async (targetPi) => {\n\t\t\t\t\t\t\tawait this.#registerDirectTools(targetPi);\n\t\t\t\t\t\t\t// A raced attach ran its history replay before this catalog\n\t\t\t\t\t\t\t// existed; replay now so restored tools still land on the\n\t\t\t\t\t\t\t// first turn's payload (idempotent: already-active names skip).\n\t\t\t\t\t\t\tif (this.#sessionContext !== null) this.#rehydrateFromSessionHistory(this.#sessionContext);\n\t\t\t\t\t\t\t// The session instructions block was likewise captured at attach\n\t\t\t\t\t\t\t// time, before this server connected; rebuild it so the first\n\t\t\t\t\t\t\t// turn carries this server's instructions after a raced connect.\n\t\t\t\t\t\t\trefreshMcpInstructionsForSession(this);\n\t\t\t\t\t\t},\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\tdeadlineMs: resolveMcpStartupTimeoutMs(server.config.startupTimeoutMs),\n\t\t\t\t\t}),\n\t\t\t\t);\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\tfor (const listener of this.#registrationListeners) listener();\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 tool_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\tasync #captureWireStatus(sessionId: string | undefined): Promise<void> {\n\t\tconst config = this.#config;\n\t\tif (config === null) return;\n\t\tconst servers = await Promise.all(\n\t\t\tObject.keys(config.servers)\n\t\t\t\t.sort()\n\t\t\t\t.map((name) => this.#captureWireStatusServer(name, config.servers[name])),\n\t\t);\n\t\tconst snapshot: McpWireStatusSnapshot = { servers };\n\t\tthis.#latestWireStatus = snapshot;\n\t\tif (sessionId !== undefined) this.#wireStatusBySession.set(sessionId, snapshot);\n\t}\n\n\tasync #captureWireStatusServer(name: string, server: ResolvedMcpServer | undefined): Promise<McpWireStatusServer> {\n\t\tconst entry = this.#entryForName(name);\n\t\tconst connection = entry?.connection;\n\t\tconst connected = connection?.state === \"connected\";\n\t\tconst cached = entry?.cachedCatalog;\n\t\tlet tools = cached?.tools ?? [];\n\t\tlet resources = cached?.resources ?? [];\n\t\tlet resourceTemplates: ListedResourceTemplate[] = [];\n\t\tlet serverInfo: McpWireServerInfo | null = null;\n\n\t\tif (connected && connection !== undefined) {\n\t\t\tconst client = connection.client;\n\t\t\tconst version = client.getServerVersion();\n\t\t\tif (version !== undefined) serverInfo = mapWireServerInfo(version);\n\t\t\tif (cached === undefined) {\n\t\t\t\ttry {\n\t\t\t\t\ttools = (\n\t\t\t\t\t\tawait collectAllPages<ListedTool>((cursor) =>\n\t\t\t\t\t\t\tclient.listTools(cursor === undefined ? {} : { cursor }),\n\t\t\t\t\t\t)\n\t\t\t\t\t).items;\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tif (!(error instanceof Error)) throw error;\n\t\t\t\t\ttools = [];\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tresources = (\n\t\t\t\t\t\tawait collectAllPages<ListedResource>((cursor) =>\n\t\t\t\t\t\t\tclient.listResources(cursor === undefined ? {} : { cursor }),\n\t\t\t\t\t\t)\n\t\t\t\t\t).items;\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tif (!(error instanceof Error)) throw error;\n\t\t\t\t\tresources = [];\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tresourceTemplates = (\n\t\t\t\t\tawait collectAllPages<ListedResourceTemplate>((cursor) =>\n\t\t\t\t\t\tclient.listResourceTemplates(cursor === undefined ? {} : { cursor }),\n\t\t\t\t\t)\n\t\t\t\t).items;\n\t\t\t} catch (error: unknown) {\n\t\t\t\tif (!(error instanceof Error)) throw error;\n\t\t\t\tresourceTemplates = [];\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tname,\n\t\t\tserverInfo,\n\t\t\ttools: tools.map(mapWireTool),\n\t\t\tresources: resources.map(mapWireResource),\n\t\t\tresourceTemplates: resourceTemplates.map(mapWireResourceTemplate),\n\t\t\tauthStatus: wireAuthStatus(entry, server),\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\tsetMcpInstructions(instructions: string): void {\n\t\tthis.#mcpInstructions = instructions;\n\t}\n\n\tgetMcpInstructions(): string {\n\t\treturn this.#mcpInstructions;\n\t}\n\n\tsetMcpElicitationUiProvider(provider: (() => McpElicitationUi | undefined) | undefined): void {\n\t\tthis.#elicitationUiProvider = provider;\n\t}\n\n\tgetMcpElicitationUi(): McpElicitationUi | undefined {\n\t\treturn this.#elicitationUiProvider?.();\n\t}\n\n\tisMcpPromptCommandRegistered(name: string): boolean {\n\t\treturn this.#promptCommandNames.has(name);\n\t}\n\n\tmarkMcpPromptCommandRegistered(name: string): void {\n\t\tthis.#promptCommandNames.add(name);\n\t}\n\n\tbeginInteractiveAuth(serverName: string): boolean {\n\t\tif (this.#interactiveAuthServers.has(serverName)) return false;\n\t\tthis.#interactiveAuthServers.add(serverName);\n\t\treturn true;\n\t}\n\n\tendInteractiveAuth(serverName: string): void {\n\t\tthis.#interactiveAuthServers.delete(serverName);\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\nfunction wireAuthStatus(\n\tentry: McpConnectionEntry | undefined,\n\tserver: ResolvedMcpServer | undefined,\n): McpWireAuthStatus {\n\tconst mode = entry?.authPlan?.mode ?? (server?.config === undefined ? \"none\" : resolveAuthMode(server.config));\n\tswitch (mode) {\n\t\tcase \"none\":\n\t\t\treturn \"unsupported\";\n\t\tcase \"bearer\":\n\t\t\treturn entry?.connection.state === \"needs_auth\" ? \"notLoggedIn\" : \"bearerToken\";\n\t\tcase \"oauth\":\n\t\t\treturn entry?.authPlan?.provider?.tokens() === undefined ? \"notLoggedIn\" : \"oAuth\";\n\t\tdefault:\n\t\t\treturn assertNever(mode);\n\t}\n}\n\nfunction shouldCaptureWireStatus(ctx: McpSessionContext): boolean {\n\treturn ctx.mode === \"app-server\";\n}\n\nfunction mapWireServerInfo(info: NonNullable<ReturnType<Client[\"getServerVersion\"]>>): McpWireServerInfo {\n\treturn {\n\t\tname: info.name,\n\t\ttitle: info.title ?? null,\n\t\tversion: info.version,\n\t\tdescription: info.description ?? null,\n\t\ticons: info.icons?.map(toWireJsonValue) ?? null,\n\t\twebsiteUrl: info.websiteUrl ?? null,\n\t};\n}\n\nfunction mapWireTool(tool: ListedTool): McpWireTool {\n\treturn {\n\t\tname: tool.name,\n\t\t...(tool.title === undefined ? {} : { title: tool.title }),\n\t\t...(tool.description === undefined ? {} : { description: tool.description }),\n\t\tinputSchema: toWireJsonValue(tool.inputSchema),\n\t\t...(tool.outputSchema === undefined ? {} : { outputSchema: toWireJsonValue(tool.outputSchema) }),\n\t\t...(tool.annotations === undefined ? {} : { annotations: toWireJsonValue(tool.annotations) }),\n\t\t...(tool.icons === undefined ? {} : { icons: tool.icons.map(toWireJsonValue) }),\n\t\t...(tool._meta === undefined ? {} : { _meta: toWireJsonValue(tool._meta) }),\n\t};\n}\n\nfunction mapWireResource(resource: ListedResource): McpWireResource {\n\treturn {\n\t\turi: resource.uri,\n\t\tname: resource.name,\n\t\t...(resource.title === undefined ? {} : { title: resource.title }),\n\t\t...(resource.description === undefined ? {} : { description: resource.description }),\n\t\t...(resource.mimeType === undefined ? {} : { mimeType: resource.mimeType }),\n\t\t...(resource.size === undefined ? {} : { size: resource.size }),\n\t\t...(resource.annotations === undefined ? {} : { annotations: toWireJsonValue(resource.annotations) }),\n\t\t...(resource.icons === undefined ? {} : { icons: resource.icons.map(toWireJsonValue) }),\n\t\t...(resource._meta === undefined ? {} : { _meta: toWireJsonValue(resource._meta) }),\n\t};\n}\n\nfunction mapWireResourceTemplate(template: ListedResourceTemplate): McpWireResourceTemplate {\n\treturn {\n\t\turiTemplate: template.uriTemplate,\n\t\tname: template.name,\n\t\t...(template.title === undefined ? {} : { title: template.title }),\n\t\t...(template.description === undefined ? {} : { description: template.description }),\n\t\t...(template.mimeType === undefined ? {} : { mimeType: template.mimeType }),\n\t\t...(template.annotations === undefined ? {} : { annotations: toWireJsonValue(template.annotations) }),\n\t\t...(template.icons === undefined ? {} : { icons: template.icons.map(toWireJsonValue) }),\n\t\t...(template._meta === undefined ? {} : { _meta: toWireJsonValue(template._meta) }),\n\t};\n}\n\nfunction toWireJsonValue(value: unknown): McpWireJsonValue {\n\tif (value === null || typeof value === \"boolean\" || typeof value === \"number\" || typeof value === \"string\") {\n\t\treturn value;\n\t}\n\tif (Array.isArray(value)) return value.map(toWireJsonValue);\n\tif (isRecord(value)) {\n\t\tconst object: Record<string, McpWireJsonValue | undefined> = {};\n\t\tfor (const [key, child] of Object.entries(value)) object[key] = toWireJsonValue(child);\n\t\treturn object;\n\t}\n\treturn null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction assertNever(value: never): never {\n\tthrow new Error(`Unhandled MCP auth mode: ${JSON.stringify(value)}`);\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"]}
@@ -0,0 +1,6 @@
1
+ import type { ExtensionAPI } from "../../types.ts";
2
+ import { type RuleActivationDetails } from "./types.ts";
3
+ export { type ProjectRulesActivationDetails, RULE_ACTIVATION_ENTRY_TYPE, type RuleActivationDetails, type TtsrActivationDetails, } from "./types.ts";
4
+ export declare function registerRuleActivationRenderer(pi: ExtensionAPI): void;
5
+ export declare function appendRuleActivation(pi: ExtensionAPI, details: RuleActivationDetails): void;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rule-activation/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAA8B,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEpF,OAAO,EACN,KAAK,6BAA6B,EAClC,0BAA0B,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,GAC1B,MAAM,YAAY,CAAC;AAEpB,wBAAgB,8BAA8B,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAErE;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAE3F"}
@@ -0,0 +1,10 @@
1
+ import { renderRuleActivationEntry } from "./renderer.js";
2
+ import { RULE_ACTIVATION_ENTRY_TYPE } from "./types.js";
3
+ export { RULE_ACTIVATION_ENTRY_TYPE, } from "./types.js";
4
+ export function registerRuleActivationRenderer(pi) {
5
+ pi.registerEntryRenderer(RULE_ACTIVATION_ENTRY_TYPE, renderRuleActivationEntry);
6
+ }
7
+ export function appendRuleActivation(pi, details) {
8
+ pi.appendEntry(RULE_ACTIVATION_ENTRY_TYPE, details);
9
+ }
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rule-activation/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAA8B,MAAM,YAAY,CAAC;AAEpF,OAAO,EAEN,0BAA0B,GAG1B,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,8BAA8B,CAAC,EAAgB;IAC9D,EAAE,CAAC,qBAAqB,CAAC,0BAA0B,EAAE,yBAAyB,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAgB,EAAE,OAA8B;IACpF,EAAE,CAAC,WAAW,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC","sourcesContent":["import type { ExtensionAPI } from \"../../types.ts\";\nimport { renderRuleActivationEntry } from \"./renderer.ts\";\nimport { RULE_ACTIVATION_ENTRY_TYPE, type RuleActivationDetails } from \"./types.ts\";\n\nexport {\n\ttype ProjectRulesActivationDetails,\n\tRULE_ACTIVATION_ENTRY_TYPE,\n\ttype RuleActivationDetails,\n\ttype TtsrActivationDetails,\n} from \"./types.ts\";\n\nexport function registerRuleActivationRenderer(pi: ExtensionAPI): void {\n\tpi.registerEntryRenderer(RULE_ACTIVATION_ENTRY_TYPE, renderRuleActivationEntry);\n}\n\nexport function appendRuleActivation(pi: ExtensionAPI, details: RuleActivationDetails): void {\n\tpi.appendEntry(RULE_ACTIVATION_ENTRY_TYPE, details);\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { EntryRenderer } from "../../types.ts";
2
+ export declare const renderRuleActivationEntry: EntryRenderer<unknown>;
3
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rule-activation/renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD,eAAO,MAAM,yBAAyB,EAAE,aAAa,CAAC,OAAO,CAI3D,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { noticeEntryRenderer } from "../../notice/index.js";
2
+ import { parseRuleActivationDetails } from "./types.js";
3
+ export const renderRuleActivationEntry = noticeEntryRenderer((entry) => {
4
+ const details = parseRuleActivationDetails(entry.data);
5
+ if (details === undefined)
6
+ return undefined;
7
+ return { title: titleLine(details), why: summaryLine(details), expandedLine: detailLine(details) };
8
+ });
9
+ function titleLine(details) {
10
+ switch (details.kind) {
11
+ case "project-rules":
12
+ return `● Project rules · ${details.targetPath}`;
13
+ case "ttsr":
14
+ return `⚠ Stream rule · ${details.owner}`;
15
+ }
16
+ }
17
+ function summaryLine(details) {
18
+ switch (details.kind) {
19
+ case "project-rules": {
20
+ const noun = details.rules.length === 1 ? "instruction" : "instructions";
21
+ return `${details.rules.length} ${noun} matched and injected for this tool result.`;
22
+ }
23
+ case "ttsr":
24
+ return details.remediation === "nudge"
25
+ ? "Output interrupted; a corrective nudge was queued."
26
+ : "Corrupted generation discarded; bounded provider retry started.";
27
+ }
28
+ }
29
+ function detailLine(details) {
30
+ switch (details.kind) {
31
+ case "project-rules":
32
+ return details.rules.map((rule) => `rule ${rule}`).join("\n");
33
+ case "ttsr":
34
+ return `remediation ${details.remediation} · observed ${details.rules.join(", ")}`;
35
+ }
36
+ }
37
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rule-activation/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,0BAA0B,EAA8B,MAAM,YAAY,CAAC;AAEpF,MAAM,CAAC,MAAM,yBAAyB,GAA2B,mBAAmB,CAAC,CAAC,KAAK,EAAE,EAAE;IAC9F,MAAM,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;AACpG,CAAC,CAAC,CAAC;AAEH,SAAS,SAAS,CAAC,OAA8B;IAChD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,eAAe;YACnB,OAAO,qBAAqB,OAAO,CAAC,UAAU,EAAE,CAAC;QAClD,KAAK,MAAM;YACV,OAAO,mBAAmB,OAAO,CAAC,KAAK,EAAE,CAAC;IAC5C,CAAC;AACF,CAAC;AAED,SAAS,WAAW,CAAC,OAA8B;IAClD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,eAAe,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC;YACzE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,6CAA6C,CAAC;QACrF,CAAC;QACD,KAAK,MAAM;YACV,OAAO,OAAO,CAAC,WAAW,KAAK,OAAO;gBACrC,CAAC,CAAC,oDAAoD;gBACtD,CAAC,CAAC,iEAAiE,CAAC;IACvE,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAAC,OAA8B;IACjD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,eAAe;YACnB,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,KAAK,MAAM;YACV,OAAO,eAAe,OAAO,CAAC,WAAW,eAAe,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACrF,CAAC;AACF,CAAC","sourcesContent":["import { noticeEntryRenderer } from \"../../notice/index.ts\";\nimport type { EntryRenderer } from \"../../types.ts\";\nimport { parseRuleActivationDetails, type RuleActivationDetails } from \"./types.ts\";\n\nexport const renderRuleActivationEntry: EntryRenderer<unknown> = noticeEntryRenderer((entry) => {\n\tconst details = parseRuleActivationDetails(entry.data);\n\tif (details === undefined) return undefined;\n\treturn { title: titleLine(details), why: summaryLine(details), expandedLine: detailLine(details) };\n});\n\nfunction titleLine(details: RuleActivationDetails): string {\n\tswitch (details.kind) {\n\t\tcase \"project-rules\":\n\t\t\treturn `● Project rules · ${details.targetPath}`;\n\t\tcase \"ttsr\":\n\t\t\treturn `⚠ Stream rule · ${details.owner}`;\n\t}\n}\n\nfunction summaryLine(details: RuleActivationDetails): string {\n\tswitch (details.kind) {\n\t\tcase \"project-rules\": {\n\t\t\tconst noun = details.rules.length === 1 ? \"instruction\" : \"instructions\";\n\t\t\treturn `${details.rules.length} ${noun} matched and injected for this tool result.`;\n\t\t}\n\t\tcase \"ttsr\":\n\t\t\treturn details.remediation === \"nudge\"\n\t\t\t\t? \"Output interrupted; a corrective nudge was queued.\"\n\t\t\t\t: \"Corrupted generation discarded; bounded provider retry started.\";\n\t}\n}\n\nfunction detailLine(details: RuleActivationDetails): string {\n\tswitch (details.kind) {\n\t\tcase \"project-rules\":\n\t\t\treturn details.rules.map((rule) => `rule ${rule}`).join(\"\\n\");\n\t\tcase \"ttsr\":\n\t\t\treturn `remediation ${details.remediation} · observed ${details.rules.join(\", \")}`;\n\t}\n}\n"]}
@@ -0,0 +1,15 @@
1
+ export declare const RULE_ACTIVATION_ENTRY_TYPE = "rule-activation";
2
+ export interface ProjectRulesActivationDetails {
3
+ readonly kind: "project-rules";
4
+ readonly targetPath: string;
5
+ readonly rules: readonly string[];
6
+ }
7
+ export interface TtsrActivationDetails {
8
+ readonly kind: "ttsr";
9
+ readonly owner: string;
10
+ readonly rules: readonly string[];
11
+ readonly remediation: "nudge" | "provider-error";
12
+ }
13
+ export type RuleActivationDetails = ProjectRulesActivationDetails | TtsrActivationDetails;
14
+ export declare function parseRuleActivationDetails(value: unknown): RuleActivationDetails | undefined;
15
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rule-activation/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B,oBAAoB,CAAC;AAE5D,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,OAAO,GAAG,gBAAgB,CAAC;CACjD;AAED,MAAM,MAAM,qBAAqB,GAAG,6BAA6B,GAAG,qBAAqB,CAAC;AAE1F,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,GAAG,SAAS,CAW5F"}
@@ -0,0 +1,45 @@
1
+ export const RULE_ACTIVATION_ENTRY_TYPE = "rule-activation";
2
+ export function parseRuleActivationDetails(value) {
3
+ if (!isObject(value))
4
+ return undefined;
5
+ const kind = Reflect.get(value, "kind");
6
+ switch (kind) {
7
+ case "project-rules":
8
+ return parseProjectRulesActivation(value);
9
+ case "ttsr":
10
+ return parseTtsrActivation(value);
11
+ default:
12
+ return undefined;
13
+ }
14
+ }
15
+ function parseProjectRulesActivation(value) {
16
+ const targetPath = Reflect.get(value, "targetPath");
17
+ const rules = stringList(Reflect.get(value, "rules"));
18
+ if (typeof targetPath !== "string" || targetPath.length === 0 || rules === undefined)
19
+ return undefined;
20
+ return { kind: "project-rules", targetPath, rules };
21
+ }
22
+ function parseTtsrActivation(value) {
23
+ const owner = Reflect.get(value, "owner");
24
+ const rules = stringList(Reflect.get(value, "rules"));
25
+ const remediation = Reflect.get(value, "remediation");
26
+ if (typeof owner !== "string" ||
27
+ owner.length === 0 ||
28
+ rules === undefined ||
29
+ (remediation !== "nudge" && remediation !== "provider-error")) {
30
+ return undefined;
31
+ }
32
+ return { kind: "ttsr", owner, rules, remediation };
33
+ }
34
+ function stringList(value) {
35
+ if (!Array.isArray(value) ||
36
+ value.length === 0 ||
37
+ !value.every((entry) => typeof entry === "string" && entry.length > 0)) {
38
+ return undefined;
39
+ }
40
+ return value;
41
+ }
42
+ function isObject(value) {
43
+ return typeof value === "object" && value !== null && !Array.isArray(value);
44
+ }
45
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rule-activation/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,0BAA0B,GAAG,iBAAiB,CAAC;AAiB5D,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACxD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,eAAe;YACnB,OAAO,2BAA2B,CAAC,KAAK,CAAC,CAAC;QAC3C,KAAK,MAAM;YACV,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACnC;YACC,OAAO,SAAS,CAAC;IACnB,CAAC;AACF,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAa;IACjD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACvG,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACtD,IACC,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,KAAK,KAAK,SAAS;QACnB,CAAC,WAAW,KAAK,OAAO,IAAI,WAAW,KAAK,gBAAgB,CAAC,EAC5D,CAAC;QACF,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IACjC,IACC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EACrE,CAAC;QACF,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC","sourcesContent":["export const RULE_ACTIVATION_ENTRY_TYPE = \"rule-activation\";\n\nexport interface ProjectRulesActivationDetails {\n\treadonly kind: \"project-rules\";\n\treadonly targetPath: string;\n\treadonly rules: readonly string[];\n}\n\nexport interface TtsrActivationDetails {\n\treadonly kind: \"ttsr\";\n\treadonly owner: string;\n\treadonly rules: readonly string[];\n\treadonly remediation: \"nudge\" | \"provider-error\";\n}\n\nexport type RuleActivationDetails = ProjectRulesActivationDetails | TtsrActivationDetails;\n\nexport function parseRuleActivationDetails(value: unknown): RuleActivationDetails | undefined {\n\tif (!isObject(value)) return undefined;\n\tconst kind = Reflect.get(value, \"kind\");\n\tswitch (kind) {\n\t\tcase \"project-rules\":\n\t\t\treturn parseProjectRulesActivation(value);\n\t\tcase \"ttsr\":\n\t\t\treturn parseTtsrActivation(value);\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction parseProjectRulesActivation(value: object): ProjectRulesActivationDetails | undefined {\n\tconst targetPath = Reflect.get(value, \"targetPath\");\n\tconst rules = stringList(Reflect.get(value, \"rules\"));\n\tif (typeof targetPath !== \"string\" || targetPath.length === 0 || rules === undefined) return undefined;\n\treturn { kind: \"project-rules\", targetPath, rules };\n}\n\nfunction parseTtsrActivation(value: object): TtsrActivationDetails | undefined {\n\tconst owner = Reflect.get(value, \"owner\");\n\tconst rules = stringList(Reflect.get(value, \"rules\"));\n\tconst remediation = Reflect.get(value, \"remediation\");\n\tif (\n\t\ttypeof owner !== \"string\" ||\n\t\towner.length === 0 ||\n\t\trules === undefined ||\n\t\t(remediation !== \"nudge\" && remediation !== \"provider-error\")\n\t) {\n\t\treturn undefined;\n\t}\n\treturn { kind: \"ttsr\", owner, rules, remediation };\n}\n\nfunction stringList(value: unknown): readonly string[] | undefined {\n\tif (\n\t\t!Array.isArray(value) ||\n\t\tvalue.length === 0 ||\n\t\t!value.every((entry) => typeof entry === \"string\" && entry.length > 0)\n\t) {\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nfunction isObject(value: unknown): value is object {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rules/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAcnD,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAmI/D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rules/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAgBnD,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA0I/D"}