@code-yeongyu/senpi 2026.7.17-2 → 2026.7.17-3

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 (42) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/core/extensions/builtin/mcp/expose/native-search.d.ts +1 -1
  3. package/dist/core/extensions/builtin/mcp/expose/native-search.d.ts.map +1 -1
  4. package/dist/core/extensions/builtin/mcp/expose/native-search.js +1 -1
  5. package/dist/core/extensions/builtin/mcp/expose/native-search.js.map +1 -1
  6. package/dist/core/extensions/builtin/mcp/expose/policy.js +1 -1
  7. package/dist/core/extensions/builtin/mcp/expose/policy.js.map +1 -1
  8. package/dist/core/extensions/builtin/mcp/expose/status.js +1 -1
  9. package/dist/core/extensions/builtin/mcp/expose/status.js.map +1 -1
  10. package/dist/core/extensions/builtin/mcp/expose/tier-b.d.ts +3 -3
  11. package/dist/core/extensions/builtin/mcp/expose/tier-b.d.ts.map +1 -1
  12. package/dist/core/extensions/builtin/mcp/expose/tier-b.js +10 -10
  13. package/dist/core/extensions/builtin/mcp/expose/tier-b.js.map +1 -1
  14. package/dist/core/extensions/builtin/mcp/expose/tool-search.d.ts +3 -3
  15. package/dist/core/extensions/builtin/mcp/expose/tool-search.d.ts.map +1 -1
  16. package/dist/core/extensions/builtin/mcp/expose/tool-search.js +14 -14
  17. package/dist/core/extensions/builtin/mcp/expose/tool-search.js.map +1 -1
  18. package/dist/core/extensions/builtin/mcp/index.js +5 -5
  19. package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
  20. package/dist/core/extensions/builtin/mcp/service.d.ts +2 -2
  21. package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
  22. package/dist/core/extensions/builtin/mcp/service.js +2 -2
  23. package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
  24. package/docs/AGENTS.md +70 -0
  25. package/docs/mcp.md +5 -5
  26. package/examples/AGENTS.md +3 -0
  27. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +12 -0
  28. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  29. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  30. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  31. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +19 -0
  32. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  33. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +0 -21
  34. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  35. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +0 -21
  36. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
  37. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +3 -21
  38. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
  39. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  40. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  41. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  42. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,gCAAgC,EAAE,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EACN,yBAAyB,EAGzB,sBAAsB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3D,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAgB;IACpD,IAAI,aAAwC,CAAC;IAC7C,MAAM,IAAI,GAAG;QACZ,MAAM,EAAE;YACP,KAAK,CAAC,OAAe,EAAE,IAAc;gBACpC,eAAe,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACjD,CAAC;SACD;KACD,CAAC;IAEF,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAExB,yEAAyE;IACzE,2EAA2E;IAC3E,2EAA2E;IAC3E,oEAAoE;IACpE,MAAM,aAAa,GAAG,IAAI,gCAAgC,CAAC;QAC1D,OAAO,EAAE,GAAG,EAAE;YACb,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC,0BAA0B,EAAE,CAAC;YAC7D,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,CAAC;QAC/C,CAAC;QACD,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,oBAAoB;QAChF,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/D,cAAc,EAAE,oBAAoB;KACpC,CAAC,CAAC;IACH,EAAE,CAAC,EAAE,CAAC,yBAAyB,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAClH,EAAE,CAAC,EAAE,CAAC,yBAAyB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5F,0EAA0E;IAC1E,6EAA6E;IAC7E,4EAA4E;IAC5E,4EAA4E;IAC5E,4EAA4E;IAC5E,oEAAoE;IACpE,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QAC1B,aAAa,EAAE,CAAC,yBAAyB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,qEAAqE;IACrE,sEAAsE;IACtE,4EAA4E;IAC5E,yEAAyE;IACzE,IAAI,UAAU,GAAyB,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC5E,IAAI,YAAY,GAAG,IAAI,GAAG,EAAqB,CAAC;IAChD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,MAAM,WAAW,GAAG,CAAC,SAAiB,EAAQ,EAAE;QAC/C,IAAI,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO;QACxE,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,sBAAsB,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAC1E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAChE,CAAC,CAAC;IACF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,+BAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAI,KAAK;YAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,2EAA2E;QAC3E,oEAAoE;QACpE,mEAAmE;QACnE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,MAAM,yBAAyB,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC;YAC7G,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACxC,eAAe,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC1C,KAAK,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC1C,CAAC;YACD,IAAI,SAAS,CAAC,OAAO;gBAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;QAC7E,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;QAC5B,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM;YAAE,OAAO,SAAS,CAAC;QAChD,MAAM,IAAI,GAAI,KAAK,CAAC,KAA2B,CAAC,IAAI,CAAC;QACrD,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;YAC1C,IAAI,IAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,iEAAiE;IACjE,wEAAwE;IACxE,0EAA0E;IAC1E,uEAAuE;IACvE,6EAA6E;IAC7E,2EAA2E;IAC3E,0EAA0E;IAC1E,4EAA4E;IAC5E,2EAA2E;IAC3E,uEAAuE;IACvE,4EAA4E;IAC5E,MAAM,MAAM,GAAG,CAAC,KAAwB,EAAE,GAAqB,EAAiB,EAAE;QACjF,aAAa,GAAG,CAAC,KAAK,IAAI,EAAE;YAC3B,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;YAChC,MAAM,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAC5C,gCAAgC,CAAC,OAAO,CAAC,CAAC;YAC1C,yBAAyB,CAAC,EAAE,EAAE,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,aAAa,CAAC;IACtB,CAAC,CAAC;IACF,EAAE,CAAC,EAAE,CACJ,eAAe,EACf,SAAS,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CACxE,CAAC;IACF,EAAE,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAChD,IAAI,CAAC;YACJ,sEAAsE;YACtE,2BAA2B,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;YACnF,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,IAAI,EAAE,CAAyB,CAAC;YAChF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBACnE,UAAU,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;gBAC/C,MAAM,QAAQ,GAAG,IAAI,GAAG,CACvB,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CACrG,CAAC;gBACF,MAAM,QAAQ,GAAG;oBAChB,GAAG,UAAU,CAAC,QAAQ;oBACtB,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBACnF,CAAC;gBACF,KAAK,MAAM,OAAO,IAAI,QAAQ;oBAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzE,CAAC;YACD,MAAM,YAAY,GAAG,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC/D,OAAO,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;QAClE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAC;YAC3C,MAAM,mBAAmB,CAAC,wBAAwB,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACjE,OAAO,SAAS,CAAC;QAClB,CAAC;IACF,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,EAAE,CACJ,kBAAkB,EAClB,SAAS,CAAC,sBAAsB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAChG,CAAC;AACH,CAAC","sourcesContent":["import type { ExtensionAPI, ExtensionContext, SessionStartEvent } from \"../../types.ts\";\nimport { registerMcpCommands } from \"./commands.ts\";\nimport { setMcpElicitationUiProvider } from \"./elicitation.ts\";\nimport { AnthropicNativeToolSearchAdapter } from \"./expose/native-search.ts\";\nimport { MCP_SEARCH_TOOL_NAME } from \"./expose/tool-search.ts\";\nimport { injectMcpInstructions, refreshMcpInstructionsForSession } from \"./instructions.ts\";\nimport { createMcpLogger } from \"./log.ts\";\nimport { registerMcpPromptCommands } from \"./prompts.ts\";\nimport { expandMcpResourceMentions } from \"./resources.ts\";\nimport { getMcpService } from \"./service.ts\";\nimport {\n\tparseSkillMcpDeclarations,\n\ttype SkillLike,\n\ttype SkillMcpDeclarations,\n\tskillActivationTargets,\n} from \"./skills.ts\";\nimport { reportMcpAsyncError, wrapAsync } from \"./wrap.ts\";\n\nexport default function mcpExtension(pi: ExtensionAPI): void {\n\tlet attachPromise: Promise<void> | undefined;\n\tconst sink = {\n\t\tlogger: {\n\t\t\terror(message: string, data?: unknown): void {\n\t\t\t\tcreateMcpLogger(\"service\").error(message, data);\n\t\t\t},\n\t\t},\n\t};\n\n\tregisterMcpCommands(pi);\n\n\t// Native provider tool-search adapter (todo 33 — Anthropic, spike = GO).\n\t// Runs on every request but is a no-op unless settings.nativeToolSearch is\n\t// auto|true and the model is anthropic-messages; a 400 disables it for the\n\t// session and falls back to the always-registered local mcp_search.\n\tconst nativeAdapter = new AnthropicNativeToolSearchAdapter({\n\t\tenabled: () => {\n\t\t\tconst setting = getMcpService().getNativeToolSearchSetting();\n\t\t\treturn setting === true || setting === \"auto\";\n\t\t},\n\t\tisDeferrable: (name) => name.startsWith(\"mcp_\") && name !== MCP_SEARCH_TOOL_NAME,\n\t\tonFallback: (reason) => createMcpLogger(\"service\").warn(reason),\n\t\tsearchToolName: MCP_SEARCH_TOOL_NAME,\n\t});\n\tpi.on(\"before_provider_request\", (event, ctx) => nativeAdapter.applyBeforeRequest(ctx.model?.api, event.payload));\n\tpi.on(\"after_provider_response\", (event) => nativeAdapter.noteResponseStatus(event.status));\n\t// Resumed/compacted sessions carry mcp_search activation markers in their\n\t// history but re-enter search mode with only directTools active. The context\n\t// event (fired before each LLM call, with the full message history) replays\n\t// the markers as a safety net; the primary replay happens at attach time so\n\t// the FIRST turn's payload already carries previously promoted tools. Scans\n\t// once per registration (see McpService.maybeRehydrateFromHistory).\n\tpi.on(\"context\", (event) => {\n\t\tgetMcpService().maybeRehydrateFromHistory(event.messages);\n\t});\n\n\t// skills-carry-MCP (todo 37): skills declaring MCP servers (mcp.json\n\t// sidecar or SKILL.md frontmatter) register lazily with tools hidden;\n\t// loading a skill — /skill:<name> input or the model reading its SKILL.md —\n\t// reveals that skill's includeTools matches for the rest of the session.\n\tlet skillDecls: SkillMcpDeclarations = { servers: new Map(), warnings: [] };\n\tlet skillsByName = new Map<string, SkillLike>();\n\tconst loadedSkills = new Set<string>();\n\tconst revealSkill = (skillName: string): void => {\n\t\tif (loadedSkills.has(skillName) || !skillsByName.has(skillName)) return;\n\t\tloadedSkills.add(skillName);\n\t\tconst service = getMcpService();\n\t\tconst registered = service.getTierBSearchable();\n\t\tconst targets = skillActivationTargets(skillDecls, skillName, registered);\n\t\tif (targets.length > 0) service.activateSkillMcpTools(targets);\n\t};\n\tpi.on(\"input\", async (event, ctx) => {\n\t\tconst match = /^\\s*\\/skill:([A-Za-z0-9._-]+)/.exec(event.text);\n\t\tif (match) revealSkill(match[1]);\n\t\t// @mcp:<server>/<uri> mention expansion (todo 39): recognized mentions are\n\t\t// inlined via the sanctioned input transform; failures pass through\n\t\t// untouched with a one-line notice so submission is never blocked.\n\t\tif (event.text.includes(\"@mcp:\")) {\n\t\t\tconst expansion = await expandMcpResourceMentions(event.text, () => getMcpService().getMcpResourceServers());\n\t\t\tfor (const notice of expansion.notices) {\n\t\t\t\tcreateMcpLogger(\"resources\").warn(notice);\n\t\t\t\tvoid ctx.ui?.notify?.(notice, \"warning\");\n\t\t\t}\n\t\t\tif (expansion.changed) return { action: \"transform\", text: expansion.text };\n\t\t}\n\t\treturn undefined;\n\t});\n\tpi.on(\"tool_call\", (event) => {\n\t\tif (event.toolName !== \"read\") return undefined;\n\t\tconst path = (event.input as { path?: string }).path;\n\t\tif (path === undefined) return undefined;\n\t\tfor (const [name, skill] of skillsByName) {\n\t\t\tif (path === skill.filePath || path.endsWith(skill.filePath)) revealSkill(name);\n\t\t}\n\t\treturn undefined;\n\t});\n\n\t// Attach is SINGLE-FLIGHT. session_start handlers are dispatched\n\t// fire-and-forget, so a slow attach (a cold MCP server's boot + catalog\n\t// collection is awaited inside attachSession) can still be in flight when\n\t// before_agent_start fires. The old `attached` boolean was only set on\n\t// completion, so before_agent_start would start a SECOND concurrent attach —\n\t// which found the connection entries already created (still \"connecting\"),\n\t// collected an empty catalog, and registered no MCP tools for turn 1; the\n\t// first attach then landed the real registration turns later. Memoizing the\n\t// in-flight promise makes before_agent_start await the ORIGINAL attach, so\n\t// the first turn's payload deterministically carries the MCP tool set.\n\t// session_start always starts a fresh attach (reloads must re-sync config).\n\tconst attach = (event: SessionStartEvent, ctx: ExtensionContext): Promise<void> => {\n\t\tattachPromise = (async () => {\n\t\t\tconst service = getMcpService();\n\t\t\tawait service.attachSession(event, ctx, pi);\n\t\t\trefreshMcpInstructionsForSession(service);\n\t\t\tregisterMcpPromptCommands(pi, service.getMcpPromptServers());\n\t\t})();\n\t\treturn attachPromise;\n\t};\n\tpi.on(\n\t\t\"session_start\",\n\t\twrapAsync(\"mcp.session_start\", (event, ctx) => attach(event, ctx), sink),\n\t);\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\ttry {\n\t\t\t// Elicitation (todo 41): point mid-call forms at the live session UI.\n\t\t\tsetMcpElicitationUiProvider(() => ctx.ui);\n\t\t\tawait (attachPromise ?? attach({ type: \"session_start\", reason: \"startup\" }, ctx));\n\t\t\tconst skills = (event.systemPromptOptions.skills ?? []) as readonly SkillLike[];\n\t\t\tif (skills.length > 0) {\n\t\t\t\tskillsByName = new Map(skills.map((skill) => [skill.name, skill]));\n\t\t\t\tskillDecls = parseSkillMcpDeclarations(skills);\n\t\t\t\tconst declared = new Map(\n\t\t\t\t\t[...skillDecls.servers].map(([name, decl]) => [name, { raw: decl.raw, sourcePath: decl.sourcePath }]),\n\t\t\t\t);\n\t\t\t\tconst warnings = [\n\t\t\t\t\t...skillDecls.warnings,\n\t\t\t\t\t...(declared.size > 0 ? await getMcpService().attachSkillMcpServers(declared) : []),\n\t\t\t\t];\n\t\t\t\tfor (const warning of warnings) createMcpLogger(\"skills\").warn(warning);\n\t\t\t}\n\t\t\tconst systemPrompt = injectMcpInstructions(event.systemPrompt);\n\t\t\treturn systemPrompt === undefined ? undefined : { systemPrompt };\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error)) throw error;\n\t\t\tawait reportMcpAsyncError(\"mcp.before_agent_start\", error, sink);\n\t\t\treturn undefined;\n\t\t}\n\t});\n\tpi.on(\n\t\t\"session_shutdown\",\n\t\twrapAsync(\"mcp.session_shutdown\", (event) => getMcpService().handleSessionShutdown(event), sink),\n\t);\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,gCAAgC,EAAE,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EACN,yBAAyB,EAGzB,sBAAsB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3D,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAgB;IACpD,IAAI,aAAwC,CAAC;IAC7C,MAAM,IAAI,GAAG;QACZ,MAAM,EAAE;YACP,KAAK,CAAC,OAAe,EAAE,IAAc;gBACpC,eAAe,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACjD,CAAC;SACD;KACD,CAAC;IAEF,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAExB,yEAAyE;IACzE,2EAA2E;IAC3E,2EAA2E;IAC3E,qEAAqE;IACrE,MAAM,aAAa,GAAG,IAAI,gCAAgC,CAAC;QAC1D,OAAO,EAAE,GAAG,EAAE;YACb,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC,0BAA0B,EAAE,CAAC;YAC7D,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,CAAC;QAC/C,CAAC;QACD,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,qBAAqB;QACjF,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/D,cAAc,EAAE,qBAAqB;KACrC,CAAC,CAAC;IACH,EAAE,CAAC,EAAE,CAAC,yBAAyB,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAClH,EAAE,CAAC,EAAE,CAAC,yBAAyB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5F,2EAA2E;IAC3E,6EAA6E;IAC7E,4EAA4E;IAC5E,4EAA4E;IAC5E,4EAA4E;IAC5E,oEAAoE;IACpE,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QAC1B,aAAa,EAAE,CAAC,yBAAyB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,qEAAqE;IACrE,sEAAsE;IACtE,4EAA4E;IAC5E,yEAAyE;IACzE,IAAI,UAAU,GAAyB,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC5E,IAAI,YAAY,GAAG,IAAI,GAAG,EAAqB,CAAC;IAChD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,MAAM,WAAW,GAAG,CAAC,SAAiB,EAAQ,EAAE;QAC/C,IAAI,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO;QACxE,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,sBAAsB,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAC1E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAChE,CAAC,CAAC;IACF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,+BAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAI,KAAK;YAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,2EAA2E;QAC3E,oEAAoE;QACpE,mEAAmE;QACnE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,MAAM,yBAAyB,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC;YAC7G,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACxC,eAAe,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC1C,KAAK,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC1C,CAAC;YACD,IAAI,SAAS,CAAC,OAAO;gBAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;QAC7E,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;QAC5B,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM;YAAE,OAAO,SAAS,CAAC;QAChD,MAAM,IAAI,GAAI,KAAK,CAAC,KAA2B,CAAC,IAAI,CAAC;QACrD,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;YAC1C,IAAI,IAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,iEAAiE;IACjE,wEAAwE;IACxE,0EAA0E;IAC1E,uEAAuE;IACvE,6EAA6E;IAC7E,2EAA2E;IAC3E,0EAA0E;IAC1E,4EAA4E;IAC5E,2EAA2E;IAC3E,uEAAuE;IACvE,4EAA4E;IAC5E,MAAM,MAAM,GAAG,CAAC,KAAwB,EAAE,GAAqB,EAAiB,EAAE;QACjF,aAAa,GAAG,CAAC,KAAK,IAAI,EAAE;YAC3B,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;YAChC,MAAM,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAC5C,gCAAgC,CAAC,OAAO,CAAC,CAAC;YAC1C,yBAAyB,CAAC,EAAE,EAAE,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,aAAa,CAAC;IACtB,CAAC,CAAC;IACF,EAAE,CAAC,EAAE,CACJ,eAAe,EACf,SAAS,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CACxE,CAAC;IACF,EAAE,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAChD,IAAI,CAAC;YACJ,sEAAsE;YACtE,2BAA2B,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;YACnF,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,IAAI,EAAE,CAAyB,CAAC;YAChF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBACnE,UAAU,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;gBAC/C,MAAM,QAAQ,GAAG,IAAI,GAAG,CACvB,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CACrG,CAAC;gBACF,MAAM,QAAQ,GAAG;oBAChB,GAAG,UAAU,CAAC,QAAQ;oBACtB,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBACnF,CAAC;gBACF,KAAK,MAAM,OAAO,IAAI,QAAQ;oBAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzE,CAAC;YACD,MAAM,YAAY,GAAG,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC/D,OAAO,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;QAClE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAC;YAC3C,MAAM,mBAAmB,CAAC,wBAAwB,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACjE,OAAO,SAAS,CAAC;QAClB,CAAC;IACF,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,EAAE,CACJ,kBAAkB,EAClB,SAAS,CAAC,sBAAsB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAChG,CAAC;AACH,CAAC","sourcesContent":["import type { ExtensionAPI, ExtensionContext, SessionStartEvent } from \"../../types.ts\";\nimport { registerMcpCommands } from \"./commands.ts\";\nimport { setMcpElicitationUiProvider } from \"./elicitation.ts\";\nimport { AnthropicNativeToolSearchAdapter } from \"./expose/native-search.ts\";\nimport { TOOL_SEARCH_TOOL_NAME } from \"./expose/tool-search.ts\";\nimport { injectMcpInstructions, refreshMcpInstructionsForSession } from \"./instructions.ts\";\nimport { createMcpLogger } from \"./log.ts\";\nimport { registerMcpPromptCommands } from \"./prompts.ts\";\nimport { expandMcpResourceMentions } from \"./resources.ts\";\nimport { getMcpService } from \"./service.ts\";\nimport {\n\tparseSkillMcpDeclarations,\n\ttype SkillLike,\n\ttype SkillMcpDeclarations,\n\tskillActivationTargets,\n} from \"./skills.ts\";\nimport { reportMcpAsyncError, wrapAsync } from \"./wrap.ts\";\n\nexport default function mcpExtension(pi: ExtensionAPI): void {\n\tlet attachPromise: Promise<void> | undefined;\n\tconst sink = {\n\t\tlogger: {\n\t\t\terror(message: string, data?: unknown): void {\n\t\t\t\tcreateMcpLogger(\"service\").error(message, data);\n\t\t\t},\n\t\t},\n\t};\n\n\tregisterMcpCommands(pi);\n\n\t// Native provider tool-search adapter (todo 33 — Anthropic, spike = GO).\n\t// Runs on every request but is a no-op unless settings.nativeToolSearch is\n\t// auto|true and the model is anthropic-messages; a 400 disables it for the\n\t// session and falls back to the always-registered local tool_search.\n\tconst nativeAdapter = new AnthropicNativeToolSearchAdapter({\n\t\tenabled: () => {\n\t\t\tconst setting = getMcpService().getNativeToolSearchSetting();\n\t\t\treturn setting === true || setting === \"auto\";\n\t\t},\n\t\tisDeferrable: (name) => name.startsWith(\"mcp_\") && name !== TOOL_SEARCH_TOOL_NAME,\n\t\tonFallback: (reason) => createMcpLogger(\"service\").warn(reason),\n\t\tsearchToolName: TOOL_SEARCH_TOOL_NAME,\n\t});\n\tpi.on(\"before_provider_request\", (event, ctx) => nativeAdapter.applyBeforeRequest(ctx.model?.api, event.payload));\n\tpi.on(\"after_provider_response\", (event) => nativeAdapter.noteResponseStatus(event.status));\n\t// Resumed/compacted sessions carry tool_search activation markers in their\n\t// history but re-enter search mode with only directTools active. The context\n\t// event (fired before each LLM call, with the full message history) replays\n\t// the markers as a safety net; the primary replay happens at attach time so\n\t// the FIRST turn's payload already carries previously promoted tools. Scans\n\t// once per registration (see McpService.maybeRehydrateFromHistory).\n\tpi.on(\"context\", (event) => {\n\t\tgetMcpService().maybeRehydrateFromHistory(event.messages);\n\t});\n\n\t// skills-carry-MCP (todo 37): skills declaring MCP servers (mcp.json\n\t// sidecar or SKILL.md frontmatter) register lazily with tools hidden;\n\t// loading a skill — /skill:<name> input or the model reading its SKILL.md —\n\t// reveals that skill's includeTools matches for the rest of the session.\n\tlet skillDecls: SkillMcpDeclarations = { servers: new Map(), warnings: [] };\n\tlet skillsByName = new Map<string, SkillLike>();\n\tconst loadedSkills = new Set<string>();\n\tconst revealSkill = (skillName: string): void => {\n\t\tif (loadedSkills.has(skillName) || !skillsByName.has(skillName)) return;\n\t\tloadedSkills.add(skillName);\n\t\tconst service = getMcpService();\n\t\tconst registered = service.getTierBSearchable();\n\t\tconst targets = skillActivationTargets(skillDecls, skillName, registered);\n\t\tif (targets.length > 0) service.activateSkillMcpTools(targets);\n\t};\n\tpi.on(\"input\", async (event, ctx) => {\n\t\tconst match = /^\\s*\\/skill:([A-Za-z0-9._-]+)/.exec(event.text);\n\t\tif (match) revealSkill(match[1]);\n\t\t// @mcp:<server>/<uri> mention expansion (todo 39): recognized mentions are\n\t\t// inlined via the sanctioned input transform; failures pass through\n\t\t// untouched with a one-line notice so submission is never blocked.\n\t\tif (event.text.includes(\"@mcp:\")) {\n\t\t\tconst expansion = await expandMcpResourceMentions(event.text, () => getMcpService().getMcpResourceServers());\n\t\t\tfor (const notice of expansion.notices) {\n\t\t\t\tcreateMcpLogger(\"resources\").warn(notice);\n\t\t\t\tvoid ctx.ui?.notify?.(notice, \"warning\");\n\t\t\t}\n\t\t\tif (expansion.changed) return { action: \"transform\", text: expansion.text };\n\t\t}\n\t\treturn undefined;\n\t});\n\tpi.on(\"tool_call\", (event) => {\n\t\tif (event.toolName !== \"read\") return undefined;\n\t\tconst path = (event.input as { path?: string }).path;\n\t\tif (path === undefined) return undefined;\n\t\tfor (const [name, skill] of skillsByName) {\n\t\t\tif (path === skill.filePath || path.endsWith(skill.filePath)) revealSkill(name);\n\t\t}\n\t\treturn undefined;\n\t});\n\n\t// Attach is SINGLE-FLIGHT. session_start handlers are dispatched\n\t// fire-and-forget, so a slow attach (a cold MCP server's boot + catalog\n\t// collection is awaited inside attachSession) can still be in flight when\n\t// before_agent_start fires. The old `attached` boolean was only set on\n\t// completion, so before_agent_start would start a SECOND concurrent attach —\n\t// which found the connection entries already created (still \"connecting\"),\n\t// collected an empty catalog, and registered no MCP tools for turn 1; the\n\t// first attach then landed the real registration turns later. Memoizing the\n\t// in-flight promise makes before_agent_start await the ORIGINAL attach, so\n\t// the first turn's payload deterministically carries the MCP tool set.\n\t// session_start always starts a fresh attach (reloads must re-sync config).\n\tconst attach = (event: SessionStartEvent, ctx: ExtensionContext): Promise<void> => {\n\t\tattachPromise = (async () => {\n\t\t\tconst service = getMcpService();\n\t\t\tawait service.attachSession(event, ctx, pi);\n\t\t\trefreshMcpInstructionsForSession(service);\n\t\t\tregisterMcpPromptCommands(pi, service.getMcpPromptServers());\n\t\t})();\n\t\treturn attachPromise;\n\t};\n\tpi.on(\n\t\t\"session_start\",\n\t\twrapAsync(\"mcp.session_start\", (event, ctx) => attach(event, ctx), sink),\n\t);\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\ttry {\n\t\t\t// Elicitation (todo 41): point mid-call forms at the live session UI.\n\t\t\tsetMcpElicitationUiProvider(() => ctx.ui);\n\t\t\tawait (attachPromise ?? attach({ type: \"session_start\", reason: \"startup\" }, ctx));\n\t\t\tconst skills = (event.systemPromptOptions.skills ?? []) as readonly SkillLike[];\n\t\t\tif (skills.length > 0) {\n\t\t\t\tskillsByName = new Map(skills.map((skill) => [skill.name, skill]));\n\t\t\t\tskillDecls = parseSkillMcpDeclarations(skills);\n\t\t\t\tconst declared = new Map(\n\t\t\t\t\t[...skillDecls.servers].map(([name, decl]) => [name, { raw: decl.raw, sourcePath: decl.sourcePath }]),\n\t\t\t\t);\n\t\t\t\tconst warnings = [\n\t\t\t\t\t...skillDecls.warnings,\n\t\t\t\t\t...(declared.size > 0 ? await getMcpService().attachSkillMcpServers(declared) : []),\n\t\t\t\t];\n\t\t\t\tfor (const warning of warnings) createMcpLogger(\"skills\").warn(warning);\n\t\t\t}\n\t\t\tconst systemPrompt = injectMcpInstructions(event.systemPrompt);\n\t\t\treturn systemPrompt === undefined ? undefined : { systemPrompt };\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error)) throw error;\n\t\t\tawait reportMcpAsyncError(\"mcp.before_agent_start\", error, sink);\n\t\t\treturn undefined;\n\t\t}\n\t});\n\tpi.on(\n\t\t\"session_shutdown\",\n\t\twrapAsync(\"mcp.session_shutdown\", (event) => getMcpService().handleSessionShutdown(event), sink),\n\t);\n}\n"]}
