@openeryc/pi-coding-agent 0.75.48 → 0.75.50

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 (36) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/core/agent-session.d.ts +9 -0
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +20 -1
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/mcp/client.d.ts +6 -0
  7. package/dist/core/mcp/client.d.ts.map +1 -1
  8. package/dist/core/mcp/client.js +84 -39
  9. package/dist/core/mcp/client.js.map +1 -1
  10. package/dist/core/mcp/manager.d.ts +21 -1
  11. package/dist/core/mcp/manager.d.ts.map +1 -1
  12. package/dist/core/mcp/manager.js +186 -57
  13. package/dist/core/mcp/manager.js.map +1 -1
  14. package/dist/core/mcp/types.d.ts +12 -0
  15. package/dist/core/mcp/types.d.ts.map +1 -1
  16. package/dist/core/mcp/types.js +3 -0
  17. package/dist/core/mcp/types.js.map +1 -1
  18. package/dist/core/settings-manager.d.ts +5 -0
  19. package/dist/core/settings-manager.d.ts.map +1 -1
  20. package/dist/core/settings-manager.js.map +1 -1
  21. package/dist/modes/interactive/components/mcp-selector.d.ts +1 -1
  22. package/dist/modes/interactive/components/mcp-selector.d.ts.map +1 -1
  23. package/dist/modes/interactive/components/mcp-selector.js +3 -1
  24. package/dist/modes/interactive/components/mcp-selector.js.map +1 -1
  25. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  26. package/dist/modes/interactive/interactive-mode.js +9 -15
  27. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  28. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  29. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  30. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  31. package/examples/extensions/sandbox/package-lock.json +2 -2
  32. package/examples/extensions/sandbox/package.json +1 -1
  33. package/examples/extensions/with-deps/package-lock.json +2 -2
  34. package/examples/extensions/with-deps/package.json +1 -1
  35. package/npm-shrinkwrap.json +12 -12
  36. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/mcp-selector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAgC,MAAM,kBAAkB,CAAC;AAK3E,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,UAAU,CAAC;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,oBAAqB,SAAQ,SAAS;IAClD,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAO;IACvB,OAAO,CAAC,SAAS,CAAO;IAExB,YAAY,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,EAkC1G;IAED,OAAO,CAAC,WAAW;IAWnB,UAAU,IAAI,IAAI,CAYjB;IAED,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAIrC;IAED,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAcjC;CACD","sourcesContent":["/**\n * Interactive selector component for managing items (MCP servers, skills, etc).\n * Shows items with status, Space toggles, Esc closes.\n */\n\nimport { Container, getKeybindings, Spacer, Text } from \"@openeryc/pi-tui\";\nimport { theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyHint, rawKeyHint } from \"./keybinding-hints.ts\";\n\nexport interface McpServerItem {\n\tname: string;\n\tstatus: \"connected\" | \"disconnected\" | \"disabled\";\n\ttoolCount: number;\n\ttransport: string;\n}\n\nexport class McpSelectorComponent extends Container {\n\tprivate items: McpServerItem[];\n\tprivate selectedIndex = 0;\n\tprivate listContainer: Container;\n\tprivate onToggleCallback: (name: string) => void;\n\tprivate onCancelCallback: () => void;\n\tprivate hintText: Text;\n\tprivate itemsText: Text;\n\n\tconstructor(title: string, servers: McpServerItem[], onToggle: (name: string) => void, onCancel: () => void) {\n\t\tsuper();\n\n\t\tthis.items = servers;\n\t\tthis.onToggleCallback = onToggle;\n\t\tthis.onCancelCallback = onCancel;\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"accent\", theme.bold(title)), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.hintText = new Text(theme.fg(\"dim\", \"Space = toggle | Esc = close\"), 1, 0);\n\t\tthis.addChild(this.hintText);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.itemsText = new Text(\n\t\t\trawKeyHint(\"↑↓\", \"navigate\") +\n\t\t\t\t\" \" +\n\t\t\t\trawKeyHint(\"Space\", \"toggle\") +\n\t\t\t\t\" \" +\n\t\t\t\tkeyHint(\"tui.select.cancel\", \"close\"),\n\t\t\t1,\n\t\t\t0,\n\t\t);\n\t\tthis.addChild(this.itemsText);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.updateList();\n\t}\n\n\tprivate statusColor(status: McpServerItem[\"status\"]): string {\n\t\tswitch (status) {\n\t\t\tcase \"connected\":\n\t\t\t\treturn theme.fg(\"success\", \"connected\");\n\t\t\tcase \"disconnected\":\n\t\t\t\treturn theme.fg(\"warning\", \"disconnected\");\n\t\t\tcase \"disabled\":\n\t\t\t\treturn theme.fg(\"muted\", \"disabled\");\n\t\t}\n\t}\n\n\tupdateList(): void {\n\t\tthis.listContainer.clear();\n\t\tfor (let i = 0; i < this.items.length; i++) {\n\t\t\tconst item = this.items[i];\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst status = this.statusColor(item.status);\n\t\t\tconst info = `(${status} | ${item.transport}${item.toolCount > 0 ? ` | ${item.toolCount} tools` : \"\"})`;\n\t\t\tconst text = isSelected\n\t\t\t\t? `${theme.fg(\"accent\", \"→ \") + theme.fg(\"accent\", theme.bold(item.name))} ${info}`\n\t\t\t\t: ` ${theme.fg(\"text\", item.name)} ${theme.fg(\"dim\", info)}`;\n\t\t\tthis.listContainer.addChild(new Text(text, 1, 0));\n\t\t}\n\t}\n\n\tsetItems(items: McpServerItem[]): void {\n\t\tthis.items = items;\n\t\tthis.selectedIndex = Math.min(this.selectedIndex, Math.max(0, items.length - 1));\n\t\tthis.updateList();\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(keyData, \"tui.select.up\") || keyData === \"k\") {\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"tui.select.down\") || keyData === \"j\") {\n\t\t\tthis.selectedIndex = Math.min(this.items.length - 1, this.selectedIndex + 1);\n\t\t\tthis.updateList();\n\t\t} else if (keyData === \" \") {\n\t\t\tconst selected = this.items[this.selectedIndex];\n\t\t\tif (selected) this.onToggleCallback(selected.name);\n\t\t} else if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"mcp-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/mcp-selector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAgC,MAAM,kBAAkB,CAAC;AAK3E,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,UAAU,GAAG,cAAc,CAAC;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,oBAAqB,SAAQ,SAAS;IAClD,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAO;IACvB,OAAO,CAAC,SAAS,CAAO;IAExB,YAAY,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,EAkC1G;IAED,OAAO,CAAC,WAAW;IAanB,UAAU,IAAI,IAAI,CAYjB;IAED,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAIrC;IAED,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAcjC;CACD","sourcesContent":["/**\n * Interactive selector component for managing items (MCP servers, skills, etc).\n * Shows items with status, Space toggles, Esc closes.\n */\n\nimport { Container, getKeybindings, Spacer, Text } from \"@openeryc/pi-tui\";\nimport { theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyHint, rawKeyHint } from \"./keybinding-hints.ts\";\n\nexport interface McpServerItem {\n\tname: string;\n\tstatus: \"connected\" | \"disconnected\" | \"disabled\" | \"reconnecting\";\n\ttoolCount: number;\n\ttransport: string;\n}\n\nexport class McpSelectorComponent extends Container {\n\tprivate items: McpServerItem[];\n\tprivate selectedIndex = 0;\n\tprivate listContainer: Container;\n\tprivate onToggleCallback: (name: string) => void;\n\tprivate onCancelCallback: () => void;\n\tprivate hintText: Text;\n\tprivate itemsText: Text;\n\n\tconstructor(title: string, servers: McpServerItem[], onToggle: (name: string) => void, onCancel: () => void) {\n\t\tsuper();\n\n\t\tthis.items = servers;\n\t\tthis.onToggleCallback = onToggle;\n\t\tthis.onCancelCallback = onCancel;\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"accent\", theme.bold(title)), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.hintText = new Text(theme.fg(\"dim\", \"Space = toggle | Esc = close\"), 1, 0);\n\t\tthis.addChild(this.hintText);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.itemsText = new Text(\n\t\t\trawKeyHint(\"↑↓\", \"navigate\") +\n\t\t\t\t\" \" +\n\t\t\t\trawKeyHint(\"Space\", \"toggle\") +\n\t\t\t\t\" \" +\n\t\t\t\tkeyHint(\"tui.select.cancel\", \"close\"),\n\t\t\t1,\n\t\t\t0,\n\t\t);\n\t\tthis.addChild(this.itemsText);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.updateList();\n\t}\n\n\tprivate statusColor(status: McpServerItem[\"status\"]): string {\n\t\tswitch (status) {\n\t\t\tcase \"connected\":\n\t\t\t\treturn theme.fg(\"success\", \"connected\");\n\t\t\tcase \"reconnecting\":\n\t\t\t\treturn theme.fg(\"warning\", \"reconnecting...\");\n\t\t\tcase \"disconnected\":\n\t\t\t\treturn theme.fg(\"error\", \"disconnected\");\n\t\t\tcase \"disabled\":\n\t\t\t\treturn theme.fg(\"muted\", \"disabled\");\n\t\t}\n\t}\n\n\tupdateList(): void {\n\t\tthis.listContainer.clear();\n\t\tfor (let i = 0; i < this.items.length; i++) {\n\t\t\tconst item = this.items[i];\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst status = this.statusColor(item.status);\n\t\t\tconst info = `(${status} | ${item.transport}${item.toolCount > 0 ? ` | ${item.toolCount} tools` : \"\"})`;\n\t\t\tconst text = isSelected\n\t\t\t\t? `${theme.fg(\"accent\", \"→ \") + theme.fg(\"accent\", theme.bold(item.name))} ${info}`\n\t\t\t\t: ` ${theme.fg(\"text\", item.name)} ${theme.fg(\"dim\", info)}`;\n\t\t\tthis.listContainer.addChild(new Text(text, 1, 0));\n\t\t}\n\t}\n\n\tsetItems(items: McpServerItem[]): void {\n\t\tthis.items = items;\n\t\tthis.selectedIndex = Math.min(this.selectedIndex, Math.max(0, items.length - 1));\n\t\tthis.updateList();\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(keyData, \"tui.select.up\") || keyData === \"k\") {\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"tui.select.down\") || keyData === \"j\") {\n\t\t\tthis.selectedIndex = Math.min(this.items.length - 1, this.selectedIndex + 1);\n\t\t\tthis.updateList();\n\t\t} else if (keyData === \" \") {\n\t\t\tconst selected = this.items[this.selectedIndex];\n\t\t\tif (selected) this.onToggleCallback(selected.name);\n\t\t} else if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t}\n}\n"]}
