@openeryc/pi-coding-agent 0.75.49 → 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.
- package/CHANGELOG.md +8 -0
- package/dist/core/agent-session.d.ts +9 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +20 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/mcp/client.d.ts +6 -0
- package/dist/core/mcp/client.d.ts.map +1 -1
- package/dist/core/mcp/client.js +63 -30
- package/dist/core/mcp/client.js.map +1 -1
- package/dist/core/mcp/manager.d.ts +21 -1
- package/dist/core/mcp/manager.d.ts.map +1 -1
- package/dist/core/mcp/manager.js +186 -57
- package/dist/core/mcp/manager.js.map +1 -1
- package/dist/core/mcp/types.d.ts +12 -0
- package/dist/core/mcp/types.d.ts.map +1 -1
- package/dist/core/mcp/types.js +3 -0
- package/dist/core/mcp/types.js.map +1 -1
- package/dist/core/settings-manager.d.ts +5 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/modes/interactive/components/mcp-selector.d.ts +1 -1
- package/dist/modes/interactive/components/mcp-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/mcp-selector.js +3 -1
- package/dist/modes/interactive/components/mcp-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +9 -15
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +12 -12
- 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;
|
|
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("
|
|
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":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAS5D,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IAC1C,KAAK,CAAkB;IACvB,aAAa,GAAG,CAAC,CAAC;IAClB,aAAa,CAAY;IACzB,gBAAgB,CAAyB;IACzC,gBAAgB,CAAa;IAC7B,QAAQ,CAAO;IACf,SAAS,CAAO;IAExB,YAAY,KAAa,EAAE,OAAwB,EAAE,QAAgC,EAAE,QAAoB,EAAE;QAC5G,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;QACjC,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;QAEjC,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7B,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,gCAAgC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAClF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7B,IAAI,CAAC,aAAa,GAAG,IAAI,SAAS,EAAE,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7B,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,CACxB,UAAU,CAAC,QAAI,EAAE,UAAU,CAAC;YAC3B,IAAI;YACJ,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC;YAC7B,IAAI;YACJ,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,EACtC,CAAC,EACD,CAAC,CACD,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QAEnC,IAAI,CAAC,UAAU,EAAE,CAAC;IAAA,CAClB;IAEO,WAAW,CAAC,MAA+B,EAAU;QAC5D,QAAQ,MAAM,EAAE,CAAC;YAChB,KAAK,WAAW;gBACf,OAAO,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACzC,KAAK,cAAc;gBAClB,OAAO,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;
|
|
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"]}
|