@@ -32,7 +32,7 @@ export declare class McpService {
32
32
  /** Connected servers that list resources (todo 39), for mention expansion. */
33
33
  getMcpResourceServers(): readonly McpResourceServer[];
34
34
  /** Reveal skill-owned tools (todo 37): activation is effective the next
35
- * turn, exactly like an mcp_search promotion. Unknown names are ignored. */
35
+ * turn, exactly like an tool_search promotion. Unknown names are ignored. */
36
36
  activateSkillMcpTools(names: readonly string[]): void;
37
37
  handleSessionShutdown(event: SessionShutdownEvent): Promise<void>;
38
38
  dispose(reason: McpDisposeReason): Promise<void>;
@@ -45,7 +45,7 @@ export declare class McpService {
45
45
  recordCall(name: string, elapsedMs: number, failed: boolean): void;
46
46
  getSnapshot(): McpServiceSnapshot;
47
47
  /**
48
- * Replay mcp_search activation markers from session history through the
48
+ * Replay tool_search activation markers from session history through the
49
49
  * live tier-B activation path (see tool-search.ts). Returns newly activated
50
50
  * names; safe to call repeatedly (already-active names are skipped).
51
51
  */
@@ -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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"}
@@ -110,7 +110,7 @@ export class McpService {
110
110
  return this.#tierBRegistration?.resourceServers ?? [];
111
111
  }
112
112
  /** Reveal skill-owned tools (todo 37): activation is effective the next
113
- * turn, exactly like an mcp_search promotion. Unknown names are ignored. */
113
+ * turn, exactly like an tool_search promotion. Unknown names are ignored. */
114
114
  activateSkillMcpTools(names) {
115
115
  this.#tierBRegistration?.activate(names);
116
116
  }
@@ -334,7 +334,7 @@ export class McpService {
334
334
  this.#historyScanned = false;
335
335
  }
336
336
  /**
337
- * Replay mcp_search activation markers from session history through the
337
+ * Replay tool_search activation markers from session history through the
338
338
  * live tier-B activation path (see tool-search.ts). Returns newly activated
339
339
  * names; safe to call repeatedly (already-active names are skipped).
340
340
  */
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/service.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionAPI, SessionShutdownEvent, SessionStartEvent } from \"../../types.ts\";\nimport { detectLiteralBearerWarnings, resolveServerAuth } from \"./auth/context.ts\";\nimport { collectToolCatalog } from \"./catalog.ts\";\nimport { getValidCachedServer, readMcpCatalogCache } from \"./catalog-cache.ts\";\nimport { loadMcpConfig, resolveSkillMcpServer, visitSpawnableMcpServers } from \"./config.ts\";\nimport type { McpServerConfig, ResolvedMcpConfig, ResolvedMcpServer } from \"./config-schema.ts\";\nimport { ServerConnection } from \"./connection.ts\";\nimport { mapMcpCatalogNames } from \"./expose/register.ts\";\nimport type { McpSessionRegistration } from \"./expose/session.ts\";\nimport type { McpServerExposureStatus } from \"./expose/status.ts\";\nimport { cleanupMcpOutputArtifacts } from \"./guard/output-guard.ts\";\nimport { markMcpConnectionNeedsAuth } from \"./health.ts\";\nimport { configureMcpConnectionLifecycle, disposeMcpConnectionLifecycle } from \"./idle.ts\";\nimport { createMcpLogger } from \"./log.ts\";\nimport {\n\tbuildMcpTombstoneDefinition,\n\tcreateMcpListChangeCoalescer,\n\tdiffMcpToolNames,\n\tformatMcpListChangedDelta,\n} from \"./notifications.ts\";\nimport { configureMcpReconnect, disposeMcpReconnect, reconnectMcpNow } from \"./reconnect.ts\";\nimport type { McpResourceServer } from \"./resources.ts\";\nimport { getMcpServiceExposureStatus } from \"./service-exposure.ts\";\nimport { registerMcpServiceDirectTools } from \"./service-register.ts\";\nimport { buildMcpServerSnapshot } from \"./service-snapshot.ts\";\nimport type {\n\tMcpConnectionEntry,\n\tMcpDisposeReason,\n\tMcpServerSnapshot,\n\tMcpServiceSnapshot,\n\tMcpSessionContext,\n\tMcpSessionOptions,\n} from \"./service-types.ts\";\nimport {\n\tconnectAndRefreshMcpCatalog,\n\tignoreStartupNeedsAuth,\n\traceMcpStartupConnect,\n\tshouldRaceMcpStartup,\n} from \"./startup-race.ts\";\n\nexport { registerToolsPreservingActiveSet } from \"./active-set.ts\";\n\nexport class McpService {\n\t#disposed = false;\n\t#disposeCount = 0;\n\t#lastDisposeReason: McpDisposeReason | null = null;\n\t#sessionContext: McpSessionContext | null = null;\n\t#sessionStartCount = 0;\n\t#lastSessionStartReason: SessionStartEvent[\"reason\"] | null = null;\n\t#toolRefreshGeneration = 0;\n\t#config: ResolvedMcpConfig | null = null;\n\t#authAgentDir: string | undefined;\n\t#authEnv: Record<string, string | undefined> | undefined;\n\treadonly #pendingAuth = new Map<string, import(\"./auth/oauth-provider.ts\").McpOAuthProvider>();\n\t#refreshActiveSetWhenNoTools = false;\n\t#tierBRegistration: McpSessionRegistration | undefined;\n\t#historyScanned = false;\n\t#sessionOptions: McpSessionOptions = {};\n\t#pi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\"> | undefined;\n\treadonly #connections = new Map<string, McpConnectionEntry>();\n\treadonly #connectionKeysByName = new Map<string, string>();\n\n\tasync attachSession(\n\t\tevent: SessionStartEvent,\n\t\tctx: McpSessionContext,\n\t\t_pi?: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\t\toptions: McpSessionOptions = {},\n\t): Promise<void> {\n\t\tthis.#sessionContext = ctx;\n\t\tthis.#sessionStartCount += 1;\n\t\tthis.#lastSessionStartReason = event.reason;\n\t\tconst config = loadMcpConfig({\n\t\t\tagentDir: options.agentDir,\n\t\t\tcwd: ctx.cwd,\n\t\t\tenv: options.env,\n\t\t\tprojectTrusted: options.projectTrusted ?? ctx.isProjectTrusted(),\n\t\t});\n\t\tthis.#config = config;\n\t\tthis.#pi = _pi;\n\t\tthis.#authAgentDir = options.agentDir;\n\t\tthis.#authEnv = options.env;\n\t\tthis.#sessionOptions = options;\n\t\tconst toolRefreshGeneration = this.#toolRefreshGeneration + 1;\n\t\tthis.#toolRefreshGeneration = toolRefreshGeneration;\n\t\tawait this.#syncFromConfig(config, options, event.reason !== \"reload\", _pi, toolRefreshGeneration);\n\t\tif (_pi !== undefined) await this.#registerDirectTools(_pi);\n\t\t// Replay promotion markers from the (possibly resumed) session history\n\t\t// BEFORE the first turn: the request tool snapshot is taken before the\n\t\t// per-turn context event fires, so the context-event replay alone lands\n\t\t// one turn late. Doing it here puts restored tools on the very first\n\t\t// wire payload after a --continue/resume.\n\t\tif (_pi !== undefined) this.#rehydrateFromSessionHistory(ctx);\n\t}\n\n\t/**\n\t * Register skill-declared MCP servers (todo 37). Skill servers are forced\n\t * into search mode with no directTools, so their catalogs register with\n\t * ZERO active tools until activateSkillMcpTools reveals them. A name\n\t * collision with a system-configured server keeps the system config and\n\t * returns a warning (system wins).\n\t */\n\tasync attachSkillMcpServers(\n\t\tdeclared: ReadonlyMap<string, { raw: Parameters<typeof resolveSkillMcpServer>[1]; sourcePath: string }>,\n\t): Promise<string[]> {\n\t\tconst config = this.#config;\n\t\tconst pi = this.#pi;\n\t\tif (config === null || pi === undefined) return [];\n\t\tconst warnings: string[] = [];\n\t\tlet added = 0;\n\t\tfor (const [name, decl] of declared) {\n\t\t\tconst existing = config.servers[name];\n\t\t\tif (existing !== undefined && existing.source !== \"skill\") {\n\t\t\t\twarnings.push(\n\t\t\t\t\t`MCP server '${name}' from skill ${decl.sourcePath} collides with the ${existing.source} config; system config wins.`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst resolved = resolveSkillMcpServer(name, decl.raw, decl.sourcePath);\n\t\t\tif (existing !== undefined && existing.configHash === resolved.configHash) continue;\n\t\t\tconfig.servers[name] = resolved;\n\t\t\tadded += 1;\n\t\t}\n\t\tif (added > 0) {\n\t\t\tconst toolRefreshGeneration = this.#toolRefreshGeneration + 1;\n\t\t\tthis.#toolRefreshGeneration = toolRefreshGeneration;\n\t\t\tawait this.#syncFromConfig(config, this.#sessionOptions, false, pi, toolRefreshGeneration);\n\t\t\tawait this.#registerDirectTools(pi);\n\t\t}\n\t\treturn warnings;\n\t}\n\n\t/** Registered searchable catalog (mapped name + server-side tool name),\n\t * used by the skills loader to compute activation targets. */\n\tgetTierBSearchable(): ReadonlyArray<{ name: string; toolName: string; server: string }> {\n\t\treturn this.#tierBRegistration?.searchable ?? [];\n\t}\n\n\t/** Connected servers that list prompts (todo 40), for slash registration. */\n\tgetMcpPromptServers(): readonly import(\"./prompts.ts\").McpPromptServer[] {\n\t\treturn this.#tierBRegistration?.promptServers ?? [];\n\t}\n\n\t/** Connected servers that list resources (todo 39), for mention expansion. */\n\tgetMcpResourceServers(): readonly McpResourceServer[] {\n\t\treturn this.#tierBRegistration?.resourceServers ?? [];\n\t}\n\n\t/** Reveal skill-owned tools (todo 37): activation is effective the next\n\t * turn, exactly like an mcp_search promotion. Unknown names are ignored. */\n\tactivateSkillMcpTools(names: readonly string[]): void {\n\t\tthis.#tierBRegistration?.activate(names);\n\t}\n\n\t#rehydrateFromSessionHistory(ctx: McpSessionContext): void {\n\t\tconst entries = ctx.sessionManager?.getEntries() ?? [];\n\t\tif (entries.length === 0) return;\n\t\tthis.rehydrateActiveToolsFromHistory(entries);\n\t}\n\n\tasync handleSessionShutdown(event: SessionShutdownEvent): Promise<void> {\n\t\tif (shouldDisposeMcpService(event.reason)) await this.dispose(event.reason);\n\t}\n\n\tasync dispose(reason: McpDisposeReason): Promise<void> {\n\t\tif (this.#disposed) return;\n\t\tthis.#disposed = true;\n\t\tthis.#disposeCount += 1;\n\t\tthis.#lastDisposeReason = reason;\n\t\tthis.#sessionContext = null;\n\t\tthis.#config = null;\n\t\tconst entries = [...this.#connections.values()];\n\t\tthis.#connections.clear();\n\t\tthis.#connectionKeysByName.clear();\n\t\tawait Promise.all(entries.map((entry) => disposeEntryConnection(entry)));\n\t\tawait cleanupMcpOutputArtifacts();\n\t}\n\n\tisDisposed(): boolean {\n\t\treturn this.#disposed;\n\t}\n\n\tgetConnection(name: string): ServerConnection | undefined {\n\t\tconst key = this.#connectionKeysByName.get(name);\n\t\treturn key === undefined ? undefined : this.#connections.get(key)?.connection;\n\t}\n\n\tasync reconnectServer(name: string): Promise<void> {\n\t\tconst entry = this.#entryForName(name);\n\t\tif (entry === undefined) throw new Error(`Unknown MCP server: ${name || \"<missing>\"}`);\n\t\tawait reconnectMcpNow(entry.connection);\n\t}\n\n\tgetServerSnapshots(): McpServerSnapshot[] {\n\t\tconst names = new Set<string>(Object.keys(this.#config?.servers ?? {}));\n\t\tfor (const entry of this.#connections.values()) names.add(entry.name);\n\t\treturn [...names].sort().map((name) => this.#serverSnapshot(name));\n\t}\n\n\tgetLogLines(name: string, maxLines: number): string[] {\n\t\tconst key = this.#connectionKeysByName.get(name);\n\t\tconst lines = key === undefined ? [] : (this.#connections.get(key)?.logger.getRingBuffer() ?? []);\n\t\treturn lines.slice(Math.max(0, lines.length - maxLines));\n\t}\n\n\tasync getServerExposureStatus(name: string): Promise<McpServerExposureStatus> {\n\t\treturn await getMcpServiceExposureStatus(name, this.#config, this.#entryForName(name));\n\t}\n\n\trecordCall(name: string, elapsedMs: number, failed: boolean): void {\n\t\tconst key = this.#connectionKeysByName.get(name);\n\t\tconst entry = key === undefined ? undefined : this.#connections.get(key);\n\t\tif (entry === undefined) return;\n\t\tentry.counters.callCount += 1;\n\t\tentry.counters.totalLatencyMs += elapsedMs;\n\t\tif (failed) entry.counters.errorCount += 1;\n\t}\n\n\tgetSnapshot(): McpServiceSnapshot {\n\t\treturn {\n\t\t\tdisposed: this.#disposed,\n\t\t\tdisposeCount: this.#disposeCount,\n\t\t\tlastDisposeReason: this.#lastDisposeReason,\n\t\t\tsessionStartCount: this.#sessionStartCount,\n\t\t\tlastSessionStartReason: this.#lastSessionStartReason,\n\t\t\thasSessionContext: this.#sessionContext !== null,\n\t\t\tconnectionCount: this.#connections.size,\n\t\t};\n\t}\n\n\tasync #syncFromConfig(\n\t\tconfig: ResolvedMcpConfig,\n\t\toptions: McpSessionOptions,\n\t\tuseCache: boolean,\n\t\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\"> | undefined,\n\t\ttoolRefreshGeneration: number,\n\t): Promise<void> {\n\t\tconst cache = await readMcpCatalogCache(options.agentDir);\n\t\tconst hadConnectionsBeforeSync = this.#connections.size > 0;\n\t\tthis.#refreshActiveSetWhenNoTools = Object.keys(config.servers).length > 0 || hadConnectionsBeforeSync;\n\t\tconst wanted = new Map<string, ResolvedMcpServer>();\n\t\tvisitSpawnableMcpServers(config, (name, server) => {\n\t\t\twanted.set(name, server);\n\t\t});\n\t\tconst disposals: Promise<void>[] = [];\n\t\tfor (const entry of this.#connections.values()) {\n\t\t\tconst server = wanted.get(entry.name);\n\t\t\tconst key = server?.configHash === undefined ? undefined : `${entry.name}\\0${server.configHash}`;\n\t\t\tif (key === entry.key) continue;\n\t\t\tthis.#connections.delete(entry.key);\n\t\t\tthis.#connectionKeysByName.delete(entry.name);\n\t\t\tdisposals.push(disposeEntryConnection(entry));\n\t\t}\n\t\tawait Promise.all(disposals);\n\n\t\tconst connects: Promise<void>[] = [];\n\t\tfor (const [name, server] of wanted) {\n\t\t\tif (server.config === undefined || server.configHash === undefined) continue;\n\t\t\tconst key = `${name}\\0${server.configHash}`;\n\t\t\tif (this.#connections.has(key)) continue;\n\t\t\tconst logger = createMcpLogger(name, { logDir: options.logDir });\n\t\t\tconst authPlan = resolveServerAuth({\n\t\t\t\tagentDir: options.agentDir,\n\t\t\t\tconfig: server.config,\n\t\t\t\tenv: options.env,\n\t\t\t\tlogger,\n\t\t\t\tserverName: name,\n\t\t\t});\n\t\t\tfor (const warning of detectLiteralBearerWarnings(name, server.config)) logger.warn(warning);\n\t\t\tconst connection = new ServerConnection({\n\t\t\t\tauthProvider: authPlan.provider,\n\t\t\t\tconfig: server.config,\n\t\t\t\tenv: options.env,\n\t\t\t\tlogger,\n\t\t\t\tserverName: name,\n\t\t\t});\n\t\t\tconst cachedCatalog = useCache ? getValidCachedServer(cache, name, server.configHash) : undefined;\n\t\t\tconst entry: McpConnectionEntry = {\n\t\t\t\tagentDir: options.agentDir,\n\t\t\t\tauthPlan,\n\t\t\t\tcacheRefreshedAfterConnect: false,\n\t\t\t\tcachedCatalog,\n\t\t\t\tkey,\n\t\t\t\tname,\n\t\t\t\tconfigHash: server.configHash,\n\t\t\t\tconnection,\n\t\t\t\tlogger,\n\t\t\t\tcreatedAtMs: Date.now(),\n\t\t\t\tcounters: { callCount: 0, errorCount: 0, totalLatencyMs: 0, reconnectCount: 0 },\n\t\t\t};\n\t\t\tconfigureMcpConnectionLifecycle(connection, server.config, logger);\n\t\t\tconfigureMcpReconnect({\n\t\t\t\tconnection,\n\t\t\t\tlogger,\n\t\t\t\treconnect: async () => {\n\t\t\t\t\tentry.counters.reconnectCount += 1;\n\t\t\t\t\tentry.cacheRefreshedAfterConnect = false;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait entry.authPlan?.refresh?.ensureFresh();\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconst authError = markMcpConnectionNeedsAuth(entry.connection, error);\n\t\t\t\t\t\tif (authError !== undefined) {\n\t\t\t\t\t\t\tentry.logger.warn(authError.message);\n\t\t\t\t\t\t\tthrow authError;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\tawait entry.connection.renew();\n\t\t\t\t\tawait connectAndRefreshMcpCatalog(entry, server.config);\n\t\t\t\t},\n\t\t\t\tshouldReconnect: () => !this.#disposed && this.#entryForName(name) === entry,\n\t\t\t});\n\t\t\tthis.#connections.set(key, entry);\n\t\t\tthis.#connectionKeysByName.set(name, key);\n\t\t\tthis.#wireListChanged(entry);\n\t\t\tif (shouldRaceMcpStartup(server.config.lifecycle)) {\n\t\t\t\tconnects.push(\n\t\t\t\t\traceMcpStartupConnect({\n\t\t\t\t\t\tentry,\n\t\t\t\t\t\tpi,\n\t\t\t\t\t\tregisterDirectTools: (targetPi) => this.#registerDirectTools(targetPi),\n\t\t\t\t\t\tserverConfig: server.config,\n\t\t\t\t\t\tshouldRefreshTools: () => !this.#disposed && this.#toolRefreshGeneration === toolRefreshGeneration,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else if (cachedCatalog === undefined) {\n\t\t\t\tconnects.push(ignoreStartupNeedsAuth(entry, connectAndRefreshMcpCatalog(entry, server.config)));\n\t\t\t}\n\t\t}\n\t\tawait Promise.all(connects);\n\t}\n\n\t#wireListChanged(entry: McpConnectionEntry): void {\n\t\tconst sink = { logger: { error: (message: string, data?: unknown) => entry.logger.error(message, data) } };\n\t\tconst coalescer = createMcpListChangeCoalescer({\n\t\t\tonRefresh: () => this.#handleServerToolsChanged(entry),\n\t\t\tscope: `mcp.list_changed.${entry.name}`,\n\t\t\tsink,\n\t\t});\n\t\tconst unsubscribe = entry.connection.onToolsChanged(() => coalescer.notify());\n\t\tentry.disposeListChanged = () => {\n\t\t\tunsubscribe();\n\t\t\tcoalescer.dispose();\n\t\t};\n\t}\n\n\t// Re-list a server on a coalesced list_changed and re-register: added tools\n\t// enter INACTIVE (registerToolsPreservingActiveSet keeps the active set), and\n\t// removed tools are tombstoned so a stale call fails cleanly.\n\tasync #handleServerToolsChanged(entry: McpConnectionEntry): Promise<void> {\n\t\tconst pi = this.#pi;\n\t\tconst config = this.#config;\n\t\tif (pi === undefined || config === null) return;\n\t\tconst server = config.servers[entry.name];\n\t\tif (server?.config === undefined || entry.connection.state !== \"connected\") return;\n\t\tconst catalog = await collectToolCatalog(entry.name, entry.connection, server.config, {\n\t\t\tagentDir: entry.agentDir,\n\t\t\toutputGuard: config.settings.outputGuard,\n\t\t});\n\t\tconst newNames = mapMcpCatalogNames(catalog).map(({ name }) => name);\n\t\tconst diff = diffMcpToolNames(entry.knownToolNames ?? newNames, newNames);\n\t\t// Tombstone removed tools BEFORE re-registration so the subsequent\n\t\t// setActiveTools (which excludes them) leaves the tombstones inactive.\n\t\tfor (const removed of diff.removed) pi.registerTool(buildMcpTombstoneDefinition(removed, entry.name));\n\t\tawait this.#registerDirectTools(pi);\n\t\tentry.knownToolNames = newNames;\n\t\tentry.lastListChangedDelta = formatMcpListChangedDelta(diff);\n\t}\n\n\tasync #registerDirectTools(\n\t\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\t): Promise<void> {\n\t\tconst config = this.#config;\n\t\tif (config === null) return;\n\t\tthis.#tierBRegistration = await registerMcpServiceDirectTools(pi, config, this.#connections.values(), {\n\t\t\trefreshActiveSetWhenEmpty: this.#refreshActiveSetWhenNoTools,\n\t\t});\n\t\t// A (re-)registration recomputes the active set from config alone, so any\n\t\t// promotions recorded in history are worth replaying on the next scan.\n\t\tthis.#historyScanned = false;\n\t}\n\n\t/**\n\t * Replay mcp_search activation markers from session history through the\n\t * live tier-B activation path (see tool-search.ts). Returns newly activated\n\t * names; safe to call repeatedly (already-active names are skipped).\n\t */\n\trehydrateActiveToolsFromHistory(messages: readonly unknown[]): string[] {\n\t\tthis.#historyScanned = true;\n\t\treturn this.#tierBRegistration?.rehydrateFromHistory(messages) ?? [];\n\t}\n\n\t/**\n\t * Once-per-registration variant for per-turn context events: scanning the\n\t * full history each turn would cost O(history) JSON serialization, and a\n\t * live session's active set only drifts from history when a (re-)registration\n\t * rebuilt it — so scan once after each registration and skip otherwise.\n\t */\n\tmaybeRehydrateFromHistory(messages: readonly unknown[]): string[] {\n\t\tif (this.#historyScanned) return [];\n\t\treturn this.rehydrateActiveToolsFromHistory(messages);\n\t}\n\n\t#serverSnapshot(name: string): McpServerSnapshot {\n\t\tconst connection = this.getConnection(name);\n\t\tconnection?.refreshCapturedDiagnostics();\n\t\treturn buildMcpServerSnapshot(name, this.#config?.servers[name], connection, this.#entryForName(name));\n\t}\n\n\t#entryForName(name: string): McpConnectionEntry | undefined {\n\t\tconst key = this.#connectionKeysByName.get(name);\n\t\treturn key === undefined ? undefined : this.#connections.get(key);\n\t}\n\n\tgetPendingAuth(): Map<string, import(\"./auth/oauth-provider.ts\").McpOAuthProvider> {\n\t\treturn this.#pendingAuth;\n\t}\n\n\tgetAuthTarget(\n\t\tname: string,\n\t):\n\t\t| { config: McpServerConfig; agentDir?: string; env?: Record<string, string | undefined>; callbackUrl?: string }\n\t\t| undefined {\n\t\tconst server = this.#config?.servers[name];\n\t\tif (server?.config === undefined) return undefined;\n\t\treturn {\n\t\t\tconfig: server.config,\n\t\t\tagentDir: this.#authAgentDir,\n\t\t\tenv: this.#authEnv,\n\t\t\tcallbackUrl: this.#config?.settings.oauthCallbackUrl,\n\t\t};\n\t}\n\n\tgetCachedInstructions(name: string): string | undefined {\n\t\treturn this.#entryForName(name)?.cachedCatalog?.instructions;\n\t}\n\n\t/** Resolved `settings.nativeToolSearch` (auto | true | false | undefined).\n\t * Drives the native provider tool-search adapter gate. */\n\tgetNativeToolSearchSetting(): \"auto\" | boolean | undefined {\n\t\treturn this.#config?.settings.nativeToolSearch;\n\t}\n}\n\nlet service: McpService | null = null;\n\nexport function getMcpService(): McpService {\n\tif (service === null || service.isDisposed()) {\n\t\tservice = new McpService();\n\t}\n\treturn service;\n}\n\nexport function shouldDisposeMcpService(reason: SessionShutdownEvent[\"reason\"]): reason is McpDisposeReason {\n\treturn reason === \"quit\" || reason === \"reload\";\n}\n\nasync function disposeEntryConnection(entry: McpConnectionEntry): Promise<void> {\n\tentry.disposeListChanged?.();\n\tdisposeMcpReconnect(entry.connection);\n\tdisposeMcpConnectionLifecycle(entry.connection);\n\tawait entry.connection.dispose();\n}\n\nexport function resetMcpServiceForTests(): void {\n\tservice = null;\n}\n"]}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/service.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionAPI, SessionShutdownEvent, SessionStartEvent } from \"../../types.ts\";\nimport { detectLiteralBearerWarnings, resolveServerAuth } from \"./auth/context.ts\";\nimport { collectToolCatalog } from \"./catalog.ts\";\nimport { getValidCachedServer, readMcpCatalogCache } from \"./catalog-cache.ts\";\nimport { loadMcpConfig, resolveSkillMcpServer, visitSpawnableMcpServers } from \"./config.ts\";\nimport type { McpServerConfig, ResolvedMcpConfig, ResolvedMcpServer } from \"./config-schema.ts\";\nimport { ServerConnection } from \"./connection.ts\";\nimport { mapMcpCatalogNames } from \"./expose/register.ts\";\nimport type { McpSessionRegistration } from \"./expose/session.ts\";\nimport type { McpServerExposureStatus } from \"./expose/status.ts\";\nimport { cleanupMcpOutputArtifacts } from \"./guard/output-guard.ts\";\nimport { markMcpConnectionNeedsAuth } from \"./health.ts\";\nimport { configureMcpConnectionLifecycle, disposeMcpConnectionLifecycle } from \"./idle.ts\";\nimport { createMcpLogger } from \"./log.ts\";\nimport {\n\tbuildMcpTombstoneDefinition,\n\tcreateMcpListChangeCoalescer,\n\tdiffMcpToolNames,\n\tformatMcpListChangedDelta,\n} from \"./notifications.ts\";\nimport { configureMcpReconnect, disposeMcpReconnect, reconnectMcpNow } from \"./reconnect.ts\";\nimport type { McpResourceServer } from \"./resources.ts\";\nimport { getMcpServiceExposureStatus } from \"./service-exposure.ts\";\nimport { registerMcpServiceDirectTools } from \"./service-register.ts\";\nimport { buildMcpServerSnapshot } from \"./service-snapshot.ts\";\nimport type {\n\tMcpConnectionEntry,\n\tMcpDisposeReason,\n\tMcpServerSnapshot,\n\tMcpServiceSnapshot,\n\tMcpSessionContext,\n\tMcpSessionOptions,\n} from \"./service-types.ts\";\nimport {\n\tconnectAndRefreshMcpCatalog,\n\tignoreStartupNeedsAuth,\n\traceMcpStartupConnect,\n\tshouldRaceMcpStartup,\n} from \"./startup-race.ts\";\n\nexport { registerToolsPreservingActiveSet } from \"./active-set.ts\";\n\nexport class McpService {\n\t#disposed = false;\n\t#disposeCount = 0;\n\t#lastDisposeReason: McpDisposeReason | null = null;\n\t#sessionContext: McpSessionContext | null = null;\n\t#sessionStartCount = 0;\n\t#lastSessionStartReason: SessionStartEvent[\"reason\"] | null = null;\n\t#toolRefreshGeneration = 0;\n\t#config: ResolvedMcpConfig | null = null;\n\t#authAgentDir: string | undefined;\n\t#authEnv: Record<string, string | undefined> | undefined;\n\treadonly #pendingAuth = new Map<string, import(\"./auth/oauth-provider.ts\").McpOAuthProvider>();\n\t#refreshActiveSetWhenNoTools = false;\n\t#tierBRegistration: McpSessionRegistration | undefined;\n\t#historyScanned = false;\n\t#sessionOptions: McpSessionOptions = {};\n\t#pi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\"> | undefined;\n\treadonly #connections = new Map<string, McpConnectionEntry>();\n\treadonly #connectionKeysByName = new Map<string, string>();\n\n\tasync attachSession(\n\t\tevent: SessionStartEvent,\n\t\tctx: McpSessionContext,\n\t\t_pi?: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\t\toptions: McpSessionOptions = {},\n\t): Promise<void> {\n\t\tthis.#sessionContext = ctx;\n\t\tthis.#sessionStartCount += 1;\n\t\tthis.#lastSessionStartReason = event.reason;\n\t\tconst config = loadMcpConfig({\n\t\t\tagentDir: options.agentDir,\n\t\t\tcwd: ctx.cwd,\n\t\t\tenv: options.env,\n\t\t\tprojectTrusted: options.projectTrusted ?? ctx.isProjectTrusted(),\n\t\t});\n\t\tthis.#config = config;\n\t\tthis.#pi = _pi;\n\t\tthis.#authAgentDir = options.agentDir;\n\t\tthis.#authEnv = options.env;\n\t\tthis.#sessionOptions = options;\n\t\tconst toolRefreshGeneration = this.#toolRefreshGeneration + 1;\n\t\tthis.#toolRefreshGeneration = toolRefreshGeneration;\n\t\tawait this.#syncFromConfig(config, options, event.reason !== \"reload\", _pi, toolRefreshGeneration);\n\t\tif (_pi !== undefined) await this.#registerDirectTools(_pi);\n\t\t// Replay promotion markers from the (possibly resumed) session history\n\t\t// BEFORE the first turn: the request tool snapshot is taken before the\n\t\t// per-turn context event fires, so the context-event replay alone lands\n\t\t// one turn late. Doing it here puts restored tools on the very first\n\t\t// wire payload after a --continue/resume.\n\t\tif (_pi !== undefined) this.#rehydrateFromSessionHistory(ctx);\n\t}\n\n\t/**\n\t * Register skill-declared MCP servers (todo 37). Skill servers are forced\n\t * into search mode with no directTools, so their catalogs register with\n\t * ZERO active tools until activateSkillMcpTools reveals them. A name\n\t * collision with a system-configured server keeps the system config and\n\t * returns a warning (system wins).\n\t */\n\tasync attachSkillMcpServers(\n\t\tdeclared: ReadonlyMap<string, { raw: Parameters<typeof resolveSkillMcpServer>[1]; sourcePath: string }>,\n\t): Promise<string[]> {\n\t\tconst config = this.#config;\n\t\tconst pi = this.#pi;\n\t\tif (config === null || pi === undefined) return [];\n\t\tconst warnings: string[] = [];\n\t\tlet added = 0;\n\t\tfor (const [name, decl] of declared) {\n\t\t\tconst existing = config.servers[name];\n\t\t\tif (existing !== undefined && existing.source !== \"skill\") {\n\t\t\t\twarnings.push(\n\t\t\t\t\t`MCP server '${name}' from skill ${decl.sourcePath} collides with the ${existing.source} config; system config wins.`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst resolved = resolveSkillMcpServer(name, decl.raw, decl.sourcePath);\n\t\t\tif (existing !== undefined && existing.configHash === resolved.configHash) continue;\n\t\t\tconfig.servers[name] = resolved;\n\t\t\tadded += 1;\n\t\t}\n\t\tif (added > 0) {\n\t\t\tconst toolRefreshGeneration = this.#toolRefreshGeneration + 1;\n\t\t\tthis.#toolRefreshGeneration = toolRefreshGeneration;\n\t\t\tawait this.#syncFromConfig(config, this.#sessionOptions, false, pi, toolRefreshGeneration);\n\t\t\tawait this.#registerDirectTools(pi);\n\t\t}\n\t\treturn warnings;\n\t}\n\n\t/** Registered searchable catalog (mapped name + server-side tool name),\n\t * used by the skills loader to compute activation targets. */\n\tgetTierBSearchable(): ReadonlyArray<{ name: string; toolName: string; server: string }> {\n\t\treturn this.#tierBRegistration?.searchable ?? [];\n\t}\n\n\t/** Connected servers that list prompts (todo 40), for slash registration. */\n\tgetMcpPromptServers(): readonly import(\"./prompts.ts\").McpPromptServer[] {\n\t\treturn this.#tierBRegistration?.promptServers ?? [];\n\t}\n\n\t/** Connected servers that list resources (todo 39), for mention expansion. */\n\tgetMcpResourceServers(): readonly McpResourceServer[] {\n\t\treturn this.#tierBRegistration?.resourceServers ?? [];\n\t}\n\n\t/** Reveal skill-owned tools (todo 37): activation is effective the next\n\t * turn, exactly like an 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\tconst entries = [...this.#connections.values()];\n\t\tthis.#connections.clear();\n\t\tthis.#connectionKeysByName.clear();\n\t\tawait Promise.all(entries.map((entry) => disposeEntryConnection(entry)));\n\t\tawait cleanupMcpOutputArtifacts();\n\t}\n\n\tisDisposed(): boolean {\n\t\treturn this.#disposed;\n\t}\n\n\tgetConnection(name: string): ServerConnection | undefined {\n\t\tconst key = this.#connectionKeysByName.get(name);\n\t\treturn key === undefined ? undefined : this.#connections.get(key)?.connection;\n\t}\n\n\tasync reconnectServer(name: string): Promise<void> {\n\t\tconst entry = this.#entryForName(name);\n\t\tif (entry === undefined) throw new Error(`Unknown MCP server: ${name || \"<missing>\"}`);\n\t\tawait reconnectMcpNow(entry.connection);\n\t}\n\n\tgetServerSnapshots(): McpServerSnapshot[] {\n\t\tconst names = new Set<string>(Object.keys(this.#config?.servers ?? {}));\n\t\tfor (const entry of this.#connections.values()) names.add(entry.name);\n\t\treturn [...names].sort().map((name) => this.#serverSnapshot(name));\n\t}\n\n\tgetLogLines(name: string, maxLines: number): string[] {\n\t\tconst key = this.#connectionKeysByName.get(name);\n\t\tconst lines = key === undefined ? [] : (this.#connections.get(key)?.logger.getRingBuffer() ?? []);\n\t\treturn lines.slice(Math.max(0, lines.length - maxLines));\n\t}\n\n\tasync getServerExposureStatus(name: string): Promise<McpServerExposureStatus> {\n\t\treturn await getMcpServiceExposureStatus(name, this.#config, this.#entryForName(name));\n\t}\n\n\trecordCall(name: string, elapsedMs: number, failed: boolean): void {\n\t\tconst key = this.#connectionKeysByName.get(name);\n\t\tconst entry = key === undefined ? undefined : this.#connections.get(key);\n\t\tif (entry === undefined) return;\n\t\tentry.counters.callCount += 1;\n\t\tentry.counters.totalLatencyMs += elapsedMs;\n\t\tif (failed) entry.counters.errorCount += 1;\n\t}\n\n\tgetSnapshot(): McpServiceSnapshot {\n\t\treturn {\n\t\t\tdisposed: this.#disposed,\n\t\t\tdisposeCount: this.#disposeCount,\n\t\t\tlastDisposeReason: this.#lastDisposeReason,\n\t\t\tsessionStartCount: this.#sessionStartCount,\n\t\t\tlastSessionStartReason: this.#lastSessionStartReason,\n\t\t\thasSessionContext: this.#sessionContext !== null,\n\t\t\tconnectionCount: this.#connections.size,\n\t\t};\n\t}\n\n\tasync #syncFromConfig(\n\t\tconfig: ResolvedMcpConfig,\n\t\toptions: McpSessionOptions,\n\t\tuseCache: boolean,\n\t\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\"> | undefined,\n\t\ttoolRefreshGeneration: number,\n\t): Promise<void> {\n\t\tconst cache = await readMcpCatalogCache(options.agentDir);\n\t\tconst hadConnectionsBeforeSync = this.#connections.size > 0;\n\t\tthis.#refreshActiveSetWhenNoTools = Object.keys(config.servers).length > 0 || hadConnectionsBeforeSync;\n\t\tconst wanted = new Map<string, ResolvedMcpServer>();\n\t\tvisitSpawnableMcpServers(config, (name, server) => {\n\t\t\twanted.set(name, server);\n\t\t});\n\t\tconst disposals: Promise<void>[] = [];\n\t\tfor (const entry of this.#connections.values()) {\n\t\t\tconst server = wanted.get(entry.name);\n\t\t\tconst key = server?.configHash === undefined ? undefined : `${entry.name}\\0${server.configHash}`;\n\t\t\tif (key === entry.key) continue;\n\t\t\tthis.#connections.delete(entry.key);\n\t\t\tthis.#connectionKeysByName.delete(entry.name);\n\t\t\tdisposals.push(disposeEntryConnection(entry));\n\t\t}\n\t\tawait Promise.all(disposals);\n\n\t\tconst connects: Promise<void>[] = [];\n\t\tfor (const [name, server] of wanted) {\n\t\t\tif (server.config === undefined || server.configHash === undefined) continue;\n\t\t\tconst key = `${name}\\0${server.configHash}`;\n\t\t\tif (this.#connections.has(key)) continue;\n\t\t\tconst logger = createMcpLogger(name, { logDir: options.logDir });\n\t\t\tconst authPlan = resolveServerAuth({\n\t\t\t\tagentDir: options.agentDir,\n\t\t\t\tconfig: server.config,\n\t\t\t\tenv: options.env,\n\t\t\t\tlogger,\n\t\t\t\tserverName: name,\n\t\t\t});\n\t\t\tfor (const warning of detectLiteralBearerWarnings(name, server.config)) logger.warn(warning);\n\t\t\tconst connection = new ServerConnection({\n\t\t\t\tauthProvider: authPlan.provider,\n\t\t\t\tconfig: server.config,\n\t\t\t\tenv: options.env,\n\t\t\t\tlogger,\n\t\t\t\tserverName: name,\n\t\t\t});\n\t\t\tconst cachedCatalog = useCache ? getValidCachedServer(cache, name, server.configHash) : undefined;\n\t\t\tconst entry: McpConnectionEntry = {\n\t\t\t\tagentDir: options.agentDir,\n\t\t\t\tauthPlan,\n\t\t\t\tcacheRefreshedAfterConnect: false,\n\t\t\t\tcachedCatalog,\n\t\t\t\tkey,\n\t\t\t\tname,\n\t\t\t\tconfigHash: server.configHash,\n\t\t\t\tconnection,\n\t\t\t\tlogger,\n\t\t\t\tcreatedAtMs: Date.now(),\n\t\t\t\tcounters: { callCount: 0, errorCount: 0, totalLatencyMs: 0, reconnectCount: 0 },\n\t\t\t};\n\t\t\tconfigureMcpConnectionLifecycle(connection, server.config, logger);\n\t\t\tconfigureMcpReconnect({\n\t\t\t\tconnection,\n\t\t\t\tlogger,\n\t\t\t\treconnect: async () => {\n\t\t\t\t\tentry.counters.reconnectCount += 1;\n\t\t\t\t\tentry.cacheRefreshedAfterConnect = false;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait entry.authPlan?.refresh?.ensureFresh();\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconst authError = markMcpConnectionNeedsAuth(entry.connection, error);\n\t\t\t\t\t\tif (authError !== undefined) {\n\t\t\t\t\t\t\tentry.logger.warn(authError.message);\n\t\t\t\t\t\t\tthrow authError;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\tawait entry.connection.renew();\n\t\t\t\t\tawait connectAndRefreshMcpCatalog(entry, server.config);\n\t\t\t\t},\n\t\t\t\tshouldReconnect: () => !this.#disposed && this.#entryForName(name) === entry,\n\t\t\t});\n\t\t\tthis.#connections.set(key, entry);\n\t\t\tthis.#connectionKeysByName.set(name, key);\n\t\t\tthis.#wireListChanged(entry);\n\t\t\tif (shouldRaceMcpStartup(server.config.lifecycle)) {\n\t\t\t\tconnects.push(\n\t\t\t\t\traceMcpStartupConnect({\n\t\t\t\t\t\tentry,\n\t\t\t\t\t\tpi,\n\t\t\t\t\t\tregisterDirectTools: (targetPi) => this.#registerDirectTools(targetPi),\n\t\t\t\t\t\tserverConfig: server.config,\n\t\t\t\t\t\tshouldRefreshTools: () => !this.#disposed && this.#toolRefreshGeneration === toolRefreshGeneration,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else if (cachedCatalog === undefined) {\n\t\t\t\tconnects.push(ignoreStartupNeedsAuth(entry, connectAndRefreshMcpCatalog(entry, server.config)));\n\t\t\t}\n\t\t}\n\t\tawait Promise.all(connects);\n\t}\n\n\t#wireListChanged(entry: McpConnectionEntry): void {\n\t\tconst sink = { logger: { error: (message: string, data?: unknown) => entry.logger.error(message, data) } };\n\t\tconst coalescer = createMcpListChangeCoalescer({\n\t\t\tonRefresh: () => this.#handleServerToolsChanged(entry),\n\t\t\tscope: `mcp.list_changed.${entry.name}`,\n\t\t\tsink,\n\t\t});\n\t\tconst unsubscribe = entry.connection.onToolsChanged(() => coalescer.notify());\n\t\tentry.disposeListChanged = () => {\n\t\t\tunsubscribe();\n\t\t\tcoalescer.dispose();\n\t\t};\n\t}\n\n\t// Re-list a server on a coalesced list_changed and re-register: added tools\n\t// enter INACTIVE (registerToolsPreservingActiveSet keeps the active set), and\n\t// removed tools are tombstoned so a stale call fails cleanly.\n\tasync #handleServerToolsChanged(entry: McpConnectionEntry): Promise<void> {\n\t\tconst pi = this.#pi;\n\t\tconst config = this.#config;\n\t\tif (pi === undefined || config === null) return;\n\t\tconst server = config.servers[entry.name];\n\t\tif (server?.config === undefined || entry.connection.state !== \"connected\") return;\n\t\tconst catalog = await collectToolCatalog(entry.name, entry.connection, server.config, {\n\t\t\tagentDir: entry.agentDir,\n\t\t\toutputGuard: config.settings.outputGuard,\n\t\t});\n\t\tconst newNames = mapMcpCatalogNames(catalog).map(({ name }) => name);\n\t\tconst diff = diffMcpToolNames(entry.knownToolNames ?? newNames, newNames);\n\t\t// Tombstone removed tools BEFORE re-registration so the subsequent\n\t\t// setActiveTools (which excludes them) leaves the tombstones inactive.\n\t\tfor (const removed of diff.removed) pi.registerTool(buildMcpTombstoneDefinition(removed, entry.name));\n\t\tawait this.#registerDirectTools(pi);\n\t\tentry.knownToolNames = newNames;\n\t\tentry.lastListChangedDelta = formatMcpListChangedDelta(diff);\n\t}\n\n\tasync #registerDirectTools(\n\t\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\t): Promise<void> {\n\t\tconst config = this.#config;\n\t\tif (config === null) return;\n\t\tthis.#tierBRegistration = await registerMcpServiceDirectTools(pi, config, this.#connections.values(), {\n\t\t\trefreshActiveSetWhenEmpty: this.#refreshActiveSetWhenNoTools,\n\t\t});\n\t\t// A (re-)registration recomputes the active set from config alone, so any\n\t\t// promotions recorded in history are worth replaying on the next scan.\n\t\tthis.#historyScanned = false;\n\t}\n\n\t/**\n\t * Replay 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\t#entryForName(name: string): McpConnectionEntry | undefined {\n\t\tconst key = this.#connectionKeysByName.get(name);\n\t\treturn key === undefined ? undefined : this.#connections.get(key);\n\t}\n\n\tgetPendingAuth(): Map<string, import(\"./auth/oauth-provider.ts\").McpOAuthProvider> {\n\t\treturn this.#pendingAuth;\n\t}\n\n\tgetAuthTarget(\n\t\tname: string,\n\t):\n\t\t| { config: McpServerConfig; agentDir?: string; env?: Record<string, string | undefined>; callbackUrl?: string }\n\t\t| undefined {\n\t\tconst server = this.#config?.servers[name];\n\t\tif (server?.config === undefined) return undefined;\n\t\treturn {\n\t\t\tconfig: server.config,\n\t\t\tagentDir: this.#authAgentDir,\n\t\t\tenv: this.#authEnv,\n\t\t\tcallbackUrl: this.#config?.settings.oauthCallbackUrl,\n\t\t};\n\t}\n\n\tgetCachedInstructions(name: string): string | undefined {\n\t\treturn this.#entryForName(name)?.cachedCatalog?.instructions;\n\t}\n\n\t/** Resolved `settings.nativeToolSearch` (auto | true | false | undefined).\n\t * Drives the native provider tool-search adapter gate. */\n\tgetNativeToolSearchSetting(): \"auto\" | boolean | undefined {\n\t\treturn this.#config?.settings.nativeToolSearch;\n\t}\n}\n\nlet service: McpService | null = null;\n\nexport function getMcpService(): McpService {\n\tif (service === null || service.isDisposed()) {\n\t\tservice = new McpService();\n\t}\n\treturn service;\n}\n\nexport function shouldDisposeMcpService(reason: SessionShutdownEvent[\"reason\"]): reason is McpDisposeReason {\n\treturn reason === \"quit\" || reason === \"reload\";\n}\n\nasync function disposeEntryConnection(entry: McpConnectionEntry): Promise<void> {\n\tentry.disposeListChanged?.();\n\tdisposeMcpReconnect(entry.connection);\n\tdisposeMcpConnectionLifecycle(entry.connection);\n\tawait entry.connection.dispose();\n}\n\nexport function resetMcpServiceForTests(): void {\n\tservice = null;\n}\n"]}
package/docs/AGENTS.md ADDED
@@ -0,0 +1,70 @@
1
+ # packages/coding-agent/docs/
2
+
3
+ Public documentation for `@code-yeongyu/senpi`. Shipped inside the npm package: `package.json`
4
+ `files` array includes `"docs"`, so every file here lands in the published tarball.
5
+
6
+ ## Navigation manifest
7
+
8
+ `docs.json` has two top-level keys: `navigation` (ordered section and page list) and `redirects`.
9
+ Page paths are relative to this directory.
10
+
11
+ - Every new `.md` file needs an entry in `docs.json` under `navigation`.
12
+ - Renamed or moved pages need a `redirects` entry to avoid broken links.
13
+ - Navigation-only stubs without real content belong in `redirects`, not `navigation`.
14
+
15
+ ## Landing page and images
16
+
17
+ `index.md` is the landing page. Images live under `docs/images/`:
18
+ `doom-extension.png`, `exy.png`, `interactive-mode.png`, `tree-view.png`.
19
+
20
+ New images go in `docs/images/`. Don't reference images by absolute URL when a relative path works.
21
+
22
+ ## Protocol and reference pages
23
+
24
+ These pages must track their implementation counterparts. Treat them as specs, not tutorials.
25
+
26
+ | Page | Tracks |
27
+ |------|--------|
28
+ | `rpc.md` | `packages/coding-agent/src/modes/rpc/` |
29
+ | `app-server.md` | `packages/coding-agent/src/modes/app-server/` |
30
+ | `json.md` | JSONL wire format and record shapes |
31
+ | `session-format.md` | Session file structure and field types |
32
+
33
+ Preserve LF line endings and exact field names in these pages. Field spellings and JSONL record
34
+ structures are asserted by tests; prose-only rewording can still break them.
35
+
36
+ ## Validators
37
+
38
+ - `scripts/check-mcp-docs.test.mjs`: Parses `config-schema.ts` key names as raw text and
39
+ checks that every field has a `### \`field\`` heading in `mcp.md`. Runs under
40
+ `npm run test:scripts`. Schema additions without a matching doc heading break CI.
41
+
42
+ - `packages/coding-agent/test/qa/app-server/task20-doc-example-check.ts`: Spins up a live
43
+ app-server process and validates that JSON examples in `app-server.md` match actual server
44
+ behavior. Prose edits to `app-server.md` that change JSON shapes will fail this test.
45
+
46
+ ## Terminology
47
+
48
+ Docs mix `senpi` and upstream `Pi` branding in legacy text. Don't do broad rebrand sweeps
49
+ during focused edits; update only the immediate context you're working in.
50
+
51
+ Consistent names: CLI binary is `senpi`, config directory is `.senpi`, npm package is
52
+ `@code-yeongyu/senpi`. Don't use `codex`, `pi`, or `openai-codex` in new prose.
53
+
54
+ ## Security rules
55
+
56
+ - `bearerTokenEnv` names an environment variable, not a token value. Examples must never put
57
+ a literal token in the JSON config; the implementation warns when it detects one.
58
+ - OAuth tokens persist under the agent directory at runtime. Don't surface them in doc examples
59
+ or log snippets.
60
+ - MCP config values are not shell-expanded. Don't document or imply `$VAR` substitution in
61
+ JSON config examples.
62
+ - `mcp.md` must not advertise URL-mode elicitation; it's not a shipped feature.
63
+
64
+ ## Anti-patterns
65
+
66
+ - No new `.md` file without a `docs.json` entry.
67
+ - Don't edit protocol page prose without checking whether `task20-doc-example-check.ts` or
68
+ `check-mcp-docs.test.mjs` would break.
69
+ - Don't copy claims from upstream Pi docs without verifying they apply to the senpi fork.
70
+ - Don't embed bearer tokens, session IDs, or raw API keys in example output.
package/docs/mcp.md CHANGED
@@ -26,7 +26,7 @@ catalog costs almost nothing until the model actually needs it.
26
26
  summary, `/mcp add <name> <command...>` to add servers interactively.