@@ -43,8 +43,10 @@ export class McpSelectorComponent extends Container {
43
43
  switch (status) {
44
44
  case "connected":
45
45
  return theme.fg("success", "connected");
46
+ case "reconnecting":
47
+ return theme.fg("warning", "reconnecting...");
46
48
  case "disconnected":
47
- return theme.fg("warning", "disconnected");
49
+ return theme.fg("error", "disconnected");
48
50
  case "disabled":
49
51
  return theme.fg("muted", "disabled");
50
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/mcp-selector.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Interactive selector component for managing items (MCP servers, skills, etc).\n * Shows items with status, Space toggles, Esc closes.\n */\n\nimport { Container, getKeybindings, Spacer, Text } from \"@openeryc/pi-tui\";\nimport { theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyHint, rawKeyHint } from \"./keybinding-hints.ts\";\n\nexport interface McpServerItem {\n\tname: string;\n\tstatus: \"connected\" | \"disconnected\" | \"disabled\";\n\ttoolCount: number;\n\ttransport: string;\n}\n\nexport class McpSelectorComponent extends Container {\n\tprivate items: McpServerItem[];\n\tprivate selectedIndex = 0;\n\tprivate listContainer: Container;\n\tprivate onToggleCallback: (name: string) => void;\n\tprivate onCancelCallback: () => void;\n\tprivate hintText: Text;\n\tprivate itemsText: Text;\n\n\tconstructor(title: string, servers: McpServerItem[], onToggle: (name: string) => void, onCancel: () => void) {\n\t\tsuper();\n\n\t\tthis.items = servers;\n\t\tthis.onToggleCallback = onToggle;\n\t\tthis.onCancelCallback = onCancel;\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"accent\", theme.bold(title)), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.hintText = new Text(theme.fg(\"dim\", \"Space = toggle | Esc = close\"), 1, 0);\n\t\tthis.addChild(this.hintText);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.itemsText = new Text(\n\t\t\trawKeyHint(\"↑↓\", \"navigate\") +\n\t\t\t\t\" \" +\n\t\t\t\trawKeyHint(\"Space\", \"toggle\") +\n\t\t\t\t\" \" +\n\t\t\t\tkeyHint(\"tui.select.cancel\", \"close\"),\n\t\t\t1,\n\t\t\t0,\n\t\t);\n\t\tthis.addChild(this.itemsText);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.updateList();\n\t}\n\n\tprivate statusColor(status: McpServerItem[\"status\"]): string {\n\t\tswitch (status) {\n\t\t\tcase \"connected\":\n\t\t\t\treturn theme.fg(\"success\", \"connected\");\n\t\t\tcase \"disconnected\":\n\t\t\t\treturn theme.fg(\"warning\", \"disconnected\");\n\t\t\tcase \"disabled\":\n\t\t\t\treturn theme.fg(\"muted\", \"disabled\");\n\t\t}\n\t}\n\n\tupdateList(): void {\n\t\tthis.listContainer.clear();\n\t\tfor (let i = 0; i < this.items.length; i++) {\n\t\t\tconst item = this.items[i];\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst status = this.statusColor(item.status);\n\t\t\tconst info = `(${status} | ${item.transport}${item.toolCount > 0 ? ` | ${item.toolCount} tools` : \"\"})`;\n\t\t\tconst text = isSelected\n\t\t\t\t? `${theme.fg(\"accent\", \"→ \") + theme.fg(\"accent\", theme.bold(item.name))} ${info}`\n\t\t\t\t: ` ${theme.fg(\"text\", item.name)} ${theme.fg(\"dim\", info)}`;\n\t\t\tthis.listContainer.addChild(new Text(text, 1, 0));\n\t\t}\n\t}\n\n\tsetItems(items: McpServerItem[]): void {\n\t\tthis.items = items;\n\t\tthis.selectedIndex = Math.min(this.selectedIndex, Math.max(0, items.length - 1));\n\t\tthis.updateList();\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(keyData, \"tui.select.up\") || keyData === \"k\") {\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"tui.select.down\") || keyData === \"j\") {\n\t\t\tthis.selectedIndex = Math.min(this.items.length - 1, this.selectedIndex + 1);\n\t\t\tthis.updateList();\n\t\t} else if (keyData === \" \") {\n\t\t\tconst selected = this.items[this.selectedIndex];\n\t\t\tif (selected) this.onToggleCallback(selected.name);\n\t\t} else if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"mcp-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/mcp-selector.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Interactive selector component for managing items (MCP servers, skills, etc).\n * Shows items with status, Space toggles, Esc closes.\n */\n\nimport { Container, getKeybindings, Spacer, Text } from \"@openeryc/pi-tui\";\nimport { theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyHint, rawKeyHint } from \"./keybinding-hints.ts\";\n\nexport interface McpServerItem {\n\tname: string;\n\tstatus: \"connected\" | \"disconnected\" | \"disabled\" | \"reconnecting\";\n\ttoolCount: number;\n\ttransport: string;\n}\n\nexport class McpSelectorComponent extends Container {\n\tprivate items: McpServerItem[];\n\tprivate selectedIndex = 0;\n\tprivate listContainer: Container;\n\tprivate onToggleCallback: (name: string) => void;\n\tprivate onCancelCallback: () => void;\n\tprivate hintText: Text;\n\tprivate itemsText: Text;\n\n\tconstructor(title: string, servers: McpServerItem[], onToggle: (name: string) => void, onCancel: () => void) {\n\t\tsuper();\n\n\t\tthis.items = servers;\n\t\tthis.onToggleCallback = onToggle;\n\t\tthis.onCancelCallback = onCancel;\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"accent\", theme.bold(title)), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.hintText = new Text(theme.fg(\"dim\", \"Space = toggle | Esc = close\"), 1, 0);\n\t\tthis.addChild(this.hintText);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.itemsText = new Text(\n\t\t\trawKeyHint(\"↑↓\", \"navigate\") +\n\t\t\t\t\" \" +\n\t\t\t\trawKeyHint(\"Space\", \"toggle\") +\n\t\t\t\t\" \" +\n\t\t\t\tkeyHint(\"tui.select.cancel\", \"close\"),\n\t\t\t1,\n\t\t\t0,\n\t\t);\n\t\tthis.addChild(this.itemsText);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.updateList();\n\t}\n\n\tprivate statusColor(status: McpServerItem[\"status\"]): string {\n\t\tswitch (status) {\n\t\t\tcase \"connected\":\n\t\t\t\treturn theme.fg(\"success\", \"connected\");\n\t\t\tcase \"reconnecting\":\n\t\t\t\treturn theme.fg(\"warning\", \"reconnecting...\");\n\t\t\tcase \"disconnected\":\n\t\t\t\treturn theme.fg(\"error\", \"disconnected\");\n\t\t\tcase \"disabled\":\n\t\t\t\treturn theme.fg(\"muted\", \"disabled\");\n\t\t}\n\t}\n\n\tupdateList(): void {\n\t\tthis.listContainer.clear();\n\t\tfor (let i = 0; i < this.items.length; i++) {\n\t\t\tconst item = this.items[i];\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst status = this.statusColor(item.status);\n\t\t\tconst info = `(${status} | ${item.transport}${item.toolCount > 0 ? ` | ${item.toolCount} tools` : \"\"})`;\n\t\t\tconst text = isSelected\n\t\t\t\t? `${theme.fg(\"accent\", \"→ \") + theme.fg(\"accent\", theme.bold(item.name))} ${info}`\n\t\t\t\t: ` ${theme.fg(\"text\", item.name)} ${theme.fg(\"dim\", info)}`;\n\t\t\tthis.listContainer.addChild(new Text(text, 1, 0));\n\t\t}\n\t}\n\n\tsetItems(items: McpServerItem[]): void {\n\t\tthis.items = items;\n\t\tthis.selectedIndex = Math.min(this.selectedIndex, Math.max(0, items.length - 1));\n\t\tthis.updateList();\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(keyData, \"tui.select.up\") || keyData === \"k\") {\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"tui.select.down\") || keyData === \"j\") {\n\t\t\tthis.selectedIndex = Math.min(this.items.length - 1, this.selectedIndex + 1);\n\t\t\tthis.updateList();\n\t\t} else if (keyData === \" \") {\n\t\t\tconst selected = this.items[this.selectedIndex];\n\t\t\tif (selected) this.onToggleCallback(selected.name);\n\t\t} else if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t}\n}\n"]}