27
27
  3. Servers needing OAuth: `/mcp login <name>` (see [Auth](#auth)).
28
28
  4. Use it: small catalogs register directly; big ones surface through
29
- `mcp_search` (see [Exposure tiers](#exposure-tiers)).
29
+ `tool_search` (see [Exposure tiers](#exposure-tiers)).
30
30
 
31
31
  ## Configuration reference
32
32
 
@@ -95,7 +95,7 @@ Glob denylist applied after `includeTools`.
95
95
 
96
96
  ### `directTools`
97
97
  `true` = every filtered tool active immediately; or an array of names/globs
98
- that stay active while the rest goes behind `mcp_search`. Default: none.
98
+ that stay active while the rest goes behind `tool_search`. Default: none.
99
99
 
100
100
  ### `exposure`
101
101
  `"auto"` (default), `"direct"`, `"search"`, or `"proxy"`. See
@@ -134,14 +134,14 @@ the stub for the full schema in place. Default `false`.
134
134
  ### `nativeToolSearch`
135
135
  `"auto"` (default) | `true` | `false`. On Anthropic models, defers inactive
136
136
  MCP tools to the provider's native tool-search; any 400 falls back to the
137
- local `mcp_search` for the session.
137
+ local `tool_search` for the session.
138
138
 
139
139
  ## Exposure tiers
140
140
 
141
141
  | Tier | When | Cost profile |
142
142
  |---|---|---|
143
143
  | direct | `exposure:"direct"`, `directTools:true`, or `auto` at/below `searchThreshold` | Every tool schema on every request |
144
- | search (Tier-B) | `exposure:"search"` or `auto` above the threshold | Full catalog registered, ~135 tokens resident (`mcp_search` only); matches promote next turn; promotions survive resume/compaction |
144
+ | search (Tier-B) | `exposure:"search"` or `auto` above the threshold | Full catalog registered, ~135 tokens resident (`tool_search` only); matches promote next turn; promotions survive resume/compaction |
145
145
  | proxy (Tier-C) | `exposure:"proxy"` only — never `auto` | One `mcp_<server>` gateway tool (`search`/`describe`/`call` with JSON-string args); cheapest, but no provider-side argument validation |
146
146
 
147
147
  Skills can carry MCP servers too (an `mcp.json` sidecar next to SKILL.md, or a
@@ -181,7 +181,7 @@ with a configured server resolves in favor of your config.
181
181
  | `needs_auth` | 401 and no usable token | `/mcp login <name>` |
182
182
  | `suspended` | reconnect circuit breaker opened (5 failures/30s) | fix the server, then `/mcp reconnect <name>` |
183
183
  | `degraded` | transient failure; auto-reconnect with backoff is running | wait, or `/mcp reconnect <name>` |
184
- | tools missing | server filtered/disabled, or hidden behind search | check `includeTools`/`excludeTools`, ask the model to `mcp_search` |
184
+ | tools missing | server filtered/disabled, or hidden behind search | check `includeTools`/`excludeTools`, ask the model to `tool_search` |
185
185
  | child exits at spawn (EOF) | bad `command`/`args`/`env` | `/mcp logs <name>` shows the captured stderr |
186
186
  | slow first call | lazy server cold boot | use `lifecycle:"eager"` or `"keep-alive"` |
187
187
 
@@ -9,6 +9,7 @@ extensions/ Tools, commands, UI, providers, hooks, resources
9
9
  extensions/*/ Multi-file examples and nested private workspaces
10
10
  sdk/ Programmatic SDK usage
11
11
  rpc-extension-ui.ts RPC-compatible extension UI example
12
+ extensions/kimi-deferred-tools.ts Deferred tool discovery/activation example
12
13
  ```
13
14
 
14
15
  ## CONVENTIONS
@@ -18,6 +19,8 @@ rpc-extension-ui.ts RPC-compatible extension UI example
18
19
  - Extension factories have no top-level runtime side effects. Register work through the public `pi.*` API and lifecycle events.
19
20
  - New interactive examples should use configurable keybindings and themed TUI helpers. Existing demos may keep fixed controls when the control scheme is part of the example. Direct terminal writes belong only in examples explicitly teaching a terminal protocol; ordinary SDK examples may use normal stdout.
20
21
  - Tool string enums use the shared `StringEnum` helper for provider compatibility.
22
+ - SDK examples should use `ModelRuntime` for auth/custom-model/session composition; deprecated static catalog helpers import from `@earendil-works/pi-ai/compat`.
23
+ - Deferred-tool examples preserve the Kimi flow: expose search first, activate via `pi.setActiveTools()`, and register lifecycle work in `session_start`.
21
24
  - Stateful examples persist reconstructable state in session entries or tool-result details so fork/resume behavior remains valid.
22
25
  - Nested example packages are private workspaces with exact-pinned dependencies. Treat their manifests and lock impact as production dependency changes.
23
26
 
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [2026.7.17-3] - 2026-07-17
4
+
5
+ ### Breaking Changes
6
+
7
+ ### Added
8
+
9
+ ### Changed
10
+
11
+ ### Fixed
12
+
13
+ ### Removed
14
+
3
15
  ## [2026.7.17-2] - 2026-07-17
4
16
 
5
17
  ### Added
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/senpi-codemode",
3
- "version": "2026.7.17-2",
3
+ "version": "2026.7.17-3",
4
4
  "description": "Source-only senpi extension package for codemode evaluation tools",
5
5
  "type": "module",
6
6
  "main": "./src/index.ts",
@@ -30,14 +30,14 @@
30
30
  },
31
31
  "dependencies": {
32
32
  "@babel/parser": "7.29.7",
33
- "@earendil-works/pi-ai": "^2026.7.17-2",
33
+ "@earendil-works/pi-ai": "^2026.7.17-3",
34
34
  "typebox": "1.1.38"
35
35
  },
36
36
  "peerDependencies": {
37
37
  "@code-yeongyu/senpi": "*"
38
38
  },
39
39
  "devDependencies": {
40
- "@code-yeongyu/senpi": "2026.7.17-2"
40
+ "@code-yeongyu/senpi": "2026.7.17-3"
41
41
  },
42
42
  "keywords": [
43
43
  "senpi",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@earendil-works/pi-agent-core",
3
3
  "private": true,
4
- "version": "2026.7.17-2",
4
+ "version": "2026.7.17-3",
5
5
  "description": "General-purpose agent with transport abstraction, state management, and attachment support",
6
6
  "type": "module",
7
7
  "main": "./dist/index.js",
@@ -30,7 +30,7 @@
30
30
  "prepublishOnly": "npm run clean && npm run build"
31
31
  },
32
32
  "dependencies": {
33
- "@earendil-works/pi-ai": "^2026.7.17-2",
33
+ "@earendil-works/pi-ai": "^2026.7.17-3",
34
34
  "ignore": "7.0.5",
35
35
  "typebox": "1.1.38",
36
36
  "yaml": "2.9.0"
@@ -1 +1 @@
1
- {"version":3,"file":"openai-completions.d.ts","sourceRoot":"","sources":["../../src/api/openai-completions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAOX,0BAA0B,EAG1B,MAAM,sCAAsC,CAAC;AAG9C,OAAO,KAAK,EAIX,OAAO,EAGP,KAAK,EACL,uBAAuB,EAGvB,mBAAmB,EAEnB,cAAc,EACd,aAAa,EAMb,MAAM,aAAa,CAAC;AA2IrB,MAAM,WAAW,wBAAyB,SAAQ,aAAa;IAC9D,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAC7F,eAAe,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;CAC1E;AAOD,KAAK,+BAA+B,GAAG,IAAI,CAC1C,QAAQ,CAAC,uBAAuB,CAAC,EACjC,oBAAoB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,kBAAkB,CAClF,GAAG;IACH,kBAAkB,CAAC,EAAE,uBAAuB,CAAC,oBAAoB,CAAC,CAAC;IACnE,cAAc,CAAC,EAAE,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;IAC3D,iBAAiB,CAAC,EAAE,uBAAuB,CAAC,mBAAmB,CAAC,CAAC;IACjE,gBAAgB,CAAC,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;CAC/D,CAAC;AAmCF,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,oBAAoB,EAAE,wBAAwB,CA0VjF,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,oBAAoB,EAAE,mBAAmB,CAsBlF,CAAC;AAyWF,wBAAgB,eAAe,CAC9B,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,EAClC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,+BAA+B,EACvC,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1C,0BAA0B,EAAE,CAwQ9B"}
1
+ {"version":3,"file":"openai-completions.d.ts","sourceRoot":"","sources":["../../src/api/openai-completions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAOX,0BAA0B,EAG1B,MAAM,sCAAsC,CAAC;AAG9C,OAAO,KAAK,EAIX,OAAO,EAGP,KAAK,EACL,uBAAuB,EAGvB,mBAAmB,EAEnB,cAAc,EACd,aAAa,EAMb,MAAM,aAAa,CAAC;AA2IrB,MAAM,WAAW,wBAAyB,SAAQ,aAAa;IAC9D,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAC7F,eAAe,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;CAC1E;AAOD,KAAK,+BAA+B,GAAG,IAAI,CAC1C,QAAQ,CAAC,uBAAuB,CAAC,EACjC,oBAAoB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,kBAAkB,CAClF,GAAG;IACH,kBAAkB,CAAC,EAAE,uBAAuB,CAAC,oBAAoB,CAAC,CAAC;IACnE,cAAc,CAAC,EAAE,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;IAC3D,iBAAiB,CAAC,EAAE,uBAAuB,CAAC,mBAAmB,CAAC,CAAC;IACjE,gBAAgB,CAAC,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;CAC/D,CAAC;AAmCF,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,oBAAoB,EAAE,wBAAwB,CA2VjF,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,oBAAoB,EAAE,mBAAmB,CAsBlF,CAAC;AAyWF,wBAAgB,eAAe,CAC9B,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,EAClC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,+BAA+B,EACvC,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1C,0BAA0B,EAAE,CAwQ9B"}
@@ -141,6 +141,7 @@ export const stream = (model, context, options) => {
141
141
  if (nextParams !== undefined) {
142
142
  params = nextParams;
143
143
  }
144
+ params = normalizeRequestToolSchemas(params, compat);
144
145
  const requestOptions = {
145
146
  ...(options?.signal ? { signal: options.signal } : {}),
146
147
  ...(options?.timeoutMs !== undefined ? { timeout: options.timeoutMs } : {}),
@@ -992,6 +993,24 @@ function convertTools(tools, compat) {
992
993
  };
993
994
  });
994
995
  }
996
+ function normalizeRequestToolSchemas(params, compat) {
997
+ if (!params.tools)
998
+ return params;
999
+ return {
1000
+ ...params,
1001
+ tools: params.tools.map((tool) => {
1002
+ if (tool.type !== "function" || !tool.function.parameters)
1003
+ return tool;
1004
+ const parameters = compat.toolSchemaFlavor === "moonshot-mfjs"
1005
+ ? normalizeToolParametersForMoonshot(tool.function.parameters)
1006
+ : normalizeToolParametersForOpenAICompat(tool.function.parameters);
1007
+ return {
1008
+ ...tool,
1009
+ function: { ...tool.function, parameters },
1010
+ };
1011
+ }),
1012
+ };
1013
+ }
995
1014
  function parseChunkUsage(rawUsage, model) {
996
1015
  const promptTokens = rawUsage.prompt_tokens || 0;
997
1016
  const cacheReadTokens = rawUsage.prompt_tokens_details?.cached_tokens ?? rawUsage.prompt_cache_hit_tokens ?? 0;